From cc191f2f01fba0694ba09391d43c172e9dcd2978 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 09:55:22 +0800 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs b/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs index b463ccf3..d2bbfbfa 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs @@ -13,7 +13,7 @@ namespace BootstrapBlazor.OpcDa; /// OPC Server 操作类 /// [SupportedOSPlatform("windows")] -class OpcServer : IOpcServer +sealed class OpcServer : IOpcServer { private Opc.Da.Server? _server = null; private readonly ConcurrentDictionary> _valuesCache = []; @@ -54,7 +54,7 @@ public void Disconnect() { ServerName = string.Empty; - if (_server != null && _server.IsConnected) + if (_server is { IsConnected: true }) { foreach (Subscription sub in _server.Subscriptions) { @@ -127,7 +127,7 @@ public HashSet Write(params HashSet items) private Opc.Da.Server GetOpcServer() { - if (_server == null) + if (_server is not { IsConnected: true }) { throw new InvalidOperationException("OPC Server is not connected."); } @@ -138,7 +138,7 @@ private Opc.Da.Server GetOpcServer() /// Dispose 方法 /// /// - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { From 01b9b6480c40854cce4431750b121b29dcc74c89 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 09:55:44 +0800 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs b/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs index 3c7e222e..9922eafc 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs @@ -21,7 +21,7 @@ public void AddItems(IEnumerable items) subscription.DataChanged += (_, _, values) => { - var items = values.Select(i => + var valueList = values.Select(i => { var item = new OpcReadItem() { @@ -32,16 +32,16 @@ public void AddItems(IEnumerable items) }; if (KeepLastValue) { - var v = _cache.Find(i => i.Name == item.Name); + var v = _cache.Find(opcItem => opcItem.Name == item.Name); item.LastValue = v.Value; } return item; }).ToList(); _cache.Clear(); - _cache.AddRange(items); + _cache.AddRange(valueList); - DataChanged?.Invoke(items); + DataChanged?.Invoke(valueList); }; } } From e4cb7aa063f8decaf6f3df12eb48bec55050f919 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 13:06:47 +0800 Subject: [PATCH 3/8] chore: bump vesion 9.0.0 --- .../BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj b/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj index a490932d..9e4406b5 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj +++ b/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj @@ -1,7 +1,7 @@  - 9.0.0-beta01 + 9.0.0 BootstrapBlazor.OpcDa From 94bdbb34b57e8302f3ae3a943233375930c7c86c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 13:07:23 +0800 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20IOpcSubscr?= =?UTF-8?q?iption=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/Extensions.cs | 8 +++-- .../BootstrapBlazor.OpcDa/IOpcServer.cs | 4 +-- .../{ISubscription.cs => IOpcSubscription.cs} | 13 ++++---- .../BootstrapBlazor.OpcDa/OpcServer.cs | 33 ++++++++++++------- .../BootstrapBlazor.OpcDa/OpcSubscription.cs | 5 +-- 5 files changed, 38 insertions(+), 25 deletions(-) rename src/extensions/BootstrapBlazor.OpcDa/{ISubscription.cs => IOpcSubscription.cs} (83%) diff --git a/src/extensions/BootstrapBlazor.OpcDa/Extensions/Extensions.cs b/src/extensions/BootstrapBlazor.OpcDa/Extensions/Extensions.cs index ccc0e604..1e29ec9a 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/Extensions/Extensions.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/Extensions/Extensions.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ +using Opc.Da; + namespace BootstrapBlazor.OpcDa; /// @@ -11,13 +13,15 @@ internal static class Extensions { public static Quality ToQuality(this Opc.Da.Quality quality) { - return quality.QualityBits == Opc.Da.qualityBits.good + return quality.QualityBits == qualityBits.good ? Quality.Good : Quality.Bad; } - public static ISubscription ToOpcSubscription(this Opc.Da.ISubscription subscription) + public static IOpcSubscription ToOpcSubscription(this ISubscription subscription) { return new OpcSubscription(subscription); } + + 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 }); } diff --git a/src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs b/src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs index 344fcbd0..1ba08919 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs @@ -35,7 +35,7 @@ public interface IOpcServer : IDisposable /// 取消订阅方法 /// /// - void CancelSubscription(ISubscription subscription); + void CancelSubscription(IOpcSubscription subscription); /// /// 创建订阅方法 @@ -44,7 +44,7 @@ public interface IOpcServer : IDisposable /// 更新频率 默认 1000 毫秒 /// 是否激活 默认 true /// - ISubscription CreateSubscription(string name, int updateRate = 1000, bool active = true); + IOpcSubscription CreateSubscription(string name, int updateRate = 1000, bool active = true); /// /// 读取 Item 值方法 diff --git a/src/extensions/BootstrapBlazor.OpcDa/ISubscription.cs b/src/extensions/BootstrapBlazor.OpcDa/IOpcSubscription.cs similarity index 83% rename from src/extensions/BootstrapBlazor.OpcDa/ISubscription.cs rename to src/extensions/BootstrapBlazor.OpcDa/IOpcSubscription.cs index 9ba1241e..db2c8535 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/ISubscription.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/IOpcSubscription.cs @@ -7,8 +7,13 @@ namespace BootstrapBlazor.OpcDa; /// /// 订阅接口定义 /// -public interface ISubscription +public interface IOpcSubscription { + /// + /// 获得 订阅名称 + /// + public string Name { get; } + /// /// 获得/设置 是否保留最后一个值 /// @@ -19,12 +24,6 @@ public interface ISubscription /// Action>? DataChanged { get; set; } - /// - /// 获得 实例 - /// - /// - Opc.Da.ISubscription GetSubscription(); - /// /// 增加数据项 /// diff --git a/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs b/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs index d2bbfbfa..43804d25 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs @@ -28,6 +28,8 @@ sealed class OpcServer : IOpcServer /// public bool IsConnected => _server?.IsConnected ?? false; + private readonly Dictionary _subscriptions = []; + /// /// 连接到 OPCServer 方法 /// @@ -60,6 +62,7 @@ public void Disconnect() { _server.CancelSubscription(sub); } + _server.Disconnect(); _server = null; } @@ -72,28 +75,33 @@ public void Disconnect() /// 更新频率 默认 1000 毫秒 /// 是否激活 默认 true /// - public ISubscription CreateSubscription(string name, int updateRate = 1000, bool active = true) + public IOpcSubscription CreateSubscription(string name, int updateRate = 1000, bool active = true) { var server = GetOpcServer(); - var subscription = server.CreateSubscription(new SubscriptionState + if (_subscriptions.TryGetValue(name, out var subscription)) { - Name = name, - Deadband = 0, - UpdateRate = updateRate, - Active = active - }); + // 已经存在该订阅 + server.CancelSubscription(subscription); + } + + subscription = server.CreateSubscription(name, updateRate, active); + _subscriptions.Add(name, subscription); return subscription.ToOpcSubscription(); } /// /// 取消订阅方法 /// - /// 订阅接口 实例 + /// 订阅接口 实例 /// - public void CancelSubscription(ISubscription subscription) + public void CancelSubscription(IOpcSubscription subscription) { var server = GetOpcServer(); - server.CancelSubscription(subscription.GetSubscription()); + var name = subscription.Name; + if (_subscriptions.Remove(name, out var sub)) + { + server.CancelSubscription(sub); + } } /// @@ -121,16 +129,17 @@ public HashSet Write(params HashSet items) return items.Select(i => { var item = results.FirstOrDefault(v => v.ItemName == i.Name); - return new OpcWriteItem(i.Name, i.Value) { Result = item != null && item.ResultID == ResultID.S_OK }; + return i with { Result = item != null && item.ResultID == ResultID.S_OK }; }).ToHashSet(OpcItemEqualityComparer.Default); } private Opc.Da.Server GetOpcServer() { - if (_server is not { IsConnected: true }) + if (_server is not { IsConnected: true }) { throw new InvalidOperationException("OPC Server is not connected."); } + return _server; } diff --git a/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs b/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs index 9922eafc..6723faa7 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs @@ -4,19 +4,20 @@ namespace BootstrapBlazor.OpcDa; -class OpcSubscription(Opc.Da.ISubscription subscription) : ISubscription +class OpcSubscription(Opc.Da.ISubscription subscription) : IOpcSubscription { public Action>? DataChanged { get; set; } public bool KeepLastValue { get; set; } + public string Name => subscription.GetState().Name; + public Opc.Da.ISubscription GetSubscription() => subscription; private readonly List _cache = []; public void AddItems(IEnumerable items) { - var subscription = GetSubscription(); subscription.AddItems([.. items.Select(i => new Opc.Da.Item { ItemName = i })]); subscription.DataChanged += (_, _, values) => From 31682fb6868b821e5f7b68920fa4c2bb356fbc16 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 17:41:40 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20MockOpcDaServe?= =?UTF-8?q?r=20=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.OpcDa.csproj | 2 +- .../Extensions/ServiceCollectionExtensions.cs | 17 +++- .../{IOpcServer.cs => IOpcDaServer.cs} | 2 +- .../Mock/MockOpcDaServer.cs | 67 +++++++++++++++ .../Mock/MockOpcSubscription.cs | 84 +++++++++++++++++++ .../{OpcServer.cs => OpcDaServer.cs} | 2 +- 6 files changed, 168 insertions(+), 6 deletions(-) rename src/extensions/BootstrapBlazor.OpcDa/{IOpcServer.cs => IOpcDaServer.cs} (97%) create mode 100644 src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs create mode 100644 src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs rename src/extensions/BootstrapBlazor.OpcDa/{OpcServer.cs => OpcDaServer.cs} (99%) diff --git a/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj b/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj index 9e4406b5..3d27785e 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj +++ b/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj @@ -1,7 +1,7 @@  - 9.0.0 + 9.0.0-beta02 BootstrapBlazor.OpcDa diff --git a/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs b/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs index bf5db6fb..f0041faa 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs @@ -13,14 +13,25 @@ namespace Microsoft.Extensions.DependencyInjection; public static class ServiceCollectionExtensions { /// - /// 增加 Opc 操作服务 + /// 增加 OpcDaServer 操作服务 /// /// /// [SupportedOSPlatform("windows")] - public static IServiceCollection AddOpcServer(this IServiceCollection services) + public static IServiceCollection AddOpcDaServer(this IServiceCollection services) { - services.AddSingleton(); + services.AddSingleton(); + return services; + } + + /// + /// 增加模拟 OpcDaServer 操作服务 + /// + /// + /// + public static IServiceCollection AddMockOpcDaServer(this IServiceCollection services) + { + services.AddSingleton(); return services; } } diff --git a/src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs b/src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs similarity index 97% rename from src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs rename to src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs index 1ba08919..7dba8b56 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/IOpcServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs @@ -7,7 +7,7 @@ namespace BootstrapBlazor.OpcDa; /// /// Opc Server 接口定义 /// -public interface IOpcServer : IDisposable +public interface IOpcDaServer : IDisposable { /// /// 获得 OPC Server 是否已连接 diff --git a/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs new file mode 100644 index 00000000..58ce65c8 --- /dev/null +++ b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs @@ -0,0 +1,67 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ + +namespace BootstrapBlazor.OpcDa; + +/// +/// 模拟 OpcDa Server 实现类 +/// +sealed class MockOpcDaServer : IOpcDaServer +{ + public bool IsConnected { get; set; } + + public string? ServerName { get; set; } + + private readonly Dictionary _subscriptions = []; + + public bool Connect(string serverName) + { + ServerName = serverName; + IsConnected = true; + return true; + } + + public void Disconnect() + { + IsConnected = false; + ServerName = null; + } + + public IOpcSubscription CreateSubscription(string name, int updateRate = 1000, bool active = true) + { + if (_subscriptions.TryGetValue(name, out var subscription)) + { + CancelSubscription(subscription); + } + + subscription = new MockOpcDaSubscription(name, updateRate, active); + _subscriptions.Add(name, subscription); + return subscription; + } + + public void CancelSubscription(IOpcSubscription subscription) + { + _subscriptions.Remove(subscription.Name); + if (subscription is IDisposable disposable) + { + disposable.Dispose(); + } + } + + public HashSet Read(params HashSet items) + { + return items.Select(i => new OpcReadItem(i, Quality.Good, DateTime.Now, Random.Shared.Next(1000, 2000))) + .ToHashSet(OpcItemEqualityComparer.Default); + } + + public HashSet Write(params HashSet items) + { + return items.Select(i => new OpcWriteItem(i.Name, i.Value) { Result = true }) + .ToHashSet(OpcItemEqualityComparer.Default); + } + + public void Dispose() + { + } +} diff --git a/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs new file mode 100644 index 00000000..f08f8db0 --- /dev/null +++ b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs @@ -0,0 +1,84 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ + +namespace BootstrapBlazor.OpcDa; + +sealed class MockOpcDaSubscription : IOpcSubscription, IDisposable +{ + private readonly int _updateRate; + private readonly bool _active; + private readonly List _items = []; + private CancellationTokenSource? _cts; + + public MockOpcDaSubscription(string name, int updateRate = 1000, bool active = true) + { + Name = name; + _updateRate = updateRate; + _active = active; + + _cts = new CancellationTokenSource(); + _ = Task.Run(() => DoTask(_cts.Token)); + } + + public string Name { get; } + + public bool KeepLastValue { get; set; } + + public Action>? DataChanged { get; set; } + + public void AddItems(IEnumerable items) + { + _items.AddRange(items); + } + + private void UpdateValues() + { + if (DataChanged != null) + { + var values = _items.Select(i => new OpcReadItem(i, Quality.Good, DateTime.Now, Random.Shared.Next(1000, 2000))).ToList(); + DataChanged.Invoke(values); + } + } + + private async Task DoTask(CancellationToken token) + { + do + { + try + { + if (_active) + { + UpdateValues(); + } + + await Task.Delay(_updateRate, token); + } + catch (OperationCanceledException) { } + catch (Exception) + { + // ignored + } + } + while (!token.IsCancellationRequested); + } + + private void Dispose(bool disposing) + { + if (disposing) + { + if (_cts != null) + { + _cts.Cancel(); + _cts.Dispose(); + _cts = null; + } + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } +} diff --git a/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs b/src/extensions/BootstrapBlazor.OpcDa/OpcDaServer.cs similarity index 99% rename from src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs rename to src/extensions/BootstrapBlazor.OpcDa/OpcDaServer.cs index 43804d25..a1cc46e5 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/OpcServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/OpcDaServer.cs @@ -13,7 +13,7 @@ namespace BootstrapBlazor.OpcDa; /// OPC Server 操作类 /// [SupportedOSPlatform("windows")] -sealed class OpcServer : IOpcServer +sealed class OpcDaServer : IOpcDaServer { private Opc.Da.Server? _server = null; private readonly ConcurrentDictionary> _valuesCache = []; From 8c17d57456808540ea96b6c0d643b38b3b034ecf Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 17:41:50 +0800 Subject: [PATCH 6/8] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTestOpcDa/UnitTest1.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/UnitTestOpcDa/UnitTest1.cs b/test/UnitTestOpcDa/UnitTest1.cs index 27911ec6..1e3e5580 100644 --- a/test/UnitTestOpcDa/UnitTest1.cs +++ b/test/UnitTestOpcDa/UnitTest1.cs @@ -15,10 +15,10 @@ public class UnitTest1 public void Write_Ok() { var sc = new ServiceCollection(); - sc.AddOpcServer(); + sc.AddOpcDaServer(); var sp = sc.BuildServiceProvider(); - var server = sp.GetRequiredService(); + var server = sp.GetRequiredService(); var ret = server.Connect("opcda://localhost/Kepware.KEPServerEX.V6"); Assert.True(ret); Assert.True(server.IsConnected); @@ -46,10 +46,10 @@ public void Write_Ok() public async Task Subscription_Ok() { var sc = new ServiceCollection(); - sc.AddOpcServer(); + sc.AddOpcDaServer(); var sp = sc.BuildServiceProvider(); - var server = sp.GetRequiredService(); + var server = sp.GetRequiredService(); server.Connect("opcda://localhost/Kepware.KEPServerEX.V6"); var subscription = server.CreateSubscription("Test", 100); From 7930e9890a1da9eb617609078490b6fac64b0834 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 17:58:57 +0800 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20=E4=BB=A3=E7=A0=81=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ServiceCollectionExtensions.cs | 2 +- src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs | 2 +- .../BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs | 7 ++++--- .../BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs | 5 ++--- src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs b/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs index f0041faa..d374c569 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/Extensions/ServiceCollectionExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.Extensions.DependencyInjection; /// -/// Opc Da 服务扩展类 +/// OpcDaServer 服务扩展类 /// public static class ServiceCollectionExtensions { diff --git a/src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs b/src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs index 7dba8b56..26f015b0 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/IOpcDaServer.cs @@ -5,7 +5,7 @@ namespace BootstrapBlazor.OpcDa; /// -/// Opc Server 接口定义 +/// OpcDaServer 接口定义 /// public interface IOpcDaServer : IDisposable { diff --git a/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs index 58ce65c8..1af8d610 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcDaServer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ @@ -52,16 +52,17 @@ public void CancelSubscription(IOpcSubscription subscription) public HashSet Read(params HashSet items) { return items.Select(i => new OpcReadItem(i, Quality.Good, DateTime.Now, Random.Shared.Next(1000, 2000))) - .ToHashSet(OpcItemEqualityComparer.Default); + .ToHashSet(OpcItemEqualityComparer.Default); } public HashSet Write(params HashSet items) { return items.Select(i => new OpcWriteItem(i.Name, i.Value) { Result = true }) - .ToHashSet(OpcItemEqualityComparer.Default); + .ToHashSet(OpcItemEqualityComparer.Default); } public void Dispose() { + } } diff --git a/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs index f08f8db0..a2959cbc 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/Mock/MockOpcSubscription.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ @@ -54,8 +54,7 @@ private async Task DoTask(CancellationToken token) await Task.Delay(_updateRate, token); } - catch (OperationCanceledException) { } - catch (Exception) + catch (OperationCanceledException) { // ignored } diff --git a/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs b/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs index 6723faa7..46822c9b 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs +++ b/src/extensions/BootstrapBlazor.OpcDa/OpcSubscription.cs @@ -4,7 +4,7 @@ namespace BootstrapBlazor.OpcDa; -class OpcSubscription(Opc.Da.ISubscription subscription) : IOpcSubscription +sealed class OpcSubscription(Opc.Da.ISubscription subscription) : IOpcSubscription { public Action>? DataChanged { get; set; } From 6738102f202286f35970ee9c4c2e462e659ee844 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 6 Aug 2025 17:59:06 +0800 Subject: [PATCH 8/8] chore: bump version 9.0.0 --- .../BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj b/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj index 3d27785e..6b2d13dc 100644 --- a/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj +++ b/src/extensions/BootstrapBlazor.OpcDa/BootstrapBlazor.OpcDa.csproj @@ -1,13 +1,13 @@  - 9.0.0-beta02 + 9.0.0 BootstrapBlazor.OpcDa - Bootstrap Blazor WebAssembly wasm UI Components SqlSugar - Bootstrap UI components extensions of SqlSugar + Bootstrap Blazor WebAssembly wasm UI Components OpcDa PLC + Bootstrap UI components extensions of OpcDaServer