Skip to content

Commit d2b6bce

Browse files
committed
feat: 实现订阅数据回调功能
1 parent 2480fdf commit d2b6bce

2 files changed

Lines changed: 49 additions & 3 deletions

File tree

src/extensions/BootstrapBlazor.OpcDa/ISubscription.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,24 @@ namespace BootstrapBlazor.OpcDa;
1010
public interface ISubscription
1111
{
1212
/// <summary>
13-
/// 数据变更回调
13+
/// 获得/设置 是否保留最后一个值
1414
/// </summary>
15-
Func<List<OpcReadItem>>? DataChanged { get; set; }
15+
public bool KeepLastValue { get; set; }
16+
17+
/// <summary>
18+
/// 获得/设置 数据变更回调
19+
/// </summary>
20+
Func<List<OpcReadItem>, Task>? DataChanged { get; set; }
1621

1722
/// <summary>
1823
/// 获得 <see cref="Opc.Da.ISubscription"/> 实例
1924
/// </summary>
2025
/// <returns></returns>
2126
Opc.Da.ISubscription GetSubscription();
27+
28+
/// <summary>
29+
/// 增加数据项
30+
/// </summary>
31+
/// <param name="items"></param>
32+
void AddItems(IEnumerable<string> items);
2233
}

src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,42 @@ namespace BootstrapBlazor.OpcDa;
66

77
class OpcSubscription(Opc.Da.ISubscription subscription) : ISubscription
88
{
9-
public Func<List<OpcReadItem>>? DataChanged { get; set; }
9+
public Func<List<OpcReadItem>, Task>? DataChanged { get; set; }
10+
11+
public bool KeepLastValue { get; set; }
1012

1113
public Opc.Da.ISubscription GetSubscription() => subscription;
14+
15+
private readonly List<OpcReadItem> _cache = [];
16+
17+
public void AddItems(IEnumerable<string> items)
18+
{
19+
var subscription = GetSubscription();
20+
subscription.AddItems([.. items.Select(i => new Opc.Da.Item { ItemName = i })]);
21+
22+
subscription.DataChanged += (_, _, values) =>
23+
{
24+
var items = values.Select(i =>
25+
{
26+
var item = new OpcReadItem()
27+
{
28+
Name = i.ItemName,
29+
Value = i.Value,
30+
Quality = i.Quality == Opc.Da.Quality.Good ? Quality.Good : Quality.Bad,
31+
Timestamp = i.Timestamp
32+
};
33+
if (KeepLastValue)
34+
{
35+
var v = _cache.Find(i => i.Name == item.Name);
36+
item.LastValue = v.Value;
37+
}
38+
return item;
39+
}).ToList();
40+
41+
_cache.Clear();
42+
_cache.AddRange(items);
43+
44+
DataChanged?.Invoke(items);
45+
};
46+
}
1247
}

0 commit comments

Comments
 (0)