Skip to content

Commit 94bdbb3

Browse files
committed
refactor: 增加 IOpcSubscription 接口
1 parent e4cb7aa commit 94bdbb3

5 files changed

Lines changed: 38 additions & 25 deletions

File tree

src/extensions/BootstrapBlazor.OpcDa/Extensions/Extensions.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
// Website: https://www.blazor.zone or https://argozhang.github.io/
44

5+
using Opc.Da;
6+
57
namespace BootstrapBlazor.OpcDa;
68

79
/// <summary>
@@ -11,13 +13,15 @@ internal static class Extensions
1113
{
1214
public static Quality ToQuality(this Opc.Da.Quality quality)
1315
{
14-
return quality.QualityBits == Opc.Da.qualityBits.good
16+
return quality.QualityBits == qualityBits.good
1517
? Quality.Good
1618
: Quality.Bad;
1719
}
1820

19-
public static ISubscription ToOpcSubscription(this Opc.Da.ISubscription subscription)
21+
public static IOpcSubscription ToOpcSubscription(this ISubscription subscription)
2022
{
2123
return new OpcSubscription(subscription);
2224
}
25+
26+
public static ISubscription CreateSubscription(this Server server, string name, int updateRate = 1000, bool active = true) => server.CreateSubscription(new SubscriptionState { Name = name, Deadband = 0, UpdateRate = updateRate, Active = active });
2327
}

src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public interface IOpcServer : IDisposable
3535
/// 取消订阅方法
3636
/// </summary>
3737
/// <param name="subscription"></param>
38-
void CancelSubscription(ISubscription subscription);
38+
void CancelSubscription(IOpcSubscription subscription);
3939

4040
/// <summary>
4141
/// 创建订阅方法
@@ -44,7 +44,7 @@ public interface IOpcServer : IDisposable
4444
/// <param name="updateRate">更新频率 默认 1000 毫秒</param>
4545
/// <param name="active">是否激活 默认 true</param>
4646
/// <returns></returns>
47-
ISubscription CreateSubscription(string name, int updateRate = 1000, bool active = true);
47+
IOpcSubscription CreateSubscription(string name, int updateRate = 1000, bool active = true);
4848

4949
/// <summary>
5050
/// 读取 Item 值方法

src/extensions/BootstrapBlazor.OpcDa/ISubscription.cs renamed to src/extensions/BootstrapBlazor.OpcDa/IOpcSubscription.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ namespace BootstrapBlazor.OpcDa;
77
/// <summary>
88
/// 订阅接口定义
99
/// </summary>
10-
public interface ISubscription
10+
public interface IOpcSubscription
1111
{
12+
/// <summary>
13+
/// 获得 订阅名称
14+
/// </summary>
15+
public string Name { get; }
16+
1217
/// <summary>
1318
/// 获得/设置 是否保留最后一个值
1419
/// </summary>
@@ -19,12 +24,6 @@ public interface ISubscription
1924
/// </summary>
2025
Action<List<OpcReadItem>>? DataChanged { get; set; }
2126

22-
/// <summary>
23-
/// 获得 <see cref="Opc.Da.ISubscription"/> 实例
24-
/// </summary>
25-
/// <returns></returns>
26-
Opc.Da.ISubscription GetSubscription();
27-
2827
/// <summary>
2928
/// 增加数据项
3029
/// </summary>

src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ sealed class OpcServer : IOpcServer
2828
/// </summary>
2929
public bool IsConnected => _server?.IsConnected ?? false;
3030

31+
private readonly Dictionary<string, ISubscription> _subscriptions = [];
32+
3133
/// <summary>
3234
/// 连接到 OPCServer 方法
3335
/// </summary>
@@ -60,6 +62,7 @@ public void Disconnect()
6062
{
6163
_server.CancelSubscription(sub);
6264
}
65+
6366
_server.Disconnect();
6467
_server = null;
6568
}
@@ -72,28 +75,33 @@ public void Disconnect()
7275
/// <param name="updateRate">更新频率 默认 1000 毫秒</param>
7376
/// <param name="active">是否激活 默认 true</param>
7477
/// <returns></returns>
75-
public ISubscription CreateSubscription(string name, int updateRate = 1000, bool active = true)
78+
public IOpcSubscription CreateSubscription(string name, int updateRate = 1000, bool active = true)
7679
{
7780
var server = GetOpcServer();
78-
var subscription = server.CreateSubscription(new SubscriptionState
81+
if (_subscriptions.TryGetValue(name, out var subscription))
7982
{
80-
Name = name,
81-
Deadband = 0,
82-
UpdateRate = updateRate,
83-
Active = active
84-
});
83+
// 已经存在该订阅
84+
server.CancelSubscription(subscription);
85+
}
86+
87+
subscription = server.CreateSubscription(name, updateRate, active);
88+
_subscriptions.Add(name, subscription);
8589
return subscription.ToOpcSubscription();
8690
}
8791

8892
/// <summary>
8993
/// 取消订阅方法
9094
/// </summary>
91-
/// <param name="subscription">订阅接口 <see cref="ISubscription"/> 实例</param>
95+
/// <param name="subscription">订阅接口 <see cref="IOpcSubscription"/> 实例</param>
9296
/// <returns></returns>
93-
public void CancelSubscription(ISubscription subscription)
97+
public void CancelSubscription(IOpcSubscription subscription)
9498
{
9599
var server = GetOpcServer();
96-
server.CancelSubscription(subscription.GetSubscription());
100+
var name = subscription.Name;
101+
if (_subscriptions.Remove(name, out var sub))
102+
{
103+
server.CancelSubscription(sub);
104+
}
97105
}
98106

99107
/// <summary>
@@ -121,16 +129,17 @@ public HashSet<OpcWriteItem> Write(params HashSet<OpcWriteItem> items)
121129
return items.Select(i =>
122130
{
123131
var item = results.FirstOrDefault(v => v.ItemName == i.Name);
124-
return new OpcWriteItem(i.Name, i.Value) { Result = item != null && item.ResultID == ResultID.S_OK };
132+
return i with { Result = item != null && item.ResultID == ResultID.S_OK };
125133
}).ToHashSet(OpcItemEqualityComparer<OpcWriteItem>.Default);
126134
}
127135

128136
private Opc.Da.Server GetOpcServer()
129137
{
130-
if (_server is not { IsConnected: true })
138+
if (_server is not { IsConnected: true })
131139
{
132140
throw new InvalidOperationException("OPC Server is not connected.");
133141
}
142+
134143
return _server;
135144
}
136145

src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@
44

55
namespace BootstrapBlazor.OpcDa;
66

7-
class OpcSubscription(Opc.Da.ISubscription subscription) : ISubscription
7+
class OpcSubscription(Opc.Da.ISubscription subscription) : IOpcSubscription
88
{
99
public Action<List<OpcReadItem>>? DataChanged { get; set; }
1010

1111
public bool KeepLastValue { get; set; }
1212

13+
public string Name => subscription.GetState().Name;
14+
1315
public Opc.Da.ISubscription GetSubscription() => subscription;
1416

1517
private readonly List<OpcReadItem> _cache = [];
1618

1719
public void AddItems(IEnumerable<string> items)
1820
{
19-
var subscription = GetSubscription();
2021
subscription.AddItems([.. items.Select(i => new Opc.Da.Item { ItemName = i })]);
2122

2223
subscription.DataChanged += (_, _, values) =>

0 commit comments

Comments
 (0)