File tree Expand file tree Collapse file tree
src/extensions/BootstrapBlazor.OpcDa Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -10,13 +10,24 @@ namespace BootstrapBlazor.OpcDa;
1010public 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}
Original file line number Diff line number Diff line change @@ -6,7 +6,42 @@ namespace BootstrapBlazor.OpcDa;
66
77class 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}
You can’t perform that action at this time.
0 commit comments