diff --git a/Libraries/h-opc/UaClient.cs b/Libraries/h-opc/UaClient.cs index a599ca5..030d3dd 100644 --- a/Libraries/h-opc/UaClient.cs +++ b/Libraries/h-opc/UaClient.cs @@ -126,7 +126,7 @@ namespace Hylasoft.Opc.Ua } } - private void SessionClosing(object? sender, EventArgs e) + private void SessionClosing(object sender, EventArgs e) { Status = OpcStatus.NotConnected; NotifyServerConnectionLost(); diff --git a/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj b/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj index 6bbb0c0..84f11f2 100644 --- a/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj +++ b/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj @@ -1,9 +1,25 @@ - + - net6.0 - enable - enable + net6.0 + Modbus.Net.Modbus.NA200H + Modbus.Net.Modbus.NA200H + Modbus.Net.Modbus.NA200H + 1.4.0 + Chris L.(Luo Sheng) + Hangzhou Delian Science Technology Co.,Ltd. + Modbus.Net.Modbus + Modbus.Net Modbus Implementation + Copyright 2023 Hangzhou Delian Science Technology Co.,Ltd. + https://github.com/parallelbgls/Modbus.Net/tree/master/Modbus.Net/Modbus.Net.Modbus.NA200H + https://github.com/parallelbgls/Modbus.Net + git + hardware communicate protocol modbus Delian + False + True + True + True + MIT diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj index 35a6fde..6245222 100644 --- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj +++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj @@ -5,7 +5,7 @@ Modbus.Net.Modbus Modbus.Net.Modbus Modbus.Net.Modbus - 1.4.1 + 1.4.0 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net.Modbus diff --git a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj index 16ef973..299c197 100644 --- a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj +++ b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj @@ -5,7 +5,7 @@ Modbus.Net.OPC Modbus.Net.OPC Modbus.Net.OPC - 1.4.1 + 1.4.0 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net.OPC diff --git a/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs b/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs index dad7878..c25234d 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs @@ -72,16 +72,19 @@ namespace Modbus.Net.OPC } } + /// protected override void ReceiveMsgThreadStart() { throw new NotImplementedException(); } + /// protected override void ReceiveMsgThreadStop() { throw new NotImplementedException(); } + /// protected override Task SendMsgWithoutConfirm(OpcParamIn message) { throw new NotImplementedException(); diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj index bb2d6f1..93f0582 100644 --- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj +++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj @@ -5,7 +5,7 @@ Modbus.Net.Siemens Modbus.Net.Siemens Modbus.Net.Siemens - 1.4.1 + 1.4.0 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net Siemens Profinet Implementation diff --git a/Modbus.Net/Modbus.Net/Connector/TcpConnector.cs b/Modbus.Net/Modbus.Net/Connector/TcpConnector.cs index e26e3df..da790bb 100644 --- a/Modbus.Net/Modbus.Net/Connector/TcpConnector.cs +++ b/Modbus.Net/Modbus.Net/Connector/TcpConnector.cs @@ -31,8 +31,6 @@ namespace Modbus.Net private int _timeoutTime; - private bool m_disposed; - private Task _receiveThread; private bool _taskCancel = false; diff --git a/Modbus.Net/Modbus.Net/Interface/IMachine.cs b/Modbus.Net/Modbus.Net/Interface/IMachine.cs index 891b415..a1cd92e 100644 --- a/Modbus.Net/Modbus.Net/Interface/IMachine.cs +++ b/Modbus.Net/Modbus.Net/Interface/IMachine.cs @@ -2,10 +2,17 @@ namespace Modbus.Net { + /// + /// 设备的抽象 + /// public interface IMachine : IMachine { } + /// + /// 设备的抽象 + /// + /// public interface IMachine : IMachineProperty, IMachineMethodData where TKey : IEquatable { } diff --git a/Modbus.Net/Modbus.Net/Interface/IMachineProperty.cs b/Modbus.Net/Modbus.Net/Interface/IMachineProperty.cs index fc19386..435b452 100644 --- a/Modbus.Net/Modbus.Net/Interface/IMachineProperty.cs +++ b/Modbus.Net/Modbus.Net/Interface/IMachineProperty.cs @@ -65,7 +65,7 @@ namespace Modbus.Net } /// - /// 设备的抽象 + /// 设备属性的抽象 /// public interface IMachineProperty : IMachinePropertyWithoutKey where TKey : IEquatable { diff --git a/Modbus.Net/Modbus.Net/Interface/IUtility.cs b/Modbus.Net/Modbus.Net/Interface/IUtility.cs index 85a11eb..ba39e4c 100644 --- a/Modbus.Net/Modbus.Net/Interface/IUtility.cs +++ b/Modbus.Net/Modbus.Net/Interface/IUtility.cs @@ -1,5 +1,8 @@ namespace Modbus.Net { + /// + /// Api入口的抽象 + /// public interface IUtility : IUtilityProperty, IUtilityMethodData { } diff --git a/Modbus.Net/Modbus.Net/Interface/IUtilityProperty.cs b/Modbus.Net/Modbus.Net/Interface/IUtilityProperty.cs index 2752f78..97eb2df 100644 --- a/Modbus.Net/Modbus.Net/Interface/IUtilityProperty.cs +++ b/Modbus.Net/Modbus.Net/Interface/IUtilityProperty.cs @@ -3,7 +3,7 @@ namespace Modbus.Net { /// - /// Api入口的抽象 + /// Api入口的属性抽象 /// public interface IUtilityProperty { diff --git a/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs b/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs index eedfafc..abcde6a 100644 --- a/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs +++ b/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs @@ -4,12 +4,19 @@ using Serilog; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using System.Linq; namespace Modbus.Net { + /// + /// JobChaningJobListener with DataMap passing from parent job to next job + /// public class JobChainingJobListenerWithDataMap : JobListenerSupport { + /// + /// JobChaningJobListener with DataMap passing from parent job to next job + /// + /// Job name + /// If key is overwritable, parent job will pass the value to next job event next job contains that key public JobChainingJobListenerWithDataMap(string name, ICollection overwriteKeys) { Name = name; @@ -19,8 +26,12 @@ namespace Modbus.Net private readonly Dictionary chainLinks; + /// public override string Name { get; } + /// + /// Keys that should overwritable + /// public ICollection OverWriteKeys { get; } /// @@ -34,6 +45,8 @@ namespace Modbus.Net chainLinks.Add(firstJob, secondJob); } +#nullable enable + /// public override async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException? jobException, CancellationToken cancellationToken = default) @@ -50,20 +63,24 @@ namespace Modbus.Net try { var sjJobDetail = await context.Scheduler.GetJobDetail(sj); - foreach (var entry in context.JobDetail.JobDataMap) + if (sjJobDetail != null) { - if (!sjJobDetail.JobDataMap.ContainsKey(entry.Key) || sjJobDetail.JobDataMap.ContainsKey(entry.Key) && OverWriteKeys != null && OverWriteKeys.Contains(entry.Key)) + foreach (var entry in context.JobDetail.JobDataMap) { - sjJobDetail.JobDataMap.Put(entry.Key, entry.Value); + if (!sjJobDetail.JobDataMap.ContainsKey(entry.Key) || sjJobDetail.JobDataMap.ContainsKey(entry.Key) && OverWriteKeys != null && OverWriteKeys.Contains(entry.Key)) + { + sjJobDetail.JobDataMap.Put(entry.Key, entry.Value); + } } + await context.Scheduler.AddJob(sjJobDetail, true, false); + await context.Scheduler.TriggerJob(sj, cancellationToken).ConfigureAwait(false); } - await context.Scheduler.AddJob(sjJobDetail, true, false); - await context.Scheduler.TriggerJob(sj, cancellationToken).ConfigureAwait(false); } catch (SchedulerException se) { Log.Error(se, "Error encountered during chaining to Job '{Job}'", sj); } } +#nullable disable } } diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs index baff2ca..5ade084 100644 --- a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs +++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs @@ -30,13 +30,30 @@ namespace Modbus.Net public Dictionary ReturnValues { get; set; } } + /// + /// 设备调度器创建类 + /// public sealed class MachineJobSchedulerCreator { + /// + /// 创建设备调度器 + /// + /// 键,全局唯一不能重复,重复会终止并删除已存在的调度器 + /// 重复次数,负数为无限循环,0为执行一次 + /// 间隔秒数 + /// public static async Task CreateScheduler(string triggerKey, int count = 0, int intervalSecond = 1) { return await CreateScheduler(triggerKey, count, intervalSecond); } + /// + /// 创建设备调度器 + /// + /// 调度器键名,全局唯一不能重复,重复会终止并删除已存在的调度器 + /// 重复次数,负数为无限循环,0为执行一次 + /// 间隔毫秒数 + /// public static async Task CreateSchedulerMillisecond(string triggerKey, int count = 0, int intervalMilliSecond = 1000) { return await CreateScheduler(triggerKey, count, intervalMilliSecond / 1000.0); @@ -73,6 +90,11 @@ namespace Modbus.Net return new MachineGetJobScheduler(scheduler, trigger); } + /// + /// 取消并删除任务调度器 + /// + /// 调度器键名 + /// public static async Task CancelJob(string triggerKey) { IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); @@ -82,20 +104,34 @@ namespace Modbus.Net } } + /// + /// 获取数据任务 + /// public sealed class MachineGetJobScheduler { - IScheduler _scheduler; + private IScheduler _scheduler; - ITrigger _trigger; + private ITrigger _trigger; - JobKey _parentJobKey = null; + private JobKey _parentJobKey = null; + /// + /// 获取数据任务 + /// + /// 调度器 + /// 触发器 public MachineGetJobScheduler(IScheduler scheduler, ITrigger trigger) { _scheduler = scheduler; _trigger = trigger; } + /// + /// 获取数据任务 + /// + /// 调度器 + /// 触发器 + /// 父任务的键 public MachineGetJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey) { _scheduler = scheduler; @@ -103,6 +139,14 @@ namespace Modbus.Net _parentJobKey = parentJobKey; } + /// + /// 从设备获取数据 + /// + /// 任务ID,每个触发器唯一 + /// 要获取数据的设备实例 + /// 获取数据的方式 + /// + /// public async Task From(string queryId, IMachineMethodData machine, MachineDataType machineDataType) { JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); @@ -118,6 +162,7 @@ namespace Modbus.Net if (_parentJobKey != null) { var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + if (listener == null) throw new NullReferenceException("Listener " + "Modbus.Net.DataQuery.Chain." + _trigger.Key.Name + " is null"); listener.AddJobChainLink(_parentJobKey, jobKey); await _scheduler.AddJob(job, true); @@ -130,11 +175,27 @@ namespace Modbus.Net return new MachineQueryJobScheduler(_scheduler, _trigger, jobKey); } + /// + /// 直接向任务队列中写一个数据模板 + /// + /// 任务ID,每个触发器唯一 + /// 要写入的数据模板 + /// 获取数据的方式 + /// public Task Apply(string queryId, Dictionary values, MachineDataType machineDataType) { return Apply(queryId, values, machineDataType); } + /// + /// 直接向任务队列中写一个数据模板 + /// + /// 设备的ID类型 + /// 任务ID,每个触发器唯一 + /// 要写入的数据模板 + /// 获取数据的方式 + /// + /// public async Task Apply(string queryId, Dictionary values, MachineDataType machineDataType) where TMachineKey : IEquatable { JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); @@ -151,6 +212,7 @@ namespace Modbus.Net if (_parentJobKey != null) { var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + if (listener == null) throw new NullReferenceException("Listener " + "Modbus.Net.DataQuery.Chain." + _trigger.Key.Name + " is null"); listener.AddJobChainLink(_parentJobKey, jobKey); await _scheduler.AddJob(job, true); @@ -163,11 +225,27 @@ namespace Modbus.Net return new MachineQueryJobScheduler(_scheduler, _trigger, jobKey); } + /// + /// 直接向任务队列中写一个数据模板,并跳过处理数据流程 + /// + /// 任务ID,每个触发器唯一 + /// 要写入的数据模板 + /// 获取数据的方式 + /// public Task ApplyTo(string queryId, Dictionary values, MachineDataType machineDataType) { return ApplyTo(queryId, values, machineDataType); } + /// + /// 直接向任务队列中写一个数据模板,并跳过处理数据流程 + /// + /// 设备的ID类型 + /// 任务ID,每个触发器唯一 + /// 要写入的数据模板 + /// 获取数据的方式 + /// + /// public async Task ApplyTo(string queryId, Dictionary values, MachineDataType machineDataType) where TMachineKey : IEquatable { var applyJobScheduler = await Apply(queryId, values, machineDataType); @@ -175,14 +253,23 @@ namespace Modbus.Net } } + /// + /// 处理数据任务 + /// public sealed class MachineQueryJobScheduler { - IScheduler _scheduler; + private IScheduler _scheduler; - ITrigger _trigger; + private ITrigger _trigger; - JobKey _parentJobKey; + private JobKey _parentJobKey; + /// + /// 处理数据任务 + /// + /// 调度器 + /// 触发器 + /// 父任务的键 public MachineQueryJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey) { _scheduler = scheduler; @@ -190,11 +277,25 @@ namespace Modbus.Net _parentJobKey = parentJobKey; } + /// + /// 处理数据 + /// + /// 任务ID,每个触发器唯一 + /// 处理数据的函数,输入返回读数据的定义和值,输出写数据字典 + /// public Task Query(string queryId = null, Func> QueryDataFunc = null) { return Query(queryId, QueryDataFunc); } + /// + /// 处理数据 + /// + /// 设备的ID类型 + /// 任务ID,每个触发器唯一 + /// 处理数据的函数,输入返回读数据的定义和值,输出写数据字典 + /// + /// public async Task Query(string queryId = null, Func> QueryDataFunc = null) where TMachineKey : IEquatable { if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, _parentJobKey); @@ -206,9 +307,11 @@ namespace Modbus.Net .StoreDurably(true) .Build(); - job.JobDataMap.Put("QueryMethod", QueryDataFunc); + if (QueryDataFunc != null) + job.JobDataMap.Put("QueryMethod", QueryDataFunc); var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + if (listener == null) throw new NullReferenceException("Listener " + "Modbus.Net.DataQuery.Chain." + _trigger.Key.Name + " is null"); listener.AddJobChainLink(_parentJobKey, jobKey); await _scheduler.AddJob(job, true); @@ -217,14 +320,23 @@ namespace Modbus.Net } } + /// + /// 写入数据任务 + /// public sealed class MachineSetJobScheduler { - IScheduler _scheduler; + private IScheduler _scheduler; - ITrigger _trigger; + private ITrigger _trigger; - JobKey _parentJobKey; + private JobKey _parentJobKey; + /// + /// 写入数据任务 + /// + /// 调度器 + /// 触发器 + /// 父任务的键 public MachineSetJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey) { _scheduler = scheduler; @@ -234,6 +346,13 @@ namespace Modbus.Net _parentJobKey = parentJobKey; } + /// + /// 向设备写入数据 + /// + /// 任务ID,每个触发器唯一 + /// 写入数据的设备实例 + /// + /// public async Task To(string queryId, IMachineMethodData machine) { JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); @@ -246,6 +365,7 @@ namespace Modbus.Net job.JobDataMap.Put("Machine", machine); var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + if (listener == null) throw new NullReferenceException("Listener " + "Modbus.Net.DataQuery.Chain." + _trigger.Key.Name + " is null"); listener.AddJobChainLink(_parentJobKey, jobKey); await _scheduler.AddJob(job, true); @@ -253,19 +373,34 @@ namespace Modbus.Net return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); } + /// + /// 再次获取一个设备的数据 + /// + /// 任务ID,每个触发器唯一 + /// 要获取数据的设备实例 + /// 获取数据的方式 + /// public async Task From(string queryId, IMachineMethodData machine, MachineDataType machineDataType) { return await new MachineGetJobScheduler(_scheduler, _trigger, _parentJobKey).From(queryId, machine, machineDataType); } + /// + /// 执行任务 + /// + /// public async Task Run() { await _scheduler.Start(); } } + /// + /// 获取数据任务 + /// public class MachineGetDataJob : IJob { + /// public async Task Execute(IJobExecutionContext context) { object machine; @@ -279,8 +414,13 @@ namespace Modbus.Net } } + /// + /// 处理数据任务 + /// + /// public class MachineQueryDataJob : IJob where TMachineKey : IEquatable { + /// public async Task Execute(IJobExecutionContext context) { object machine; @@ -299,8 +439,12 @@ namespace Modbus.Net } } + /// + /// 写数据任务 + /// public class MachineSetDataJob : IJob { + /// public async Task Execute(IJobExecutionContext context) { object machine; @@ -314,7 +458,9 @@ namespace Modbus.Net if (valuesSet == null && values != null) valuesSet = ((Dictionary)values).MapGetValuesToSetValues(); + if (valuesSet == null) throw new NullReferenceException("Set value is null"); var success = await (machine as IMachineMethodData)!.SetDatasAsync((MachineDataType)machineDataType, (Dictionary)valuesSet); + } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj index e357d74..6da3f18 100644 --- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj +++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj @@ -5,7 +5,7 @@ Modbus.Net Modbus.Net Modbus.Net - 1.4.1 + 1.4.0 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. diff --git a/Samples/AnyType/Models/TaskViewModel.cs b/Samples/AnyType/Models/TaskViewModel.cs index 0bcfdd6..02932d6 100644 --- a/Samples/AnyType/Models/TaskViewModel.cs +++ b/Samples/AnyType/Models/TaskViewModel.cs @@ -7,10 +7,10 @@ namespace AnyType.Models { public class TaskViewModel { - public string Id { get; set; } - public string Name { get; set; } - public string Address { get; set; } - public double Value { get; set; } - public string Type { get; set; } + public string? Id { get; set; } + public string? Name { get; set; } + public string? Address { get; set; } + public double? Value { get; set; } + public string? Type { get; set; } } } \ No newline at end of file diff --git a/Samples/CrossLamp/Controllers/HomeController.cs b/Samples/CrossLamp/Controllers/HomeController.cs index a6577c0..b119f59 100644 --- a/Samples/CrossLamp/Controllers/HomeController.cs +++ b/Samples/CrossLamp/Controllers/HomeController.cs @@ -16,7 +16,7 @@ namespace CrossLamp.Controllers _logger = logger; } - private static BaseUtility _utility; + private static BaseUtility? _utility = null; public ActionResult Index() { @@ -24,7 +24,7 @@ namespace CrossLamp.Controllers } [HttpGet] - public async Task GetLamp() + public async Task GetLamp() { try { diff --git a/Samples/CrossLamp/Models/Lamp.cs b/Samples/CrossLamp/Models/Lamp.cs index f7222c3..abd1342 100644 --- a/Samples/CrossLamp/Models/Lamp.cs +++ b/Samples/CrossLamp/Models/Lamp.cs @@ -8,9 +8,9 @@ namespace CrossLampControl.WebApi.Models { public class Lamp { - public string MainLamp { get; set; } - public string SubLamp { get; set; } - public string StartPause { get; set; } + public string? MainLamp { get; set; } + public string? SubLamp { get; set; } + public string? StartPause { get; set; } public Lamp() { diff --git a/Samples/TripleAdd/Controllers/HomeController.cs b/Samples/TripleAdd/Controllers/HomeController.cs index 9bc976b..ae88b42 100644 --- a/Samples/TripleAdd/Controllers/HomeController.cs +++ b/Samples/TripleAdd/Controllers/HomeController.cs @@ -15,8 +15,8 @@ namespace TripleAdd.Controllers _logger = logger; } - private static BaseUtility utility; - private static BaseMachine machine; + private static BaseUtility? utility; + private static BaseMachine? machine; public ActionResult Index() { @@ -83,7 +83,7 @@ namespace TripleAdd.Controllers public async Task SetUtility(TripleAddViewModel model) { ushort add1 = model.Add1, add2 = model.Add2, add3 = model.Add3; - await utility.SetDatasAsync("4X 1", new object[] { add1, add2, add3 }); + await utility!.SetDatasAsync("4X 1", new object[] { add1, add2, add3 }); return RedirectToAction("Utility"); } @@ -92,7 +92,7 @@ namespace TripleAdd.Controllers { ushort add1 = model.Add1, add2 = model.Add2, add3 = model.Add3; var setDic = new Dictionary { { "Add1", add1 }, { "Add2", add2 }, { "Add3", add3 } }; - await machine.SetDatasAsync(MachineDataType.CommunicationTag, setDic); + await machine!.SetDatasAsync(MachineDataType.CommunicationTag, setDic); return RedirectToAction("Machine"); } diff --git a/Tests/Modbus.Net.Tests/BaseTest.cs b/Tests/Modbus.Net.Tests/BaseTest.cs index 178c82e..bc9629e 100644 --- a/Tests/Modbus.Net.Tests/BaseTest.cs +++ b/Tests/Modbus.Net.Tests/BaseTest.cs @@ -10,9 +10,9 @@ namespace Modbus.Net.Tests [TestClass] public class BaseTest { - private List> _addressUnits; + private List>? _addressUnits; - private BaseMachine _baseMachine2; + private BaseMachine? _baseMachine2; [TestInitialize] public void Init() @@ -138,7 +138,7 @@ namespace Modbus.Net.Tests public void AddressCombinerContinusTest() { var addressCombiner = new AddressCombinerContinus(new AddressTranslatorModbus(), 100000); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 1); @@ -166,7 +166,7 @@ namespace Modbus.Net.Tests public void AddressCombinerContinusLimitTest() { var addressCombiner = new AddressCombinerContinus(new AddressTranslatorModbus(), 4); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 1); @@ -197,7 +197,7 @@ namespace Modbus.Net.Tests public void AddressCombinerSingleTest() { var addressCombiner = new AddressCombinerSingle(); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 1); @@ -221,7 +221,7 @@ namespace Modbus.Net.Tests public void AddressCombinerNumericJumpTest() { var addressCombiner = new AddressCombinerNumericJump(10, 100000, new AddressTranslatorModbus()); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 20); @@ -237,7 +237,7 @@ namespace Modbus.Net.Tests public void AddressCombinerNumericJumpLimitTest() { var addressCombiner = new AddressCombinerNumericJump(10, 10, new AddressTranslatorModbus()); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 8); @@ -256,7 +256,7 @@ namespace Modbus.Net.Tests public void AddressCombinerPercentageJumpTest() { var addressCombiner = new AddressCombinerPercentageJump(30.0, 100000, new AddressTranslatorModbus()); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 12); @@ -275,7 +275,7 @@ namespace Modbus.Net.Tests public void AddressCombinerPercentageJumpLimitTest() { var addressCombiner = new AddressCombinerPercentageJump(30.0, 10, new AddressTranslatorModbus()); - var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); + var combinedAddresses = addressCombiner.Combine(_addressUnits!).ToArray(); Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].GetCount, 8); @@ -296,7 +296,7 @@ namespace Modbus.Net.Tests [TestCleanup] public void MachineClean() { - _baseMachine2.Disconnect(); + _baseMachine2?.Disconnect(); } } } diff --git a/Tests/Modbus.Net.Tests/EndianTest.cs b/Tests/Modbus.Net.Tests/EndianTest.cs index 9f1ee95..99772b6 100644 --- a/Tests/Modbus.Net.Tests/EndianTest.cs +++ b/Tests/Modbus.Net.Tests/EndianTest.cs @@ -11,9 +11,9 @@ namespace Modbus.Net.Tests [TestClass] public class EndianTest { - private BaseMachine _modbusTcpMachine; + private BaseMachine? _modbusTcpMachine; - private BaseMachine _modbusTcpMachine2; + private BaseMachine? _modbusTcpMachine2; [TestInitialize] public void Init() @@ -48,8 +48,8 @@ namespace Modbus.Net.Tests } }; - _modbusTcpMachine.GetAddresses = addresses; - _modbusTcpMachine2.GetAddresses = addresses; + _modbusTcpMachine!.GetAddresses = addresses; + _modbusTcpMachine2!.GetAddresses = addresses; await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusTcpMachine2.GetDatasAsync(MachineDataType.Address); diff --git a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs index 689330e..cb633f8 100644 --- a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs @@ -10,9 +10,9 @@ namespace Modbus.Net.Tests [TestClass] public class ModbusMultiStationTest { - private BaseMachine _modbusRtuMachine1; + private BaseMachine? _modbusRtuMachine1; - private BaseMachine _modbusRtuMachine2; + private BaseMachine? _modbusRtuMachine2; [TestInitialize] public void Init() @@ -82,8 +82,8 @@ namespace Modbus.Net.Tests } }; - _modbusRtuMachine1.GetAddresses = addresses.ToList(); - _modbusRtuMachine2.GetAddresses = addresses.ToList(); + _modbusRtuMachine1!.GetAddresses = addresses.ToList(); + _modbusRtuMachine2!.GetAddresses = addresses.ToList(); Random r = new Random(); var dic1 = new Dictionary() diff --git a/Tests/Modbus.Net.Tests/ModbusTest.cs b/Tests/Modbus.Net.Tests/ModbusTest.cs index 03fb959..9af3cb0 100644 --- a/Tests/Modbus.Net.Tests/ModbusTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusTest.cs @@ -9,11 +9,11 @@ namespace Modbus.Net.Tests [TestClass] public class ModbusTest { - private BaseMachine _modbusTcpMachine; + private BaseMachine? _modbusTcpMachine; - private BaseMachine _modbusRtuMachine; + private BaseMachine? _modbusRtuMachine; - private BaseMachine _modbusAsciiMachine; + private BaseMachine? _modbusAsciiMachine; [TestInitialize] public void Init() @@ -50,9 +50,9 @@ namespace Modbus.Net.Tests } }; - _modbusTcpMachine.GetAddresses = addresses; - _modbusAsciiMachine.GetAddresses = addresses; - _modbusRtuMachine.GetAddresses = addresses; + _modbusTcpMachine!.GetAddresses = addresses; + _modbusAsciiMachine!.GetAddresses = addresses; + _modbusRtuMachine!.GetAddresses = addresses; await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); await _modbusAsciiMachine.SetDatasAsync(MachineDataType.Address, dic1); await _modbusRtuMachine.SetDatasAsync(MachineDataType.Address, dic1); @@ -80,9 +80,9 @@ namespace Modbus.Net.Tests } }; - _modbusTcpMachine.GetAddresses = addresses; - _modbusRtuMachine.GetAddresses = addresses; - _modbusAsciiMachine.GetAddresses = addresses; + _modbusTcpMachine!.GetAddresses = addresses; + _modbusRtuMachine!.GetAddresses = addresses; + _modbusAsciiMachine!.GetAddresses = addresses; var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); @@ -107,9 +107,9 @@ namespace Modbus.Net.Tests } }; - _modbusTcpMachine.GetAddresses = addresses; - _modbusRtuMachine.GetAddresses = addresses; - _modbusAsciiMachine.GetAddresses = addresses; + _modbusTcpMachine!.GetAddresses = addresses; + _modbusRtuMachine!.GetAddresses = addresses; + _modbusAsciiMachine!.GetAddresses = addresses; var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); @@ -143,9 +143,9 @@ namespace Modbus.Net.Tests } }; - _modbusTcpMachine.GetAddresses = addresses; - _modbusAsciiMachine.GetAddresses = addresses; - _modbusRtuMachine.GetAddresses = addresses; + _modbusTcpMachine!.GetAddresses = addresses; + _modbusAsciiMachine!.GetAddresses = addresses; + _modbusRtuMachine!.GetAddresses = addresses; await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); await _modbusAsciiMachine.SetDatasAsync(MachineDataType.Address, dic1); await _modbusRtuMachine.SetDatasAsync(MachineDataType.Address, dic1); @@ -242,9 +242,9 @@ namespace Modbus.Net.Tests }, }; - _modbusTcpMachine.GetAddresses = addresses; - _modbusRtuMachine.GetAddresses = addresses; - _modbusAsciiMachine.GetAddresses = addresses; + _modbusTcpMachine!.GetAddresses = addresses; + _modbusRtuMachine!.GetAddresses = addresses; + _modbusAsciiMachine!.GetAddresses = addresses; await _modbusTcpMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); await _modbusRtuMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); await _modbusAsciiMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); @@ -292,9 +292,9 @@ namespace Modbus.Net.Tests } }; - await _modbusTcpMachine.BaseUtility.GetUtilityMethods().SetSingleDataAsync("4X 1", dic1["4X 1"]); - await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().SetSingleDataAsync("4X 1", dic1["4X 1"]); - await _modbusRtuMachine.BaseUtility.GetUtilityMethods().SetSingleDataAsync("4X 1", dic1["4X 1"]); + await _modbusTcpMachine!.BaseUtility.GetUtilityMethods().SetSingleDataAsync("4X 1", dic1["4X 1"]); + await _modbusAsciiMachine!.BaseUtility.GetUtilityMethods().SetSingleDataAsync("4X 1", dic1["4X 1"]); + await _modbusRtuMachine!.BaseUtility.GetUtilityMethods().SetSingleDataAsync("4X 1", dic1["4X 1"]); var ans = await _modbusTcpMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); var ans2 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); var ans3 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); @@ -316,9 +316,9 @@ namespace Modbus.Net.Tests [TestCleanup] public void MachineClean() { - _modbusAsciiMachine.Disconnect(); - _modbusRtuMachine.Disconnect(); - _modbusTcpMachine.Disconnect(); + _modbusAsciiMachine!.Disconnect(); + _modbusRtuMachine!.Disconnect(); + _modbusTcpMachine!.Disconnect(); } } } diff --git a/Tests/Modbus.Net.Tests/SiemensTest.cs b/Tests/Modbus.Net.Tests/SiemensTest.cs index 88c2224..bc35f66 100644 --- a/Tests/Modbus.Net.Tests/SiemensTest.cs +++ b/Tests/Modbus.Net.Tests/SiemensTest.cs @@ -10,7 +10,7 @@ namespace Modbus.Net.Tests [TestClass] public class SiemensTest { - private BaseMachine _siemensTcpMachine; + private BaseMachine? _siemensTcpMachine; [TestInitialize] public void Init() @@ -43,7 +43,7 @@ namespace Modbus.Net.Tests } }; - _siemensTcpMachine.GetAddresses = addresses; + _siemensTcpMachine!.GetAddresses = addresses; await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); @@ -66,7 +66,7 @@ namespace Modbus.Net.Tests } }; - _siemensTcpMachine.GetAddresses = addresses; + _siemensTcpMachine!.GetAddresses = addresses; var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); Assert.AreEqual(ans["I 0.0"].DeviceValue, 0); } @@ -89,7 +89,7 @@ namespace Modbus.Net.Tests } }; - _siemensTcpMachine.GetAddresses = addresses; + _siemensTcpMachine!.GetAddresses = addresses; var dic1 = new Dictionary() { @@ -121,7 +121,7 @@ namespace Modbus.Net.Tests } }; - _siemensTcpMachine.GetAddresses = addresses; + _siemensTcpMachine!.GetAddresses = addresses; var dic1 = new Dictionary() { @@ -161,7 +161,7 @@ namespace Modbus.Net.Tests } }; - _siemensTcpMachine.GetAddresses = addresses; + _siemensTcpMachine!.GetAddresses = addresses; await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); @@ -253,7 +253,7 @@ namespace Modbus.Net.Tests }, }; - _siemensTcpMachine.GetAddresses = addresses; + _siemensTcpMachine!.GetAddresses = addresses; await _siemensTcpMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.CommunicationTag); Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); @@ -267,7 +267,7 @@ namespace Modbus.Net.Tests [TestCleanup] public void MachineClean() { - _siemensTcpMachine.Disconnect(); + _siemensTcpMachine!.Disconnect(); } } }