From b463bb94148157ee55b213fb1a4a91cca5dcff12 Mon Sep 17 00:00:00 2001 From: luosheng Date: Sun, 12 Feb 2023 07:57:27 +0800 Subject: [PATCH] Job System and DuplicateWithCount bug fix. --- .../ModbusAsciiInTcpProtocolLinker.cs | 2 +- .../ModbusAsciiInUdpProtocolLinker.cs | 2 +- .../ModbusAsciiProtocolLinker.cs | 3 +- .../ModbusRtuInTcpProtocolLinker.cs | 2 +- .../ModbusRtuInUdpProtocolLinker.cs | 2 +- .../ModbusRtuProtocolLinker.cs | 3 +- .../ModbusTcpProtocolLinker.cs | 2 +- .../ModbusUdpProtocolLinker.cs | 2 +- .../SiemensPpiProtocolLinker.cs | 5 +- .../SiemensTcpProtocolLinker.cs | 2 +- Modbus.Net/Modbus.Net/App.config | 1 + .../Controller/DuplicateWithCount.cs | 7 +- .../Controller/MatchDirectlySendController.cs | 4 +- .../Modbus.Net/Interface/IMachineMethod.cs | 8 +- .../Job/JobChainingJobListenerWithDataMap.cs | 71 +++++++ .../Modbus.Net/Job/MachineJobScheduler.cs | 197 ++++++++++++++++++ Modbus.Net/Modbus.Net/Machine/BaseMachine.cs | 92 ++------ .../Modbus.Net/Machine/BaseMachineExtend.cs | 4 +- Modbus.Net/Modbus.Net/Modbus.Net.csproj | 1 + Modbus.Net/Modbus.Net/README.md | 22 +- .../Modbus.Net.Modbus.Test.csproj | 4 - Samples/Modbus.Net.Modbus.Test/Program.cs | 61 +----- Tests/Modbus.Net.Tests/EndianTest.cs | 10 +- Tests/Modbus.Net.Tests/MachineMethodTest.cs | 8 +- .../ModbusMultiStationTest.cs | 32 +-- Tests/Modbus.Net.Tests/ModbusTest.cs | 108 +++++----- Tests/Modbus.Net.Tests/SiemensTest.cs | 44 ++-- 27 files changed, 437 insertions(+), 262 deletions(-) create mode 100644 Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs create mode 100644 Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs index 96b532d..b50c6ed 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs @@ -25,7 +25,7 @@ namespace Modbus.Net.Modbus public ModbusAsciiInTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "100"))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs index bf19cef..9b602f0 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs @@ -29,7 +29,7 @@ namespace Modbus.Net.Modbus public ModbusAsciiInUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs index 8c5a3ce..434ac2f 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Configuration; using System.IO.Ports; using System.Text; @@ -17,7 +18,7 @@ namespace Modbus.Net.Modbus public ModbusAsciiProtocolLinker(string com, int slaveAddress) : base(com, 9600, Parity.None, StopBits.One, 8, slaveAddress) { - ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int,int)>[] { new List<(int,int)> { (1,1), (2,2) }, new List<(int, int)> { (3, 3), (4, 4) }}, 0)); + ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int,int)>[] { new List<(int,int)> { (1,1), (2,2) }, new List<(int, int)> { (3, 3), (4, 4) }}, int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs index 43df359..777b60e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs @@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus public ModbusRtuInTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs index 4798561..ff8b13a 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs @@ -29,7 +29,7 @@ namespace Modbus.Net.Modbus public ModbusRtuInUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs index 1d4d49f..502250e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Configuration; using System.IO.Ports; namespace Modbus.Net.Modbus @@ -16,7 +17,7 @@ namespace Modbus.Net.Modbus public ModbusRtuProtocolLinker(string com, int slaveAddress) : base(com, 9600, Parity.None, StopBits.One, 8, slaveAddress) { - ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int,int)>[]{new List<(int,int)>{(0,0)}, new List<(int, int)>{(1,1)}}, 0)); + ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int,int)>[]{new List<(int,int)>{(0,0)}, new List<(int, int)>{(1,1)}}, int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs index 8365eaf..2024b3e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs @@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus /// 端口 public ModbusTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0, true, DuplicateWithCount.GetDuplcateFunc(new List{4,5}))); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"), true, DuplicateWithCount.GetDuplcateFunc(new List{4,5}, 6))); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs index 96aab98..d7ba341 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs @@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus /// 端口 public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0, true, DuplicateWithCount.GetDuplcateFunc(new List { 4, 5 }))); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"), true, DuplicateWithCount.GetDuplcateFunc(new List { 4, 5 }, 6))); } /// diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs index f9db58a..48beaea 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs @@ -1,8 +1,9 @@ -using System.Collections.Generic; +using System.Configuration; using System.IO.Ports; using System.Threading; using System.Threading.Tasks; + namespace Modbus.Net.Siemens { /// @@ -18,7 +19,7 @@ namespace Modbus.Net.Siemens public SiemensPpiProtocolLinker(string com, int slaveAddress) : base(com, 9600, Parity.Even, StopBits.One, 8, slaveAddress) { - ((BaseConnector)BaseConnector).AddController(new FifoController(0)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"))); } /// diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs index aa77b16..7f10355 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs @@ -27,7 +27,7 @@ namespace Modbus.Net.Siemens public SiemensTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new MatchDirectlySendController(new ICollection<(int,int)>[] { new List<(int,int)> { (11,11), (12,12) } }, DuplicateWithCount.GetDuplcateFunc(new List{2, 3}))); + ((BaseConnector)BaseConnector).AddController(new MatchDirectlySendController(new ICollection<(int,int)>[] { new List<(int,int)> { (11,11), (12,12) } }, int.Parse(ConfigurationManager.AppSettings["FetchSleepTime"] ?? "0"), DuplicateWithCount.GetDuplcateFunc(new List{2, 3}, 0))); } /// diff --git a/Modbus.Net/Modbus.Net/App.config b/Modbus.Net/Modbus.Net/App.config index 44dba52..9f5ff60 100644 --- a/Modbus.Net/Modbus.Net/App.config +++ b/Modbus.Net/Modbus.Net/App.config @@ -11,5 +11,6 @@ + \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs b/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs index a8eac8d..b320fe4 100644 --- a/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs +++ b/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs @@ -17,7 +17,7 @@ namespace Modbus.Net /// 收到的报文信息 /// 收到的断包长度查询位置 /// 切分后的报文信息 - private static ICollection DuplicateMessages(byte[] receiveMessage, ICollection packageCountPositions) + private static ICollection DuplicateMessages(byte[] receiveMessage, ICollection packageCountPositions, int otherCount) { if (packageCountPositions == null) return new List { receiveMessage }; @@ -32,6 +32,7 @@ namespace Modbus.Net { length = length * 256 + receiveMessage[pos + countPos]; } + length += otherCount; if (pos + length > receiveMessage.Length) break; byte[] currentPackage = new byte[length]; Array.Copy(receiveMessage, pos, currentPackage, 0, length); @@ -51,9 +52,9 @@ namespace Modbus.Net /// /// 断包长度的位置信息 /// 断包函数 - public static Func> GetDuplcateFunc(ICollection packageCountPositions) + public static Func> GetDuplcateFunc(ICollection packageCountPositions, int otherCount) { - return receiveMessage => DuplicateMessages(receiveMessage, packageCountPositions); + return receiveMessage => DuplicateMessages(receiveMessage, packageCountPositions, otherCount); } } } diff --git a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs index 834426d..f919007 100644 --- a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs +++ b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs @@ -12,9 +12,9 @@ namespace Modbus.Net public class MatchDirectlySendController : MatchController { /// - public MatchDirectlySendController(ICollection<(int, int)>[] keyMatches, + public MatchDirectlySendController(ICollection<(int, int)>[] keyMatches, int acquireTime, Func> duplicateFunc = null) : base(keyMatches, - 0, false, duplicateFunc) + acquireTime, false, duplicateFunc) { } diff --git a/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs b/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs index 31f23ab..0d464c6 100644 --- a/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs +++ b/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs @@ -19,13 +19,13 @@ namespace Modbus.Net /// ȡ /// /// 豸ȡ - Dictionary GetDatas(MachineGetDataType getDataType); + Dictionary GetDatas(MachineDataType getDataType); /// /// ȡ /// /// 豸ȡ - Task> GetDatasAsync(MachineGetDataType getDataType); + Task> GetDatasAsync(MachineDataType getDataType); /// /// д @@ -33,7 +33,7 @@ namespace Modbus.Net /// д /// Ҫдֵ䣬дΪAddressʱΪҪдĵַдΪCommunicationTagʱΪҪдĵԪ /// Ƿдɹ - bool SetDatas(MachineSetDataType setDataType, Dictionary values); + bool SetDatas(MachineDataType setDataType, Dictionary values); /// /// д @@ -41,6 +41,6 @@ namespace Modbus.Net /// д /// Ҫдֵ䣬дΪAddressʱΪҪдĵַдΪCommunicationTagʱΪҪдĵԪ /// Ƿдɹ - Task SetDatasAsync(MachineSetDataType setDataType, Dictionary values); + Task SetDatasAsync(MachineDataType setDataType, Dictionary values); } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs b/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs new file mode 100644 index 0000000..85c8116 --- /dev/null +++ b/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs @@ -0,0 +1,71 @@ +using Quartz.Listener; +using Quartz; +using Serilog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Modbus.Net.Job +{ + public class JobChainingJobListenerWithDataMap : JobListenerSupport + { + public JobChainingJobListenerWithDataMap(string name, bool overwrite) + { + Name = name; + OverWrite = overwrite; + chainLinks = new Dictionary(); + } + + private readonly Dictionary chainLinks; + + public override string Name { get; } + + public bool OverWrite { get; } + + /// + /// Add a chain mapping - when the Job identified by the first key completes + /// the job identified by the second key will be triggered. + /// + /// a JobKey with the name and group of the first job + /// a JobKey with the name and group of the follow-up job + public new void AddJobChainLink(JobKey firstJob, JobKey secondJob) + { + chainLinks.Add(firstJob, secondJob); + } + + public override async Task JobWasExecuted(IJobExecutionContext context, + JobExecutionException? jobException, + CancellationToken cancellationToken = default) + { + chainLinks.TryGetValue(context.JobDetail.Key, out var sj); + + if (sj == null) + { + return; + } + + Log.Information("Job '{JobKey}' will now chain to Job '{Job}'", context.JobDetail.Key, sj); + + try + { + var sjJobDetail = await context.Scheduler.GetJobDetail(sj); + foreach (var entry in context.JobDetail.JobDataMap) + { + if (!OverWrite && !sjJobDetail.JobDataMap.ContainsKey(entry.Key)) + { + sjJobDetail.JobDataMap.Put(entry.Key, entry.Value); + 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); + } + } + } +} diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs new file mode 100644 index 0000000..d2214d5 --- /dev/null +++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs @@ -0,0 +1,197 @@ +using Modbus.Net.Interface; +using Quartz; +using Quartz.Impl; +using Quartz.Impl.Matchers; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Modbus.Net.Job +{ + public sealed class MachineJobSchedulerCreator + { + public static async Task CreateScheduler(int count, int interval) + { + IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); + + ITrigger trigger; + if (count >= 0) + trigger = TriggerBuilder.Create() + .WithIdentity("Modbus.Net.DataQuery.Trigger", "Modbus.Net.DataQuery.Group") + .StartNow() + .WithSimpleSchedule(b => b.WithIntervalInSeconds(interval).WithRepeatCount(count)) + .Build(); + else + trigger = TriggerBuilder.Create() + .WithIdentity("Modbus.Net.DataQuery.Trigger", "Modbus.Net.DataQuery.Group") + .StartNow() + .WithSimpleSchedule(b => b.WithIntervalInSeconds(interval).RepeatForever()) + .Build(); + + return new MachineGetJobScheduler(scheduler, trigger); + } + } + + public sealed class MachineGetJobScheduler + { + IScheduler _scheduler; + + ITrigger _trigger; + + public MachineGetJobScheduler(IScheduler scheduler, ITrigger trigger) + { + _scheduler = scheduler; + _trigger = trigger; + } + + public async Task From(string queryId, IMachineMethodData machine, MachineDataType machineDataType) + { + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group"); + + IJobDetail job = JobBuilder.Create() + .WithIdentity(jobKey) + .Build(); + + job.JobDataMap.Put("DataType", machineDataType); + job.JobDataMap.Put("Machine", machine); + + await _scheduler.ScheduleJob(job, _trigger); + + return new MachineQueryJobScheduler(_scheduler, _trigger, jobKey); + } + } + + public class MachineQueryJobScheduler + { + IScheduler _scheduler; + + ITrigger _trigger; + + JobKey _parentJobKey; + + public MachineQueryJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey) + { + _scheduler = scheduler; + _trigger = trigger; + _parentJobKey = parentJobKey; + } + + public async Task Query(string queryId = null, Func, Dictionary> QueryDataFunc = null) + { + JobChainingJobListenerWithDataMap listener = new JobChainingJobListenerWithDataMap("Modbus.Net.DataQuery.Chain", false); + _scheduler.ListenerManager.AddJobListener(listener, GroupMatcher.GroupEquals("Modbus.Net.DataQuery.Group")); + + if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, listener, _parentJobKey); + + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group"); + + IJobDetail job = JobBuilder.Create() + .WithIdentity(jobKey) + .StoreDurably(true) + .Build(); + + job.JobDataMap.Put("QueryMethod", QueryDataFunc); + + listener.AddJobChainLink(_parentJobKey, jobKey); + + await _scheduler.AddJob(job, true); + + return new MachineSetJobScheduler(_scheduler, _trigger, listener, jobKey); + } + } + + public class MachineSetJobScheduler + { + IScheduler _scheduler; + + ITrigger _trigger; + + JobChainingJobListenerWithDataMap _listener; + + JobKey _parentJobKey; + + public MachineSetJobScheduler(IScheduler scheduler, ITrigger trigger, JobChainingJobListenerWithDataMap listener, JobKey parentJobKey) + { + _scheduler = scheduler; + + _trigger = trigger; + + _listener = listener; + + _parentJobKey = parentJobKey; + } + + public async Task To(string queryId, IMachineMethodData machine) + { + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group"); + + IJobDetail job = JobBuilder.Create() + .WithIdentity(jobKey) + .StoreDurably(true) + .Build(); + + job.JobDataMap.Put("Machine", machine); + + _listener.AddJobChainLink(_parentJobKey, jobKey); + + await _scheduler.AddJob(job, true); + + return new MachineSetJobScheduler(_scheduler, _trigger, _listener, jobKey); + } + + public async Task Run() + { + await _scheduler.Start(); + } + } + + public class MachineGetDataJob : IJob + { + public async Task Execute(IJobExecutionContext context) + { + object machine; + object machineDataType; + context.MergedJobDataMap.TryGetValue("Machine", out machine); + context.MergedJobDataMap.TryGetValue("DataType", out machineDataType); + var values = await (machine as IMachineMethodData)!.GetDatasAsync((MachineDataType)machineDataType); + + context.JobDetail.JobDataMap.Put("Value", values); + await context.Scheduler.AddJob(context.JobDetail, true, false); + } + } + + public class MachineQueryDataJob : IJob + { + public async Task Execute(IJobExecutionContext context) + { + object values; + object QueryMethod; + + context.MergedJobDataMap.TryGetValue("Value", out values); + context.MergedJobDataMap.TryGetValue("QueryMethod", out QueryMethod); + Func, Dictionary> QueryMethodDispatch = (Func, Dictionary>)QueryMethod; + + if (QueryMethod != null) + { + context.JobDetail.JobDataMap.Put("Value", QueryMethodDispatch((Dictionary)values)); + await context.Scheduler.AddJob(context.JobDetail, true, false); + } + } + } + + public class MachineSetDataJob : IJob + { + public async Task Execute(IJobExecutionContext context) + { + object machine; + object machineDataType; + object values; + context.MergedJobDataMap.TryGetValue("Machine", out machine); + context.MergedJobDataMap.TryGetValue("DataType", out machineDataType); + context.MergedJobDataMap.TryGetValue("Value", out values); + Dictionary valuesSet = ((Dictionary)values).MapGetValuesToSetValues(); + + var success = await (machine as IMachine)!.SetDatasAsync((MachineDataType)machineDataType, valuesSet); + } + } +} \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs b/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs index 7302ed5..8515809 100644 --- a/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs +++ b/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs @@ -33,58 +33,6 @@ namespace Modbus.Net Id } - /// - /// 获取设备值的方式 - /// - public enum MachineGetDataType - { - /// - /// 地址 - /// - Address, - - /// - /// 通讯标识 - /// - CommunicationTag, - - /// - /// 名称 - /// - Name, - - /// - /// Id - /// - Id - } - - /// - /// 向设备设置值的方式 - /// - public enum MachineSetDataType - { - /// - /// 地址 - /// - Address, - - /// - /// 通讯标识 - /// - CommunicationTag, - - /// - /// 名称 - /// - Name, - - /// - /// Id - /// - Id - } - /// /// 设备 /// @@ -244,7 +192,7 @@ namespace Modbus.Net /// 读取数据 /// /// 从设备读取的数据 - public Dictionary GetDatas(MachineGetDataType getDataType) + public Dictionary GetDatas(MachineDataType getDataType) { return AsyncHelper.RunSync(() => GetDatasAsync(getDataType)); } @@ -254,7 +202,7 @@ namespace Modbus.Net /// 读取数据 /// /// 从设备读取的数据 - public async Task> GetDatasAsync(MachineGetDataType getDataType) + public async Task> GetDatasAsync(MachineDataType getDataType) { try { @@ -304,22 +252,22 @@ namespace Modbus.Net string key; switch (getDataType) { - case MachineGetDataType.CommunicationTag: + case MachineDataType.CommunicationTag: { key = address.CommunicationTag; break; } - case MachineGetDataType.Address: + case MachineDataType.Address: { key = AddressFormater.FormatAddress(address.Area, address.Address, address.SubAddress); break; } - case MachineGetDataType.Name: + case MachineDataType.Name: { key = address.Name; break; } - case MachineGetDataType.Id: + case MachineDataType.Id: { key = address.Id.ToString(); break; @@ -337,14 +285,14 @@ namespace Modbus.Net if (datas.Length == 0) ans.Add(key, new ReturnUnit { - PlcValue = null, + DeviceValue = null, UnitExtend = address.UnitExtend }); else ans.Add(key, new ReturnUnit { - PlcValue = + DeviceValue = Convert.ToDouble( ValueHelper.GetInstance(BaseUtility.Endian) .GetValue(datas, ref localMainPos, ref localSubPos, @@ -367,7 +315,7 @@ namespace Modbus.Net if (!KeepConnect) BaseUtility.Disconnect(); //返回数据 - if (ans.All(p => p.Value.PlcValue == null)) ans = null; + if (ans.All(p => p.Value.DeviceValue == null)) ans = null; ErrorCount = 0; return ans; } @@ -388,7 +336,7 @@ namespace Modbus.Net /// 写入类型 /// 需要写入的数据字典,当写入类型为Address时,键为需要写入的地址,当写入类型为CommunicationTag时,键为需要写入的单元的描述 /// 是否写入成功 - public bool SetDatas(MachineSetDataType setDataType, Dictionary values) + public bool SetDatas(MachineDataType setDataType, Dictionary values) { return AsyncHelper.RunSync(() => SetDatasAsync(setDataType, values)); } @@ -399,7 +347,7 @@ namespace Modbus.Net /// 写入类型 /// 需要写入的数据字典,当写入类型为Address时,键为需要写入的地址,当写入类型为CommunicationTag时,键为需要写入的单元的描述 /// 是否写入成功 - public async Task SetDatasAsync(MachineSetDataType setDataType, Dictionary values) + public async Task SetDatasAsync(MachineDataType setDataType, Dictionary values) { try { @@ -416,7 +364,7 @@ namespace Modbus.Net AddressUnit address = null; switch (setDataType) { - case MachineSetDataType.Address: + case MachineDataType.Address: { address = GetAddresses.SingleOrDefault( @@ -426,18 +374,18 @@ namespace Modbus.Net AddressFormater.FormatAddress(p.Area, p.Address) == value.Key); break; } - case MachineSetDataType.CommunicationTag: + case MachineDataType.CommunicationTag: { address = GetAddresses.SingleOrDefault(p => p.CommunicationTag == value.Key); break; } - case MachineSetDataType.Name: + case MachineDataType.Name: { address = GetAddresses.SingleOrDefault(p => p.Name == value.Key); break; } - case MachineSetDataType.Id: + case MachineDataType.Id: { address = GetAddresses.SingleOrDefault(p => p.Id.ToString() == value.Key); break; @@ -526,7 +474,7 @@ namespace Modbus.Net KeyValuePair value; switch (setDataType) { - case MachineSetDataType.Address: + case MachineDataType.Address: { //获取要写入的值 value = @@ -534,17 +482,17 @@ namespace Modbus.Net p => p.Key == address || address2 != null && p.Key == address2); break; } - case MachineSetDataType.CommunicationTag: + case MachineDataType.CommunicationTag: { value = values.SingleOrDefault(p => p.Key == addressUnit.CommunicationTag); break; } - case MachineSetDataType.Name: + case MachineDataType.Name: { value = values.SingleOrDefault(p => p.Key == addressUnit.Name); break; } - case MachineSetDataType.Id: + case MachineDataType.Id: { value = values.SingleOrDefault(p => p.Key == addressUnit.Id.ToString()); break; @@ -760,7 +708,7 @@ namespace Modbus.Net /// /// 返回的数据 /// - public double? PlcValue { get; set; } + public double? DeviceValue { get; set; } /// /// 数据的扩展 diff --git a/Modbus.Net/Modbus.Net/Machine/BaseMachineExtend.cs b/Modbus.Net/Modbus.Net/Machine/BaseMachineExtend.cs index 7fb0b73..574bb5d 100644 --- a/Modbus.Net/Modbus.Net/Machine/BaseMachineExtend.cs +++ b/Modbus.Net/Modbus.Net/Machine/BaseMachineExtend.cs @@ -18,8 +18,8 @@ namespace Modbus.Net { if (getValues == null) return null; return (from getValue in getValues - where getValue.Value.PlcValue != null - select new KeyValuePair(getValue.Key, getValue.Value.PlcValue.Value)).ToDictionary( + where getValue.Value.DeviceValue != null + select new KeyValuePair(getValue.Key, getValue.Value.DeviceValue.Value)).ToDictionary( p => p.Key, p => p.Value); } } diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj index 7a1d65d..b365d28 100644 --- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj +++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj @@ -29,6 +29,7 @@ + diff --git a/Modbus.Net/Modbus.Net/README.md b/Modbus.Net/Modbus.Net/README.md index 458737d..6831459 100644 --- a/Modbus.Net/Modbus.Net/README.md +++ b/Modbus.Net/Modbus.Net/README.md @@ -156,10 +156,10 @@ machine = new ModbusMachine(ModbusType.Rtu, "COM3", new List() machine.AddressCombiner = new AddressCombinerContinus(machine.AddressTranslator); machine.AddressCombinerSet = new AddressCombinerContinus(machine.AddressTranslator); machine.AddressCombiner = new AddressCombinerPercentageJump(20.0); -var result = machine.InvokeMachineMethods?.GetDatas(MachineGetDataType.CommunicationTag); -var add1 = result["Add1"].PlcValue; +var result = machine.InvokeMachineMethods?.GetDatas(MachineDataType.CommunicationTag); +var add1 = result["Add1"].DeviceValue; var resultFormat = result.MapGetValuesToSetValues(); -machine.InvokeMachineMethods?.SetDatas(MachineSetDataType.CommunicationTag, resultFormat); +machine.InvokeMachineMethods?.SetDatas(MachineDataType.CommunicationTag, resultFormat); ``` To use BaseMachine, follow these steps. @@ -196,13 +196,13 @@ There are 4 AddressCombiners implemented in the platform. 3.Use GetDatas Api. ```C# -var result = machine.InvokeMachineMethods?.GetDatas(MachineGetDataType.CommunicationTag); -//var result = await machine.InvokeMachineMethods?.GetDatasAsync(MachineGetDataType.CommunicationTag); +var result = machine.InvokeMachineMethods?.GetDatas(MachineDataType.CommunicationTag); +//var result = await machine.InvokeMachineMethods?.GetDatasAsync(MachineDataType.CommunicationTag); ``` 4.Retrive data from result. ```C# -var add1 = result["Add1"].PlcValue; +var add1 = result["Add1"].DeviceValue; ``` 5.Format result to SetData parameter. @@ -212,15 +212,15 @@ var resultFormat = result.MapGetValuesToSetValues(); 6.SetData to machine or another machine. ```C# -machine.InvokeMachineMethods?.SetDatas(MachineSetDataType.CommunicationTag, resultFormat); +machine.InvokeMachineMethods?.SetDatas(MachineDataType.CommunicationTag, resultFormat); ``` There is also a SetDatasAsync Api. machine.SetDatas has four types. It is referenced as the first parameter. -1. MachineSetDataType.Address: the key of the dictionary of the second parameter is address. -2. MachineSetDataType.CommunicationTag: the key of the dictionary of the second parameter is communication tag. -3. MachineSetDataType.Id: the key of the dictionary of the second paramenter is ID. -4. MachineSetDataType.Name: the key of the dictionary of the second paramenter is name. +1. MachineDataType.Address: the key of the dictionary of the second parameter is address. +2. MachineDataType.CommunicationTag: the key of the dictionary of the second parameter is communication tag. +3. MachineDataType.Id: the key of the dictionary of the second paramenter is ID. +4. MachineDataType.Name: the key of the dictionary of the second paramenter is name. ## Implementing Your Own Protocol The main target of Modbus.Net is building a high extensable hardware communication protocol, so we allow everyone to extend the protocol. diff --git a/Samples/Modbus.Net.Modbus.Test/Modbus.Net.Modbus.Test.csproj b/Samples/Modbus.Net.Modbus.Test/Modbus.Net.Modbus.Test.csproj index baab5a4..e20d8f4 100644 --- a/Samples/Modbus.Net.Modbus.Test/Modbus.Net.Modbus.Test.csproj +++ b/Samples/Modbus.Net.Modbus.Test/Modbus.Net.Modbus.Test.csproj @@ -7,10 +7,6 @@ enable - - - - diff --git a/Samples/Modbus.Net.Modbus.Test/Program.cs b/Samples/Modbus.Net.Modbus.Test/Program.cs index 0c9b0fc..9e5108d 100644 --- a/Samples/Modbus.Net.Modbus.Test/Program.cs +++ b/Samples/Modbus.Net.Modbus.Test/Program.cs @@ -2,8 +2,7 @@ using Modbus.Net; using Modbus.Net.Modbus; using Modbus.Net.Interface; -using Quartz; -using Quartz.Impl; +using Modbus.Net.Job; List _addresses = new List { @@ -19,63 +18,21 @@ List _addresses = new List new AddressUnit() { Area = "4X", Address = 10, DataType = typeof(short), Id = "10", Name = "Test10" } }; -IMachine machine = new ModbusMachine("ModbusMachine1", ModbusType.Tcp, "192.168.0.172:502", _addresses, true, 2, 1, Endian.BigEndianLsb); +IMachine machine = new ModbusMachine("ModbusMachine1", ModbusType.Tcp, "192.168.0.172:502", _addresses, true, 1, 2, Endian.BigEndianLsb); - -//1.首先创建一个作业调度池 -ISchedulerFactory schedf = new StdSchedulerFactory(); -//2.实例化调度器工厂 -ISchedulerFactory schedulefactory = new StdSchedulerFactory(); -//3.实例化调度器 -IScheduler scheduler = await schedulefactory.GetScheduler(); - -//4.创建一个作业 -IJobDetail job1 = JobBuilder.Create() - .WithIdentity("demojob1", "groupa") - .Build(); - -//5.1:第一种方法直接写死多少秒执行一次 -//ITrigger trigger1 = TriggerBuilder.Create()//创建一个触发器 -// .WithIdentity("demotrigger1", "groupa") -// .StartNow() -// .WithSimpleSchedule(b => b.WithIntervalInSeconds(5)//5秒执行一次 -// .RepeatForever())//无限循环执行 -// .Build(); - -//5.2推荐:第二种使用cron表达式 -//在线生成cron表达式: http://cron.qqe2.com/ -string corn = "*/5 * * * * ?"; -ITrigger trigger1 = TriggerBuilder.Create() - .WithIdentity("demotrigger1", "groupa") - .WithCronSchedule(corn)//每一小时执行一次 - .Build(); - -//6.添加参数(键值对),如果不需要传参则忽略这一步 -//方法内获取你传的参数: string Name = context.Trigger.JobDataMap.GetString("Name"); -trigger1.JobDataMap.Add("Machine", machine); - -//7.把作业,触发器加入调度器 -await scheduler.ScheduleJob(job1, trigger1); -//8.开始运行 -await scheduler.Start(); +await MachineJobSchedulerCreator.CreateScheduler(-1, 5).Result.From(machine.Id, machine, MachineDataType.Name).Result.Query("ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Run(); Console.ReadLine(); -public class Class1 : IJob +Dictionary QueryConsole(Dictionary values) { - public async Task Execute(IJobExecutionContext context) + foreach (var value in values) { - object machine; - context.Trigger.JobDataMap.TryGetValue("Machine", out machine); - var values = await (machine as IMachine)!.GetDatasAsync(MachineGetDataType.Name); - if (values != null) - { - foreach (var value in values) - { - Console.WriteLine(value.Key + " " + value.Value.PlcValue); - } - } + Console.WriteLine(value.Key + " " + value.Value.DeviceValue); + value.Value.DeviceValue = new Random().Next(65536) - 32768; } + + return values; } diff --git a/Tests/Modbus.Net.Tests/EndianTest.cs b/Tests/Modbus.Net.Tests/EndianTest.cs index a1a6075..9f1ee95 100644 --- a/Tests/Modbus.Net.Tests/EndianTest.cs +++ b/Tests/Modbus.Net.Tests/EndianTest.cs @@ -50,11 +50,11 @@ namespace Modbus.Net.Tests _modbusTcpMachine.GetAddresses = addresses; _modbusTcpMachine2.GetAddresses = addresses; - await _modbusTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.Address); - var ans2 = await _modbusTcpMachine2.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["4X 1.0"].PlcValue, dic1["4X 1"]); - Assert.AreEqual(ans2["4X 1.0"].PlcValue, (ushort)dic1["4X 1"] % 256 * 256 + (ushort)dic1["4X 1"] / 256); + await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _modbusTcpMachine2.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans2["4X 1.0"].DeviceValue, (ushort)dic1["4X 1"] % 256 * 256 + (ushort)dic1["4X 1"] / 256); } } } diff --git a/Tests/Modbus.Net.Tests/MachineMethodTest.cs b/Tests/Modbus.Net.Tests/MachineMethodTest.cs index 926d64f..207d3bc 100644 --- a/Tests/Modbus.Net.Tests/MachineMethodTest.cs +++ b/Tests/Modbus.Net.Tests/MachineMethodTest.cs @@ -49,7 +49,7 @@ namespace Modbus.Net.Tests } }, true, 2, 0); var success = await baseMachine.GetMachineMethods().SetDatasAsync( - MachineSetDataType.Address, + MachineDataType.Address, new Dictionary { { @@ -57,10 +57,10 @@ namespace Modbus.Net.Tests } }); Assert.AreEqual(success, true); - var datas = await baseMachine.GetMachineMethods().GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(datas["0X 1.0"].PlcValue, 1); + var datas = await baseMachine.GetMachineMethods().GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(datas["0X 1.0"].DeviceValue, 1); success = await baseMachine.GetMachineMethods().SetDatasAsync( - MachineSetDataType.Address, + MachineDataType.Address, new Dictionary { { diff --git a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs index e0378ce..689330e 100644 --- a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs @@ -130,27 +130,27 @@ namespace Modbus.Net.Tests }, }; - await _modbusRtuMachine1.SetDatasAsync(MachineSetDataType.CommunicationTag, dic1); - await _modbusRtuMachine2.SetDatasAsync(MachineSetDataType.CommunicationTag, dic2); + await _modbusRtuMachine1.SetDatasAsync(MachineDataType.CommunicationTag, dic1); + await _modbusRtuMachine2.SetDatasAsync(MachineDataType.CommunicationTag, dic2); - var ans = await _modbusRtuMachine1.GetDatasAsync(MachineGetDataType.CommunicationTag); - var ans2 = await _modbusRtuMachine2.GetDatasAsync(MachineGetDataType.CommunicationTag); + var ans = await _modbusRtuMachine1.GetDatasAsync(MachineDataType.CommunicationTag); + var ans2 = await _modbusRtuMachine2.GetDatasAsync(MachineDataType.CommunicationTag); _modbusRtuMachine1.Disconnect(); _modbusRtuMachine2.Disconnect(); - Assert.AreEqual(ans["A1"].PlcValue, dic1["A1"]); - Assert.AreEqual(ans2["A1"].PlcValue, dic2["A1"]); - Assert.AreEqual(ans["A2"].PlcValue, dic1["A2"]); - Assert.AreEqual(ans2["A2"].PlcValue, dic2["A2"]); - Assert.AreEqual(ans["A3"].PlcValue, dic1["A3"]); - Assert.AreEqual(ans2["A3"].PlcValue, dic2["A3"]); - Assert.AreEqual(ans["A4"].PlcValue, dic1["A4"]); - Assert.AreEqual(ans2["A4"].PlcValue, dic2["A4"]); - Assert.AreEqual(ans["A5"].PlcValue, dic1["A5"]); - Assert.AreEqual(ans2["A5"].PlcValue, dic2["A5"]); - Assert.AreEqual(ans["A6"].PlcValue, dic1["A6"]); - Assert.AreEqual(ans2["A6"].PlcValue, dic2["A6"]); + Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans2["A1"].DeviceValue, dic2["A1"]); + Assert.AreEqual(ans["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans2["A2"].DeviceValue, dic2["A2"]); + Assert.AreEqual(ans["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans2["A3"].DeviceValue, dic2["A3"]); + Assert.AreEqual(ans["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans2["A4"].DeviceValue, dic2["A4"]); + Assert.AreEqual(ans["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans2["A5"].DeviceValue, dic2["A5"]); + Assert.AreEqual(ans["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans2["A6"].DeviceValue, dic2["A6"]); } } } diff --git a/Tests/Modbus.Net.Tests/ModbusTest.cs b/Tests/Modbus.Net.Tests/ModbusTest.cs index 5126087..03fb959 100644 --- a/Tests/Modbus.Net.Tests/ModbusTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusTest.cs @@ -53,15 +53,15 @@ namespace Modbus.Net.Tests _modbusTcpMachine.GetAddresses = addresses; _modbusAsciiMachine.GetAddresses = addresses; _modbusRtuMachine.GetAddresses = addresses; - await _modbusTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - await _modbusAsciiMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - await _modbusRtuMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.Address); - var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.Address); - var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["0X 1.0"].PlcValue, dic1["0X 1.0"]); - Assert.AreEqual(ans2["0X 1.0"].PlcValue, dic1["0X 1.0"]); - Assert.AreEqual(ans3["0X 1.0"].PlcValue, dic1["0X 1.0"]); + await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _modbusAsciiMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _modbusRtuMachine.SetDatasAsync(MachineDataType.Address, dic1); + var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); + var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans2["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans3["0X 1.0"].DeviceValue, dic1["0X 1.0"]); } [TestMethod] @@ -83,12 +83,12 @@ namespace Modbus.Net.Tests _modbusTcpMachine.GetAddresses = addresses; _modbusRtuMachine.GetAddresses = addresses; _modbusAsciiMachine.GetAddresses = addresses; - var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.Address); - var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.Address); - var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["1X 1.0"].PlcValue, 0); - Assert.AreEqual(ans2["1X 1.0"].PlcValue, 0); - Assert.AreEqual(ans3["1X 1.0"].PlcValue, 0); + var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); + var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans2["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans3["1X 1.0"].DeviceValue, 0); } [TestMethod] @@ -110,12 +110,12 @@ namespace Modbus.Net.Tests _modbusTcpMachine.GetAddresses = addresses; _modbusRtuMachine.GetAddresses = addresses; _modbusAsciiMachine.GetAddresses = addresses; - var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.Address); - var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.Address); - var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["3X 1.0"].PlcValue, 0); - Assert.AreEqual(ans2["3X 1.0"].PlcValue, 0); - Assert.AreEqual(ans3["3X 1.0"].PlcValue, 0); + var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); + var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans2["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans3["3X 1.0"].DeviceValue, 0); } [TestMethod] @@ -146,15 +146,15 @@ namespace Modbus.Net.Tests _modbusTcpMachine.GetAddresses = addresses; _modbusAsciiMachine.GetAddresses = addresses; _modbusRtuMachine.GetAddresses = addresses; - await _modbusTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - await _modbusAsciiMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - await _modbusRtuMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.Address); - var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.Address); - var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["4X 1.0"].PlcValue, dic1["4X 1"]); - Assert.AreEqual(ans2["4X 1.0"].PlcValue, dic1["4X 1"]); - Assert.AreEqual(ans3["4X 1.0"].PlcValue, dic1["4X 1"]); + await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _modbusAsciiMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _modbusRtuMachine.SetDatasAsync(MachineDataType.Address, dic1); + var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); + var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans2["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans3["4X 1.0"].DeviceValue, dic1["4X 1"]); } [TestMethod] @@ -245,32 +245,32 @@ namespace Modbus.Net.Tests _modbusTcpMachine.GetAddresses = addresses; _modbusRtuMachine.GetAddresses = addresses; _modbusAsciiMachine.GetAddresses = addresses; - await _modbusTcpMachine.SetDatasAsync(MachineSetDataType.CommunicationTag, dic1); - await _modbusRtuMachine.SetDatasAsync(MachineSetDataType.CommunicationTag, dic1); - await _modbusAsciiMachine.SetDatasAsync(MachineSetDataType.CommunicationTag, dic1); + await _modbusTcpMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); + await _modbusRtuMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); + await _modbusAsciiMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); - var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.CommunicationTag); - var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.CommunicationTag); - var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.CommunicationTag); + var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.CommunicationTag); + var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.CommunicationTag); + var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.CommunicationTag); - Assert.AreEqual(ans["A1"].PlcValue, dic1["A1"]); - Assert.AreEqual(ans["A2"].PlcValue, dic1["A2"]); - Assert.AreEqual(ans["A3"].PlcValue, dic1["A3"]); - Assert.AreEqual(ans["A4"].PlcValue, dic1["A4"]); - Assert.AreEqual(ans["A5"].PlcValue, dic1["A5"]); - Assert.AreEqual(ans["A6"].PlcValue, dic1["A6"]); - Assert.AreEqual(ans2["A1"].PlcValue, dic1["A1"]); - Assert.AreEqual(ans2["A2"].PlcValue, dic1["A2"]); - Assert.AreEqual(ans2["A3"].PlcValue, dic1["A3"]); - Assert.AreEqual(ans2["A4"].PlcValue, dic1["A4"]); - Assert.AreEqual(ans2["A5"].PlcValue, dic1["A5"]); - Assert.AreEqual(ans2["A6"].PlcValue, dic1["A6"]); - Assert.AreEqual(ans3["A1"].PlcValue, dic1["A1"]); - Assert.AreEqual(ans3["A2"].PlcValue, dic1["A2"]); - Assert.AreEqual(ans3["A3"].PlcValue, dic1["A3"]); - Assert.AreEqual(ans3["A4"].PlcValue, dic1["A4"]); - Assert.AreEqual(ans3["A5"].PlcValue, dic1["A5"]); - Assert.AreEqual(ans3["A6"].PlcValue, dic1["A6"]); + Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans2["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans2["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans2["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans2["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans2["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans2["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans3["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans3["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans3["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans3["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans3["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans3["A6"].DeviceValue, dic1["A6"]); } [TestMethod] diff --git a/Tests/Modbus.Net.Tests/SiemensTest.cs b/Tests/Modbus.Net.Tests/SiemensTest.cs index 6ecff1e..88c2224 100644 --- a/Tests/Modbus.Net.Tests/SiemensTest.cs +++ b/Tests/Modbus.Net.Tests/SiemensTest.cs @@ -44,10 +44,10 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine.GetAddresses = addresses; - await _siemensTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); + await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); - var ans = await _siemensTcpMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["Q 0.0"].PlcValue, dic1["Q 0.0"]); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["Q 0.0"].DeviceValue, dic1["Q 0.0"]); } [TestMethod] @@ -67,8 +67,8 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine.GetAddresses = addresses; - var ans = await _siemensTcpMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["I 0.0"].PlcValue, 0); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["I 0.0"].DeviceValue, 0); } [TestMethod] @@ -98,9 +98,9 @@ namespace Modbus.Net.Tests } }; - await _siemensTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - var ans = await _siemensTcpMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["M 0.0"].PlcValue, dic1["M 0"]); + await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["M 0.0"].DeviceValue, dic1["M 0"]); } [TestMethod] @@ -130,10 +130,10 @@ namespace Modbus.Net.Tests } }; - await _siemensTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); + await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); - var ans = await _siemensTcpMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["M 0.0"].PlcValue, dic1["M 0.0"]); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["M 0.0"].DeviceValue, dic1["M 0.0"]); } [TestMethod] @@ -162,10 +162,10 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine.GetAddresses = addresses; - await _siemensTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); + await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); - var ans = await _siemensTcpMachine.GetDatasAsync(MachineGetDataType.Address); - Assert.AreEqual(ans["DB2 0.0"].PlcValue, dic1["DB2 0.0"]); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans["DB2 0.0"].DeviceValue, dic1["DB2 0.0"]); } [TestMethod] @@ -254,14 +254,14 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine.GetAddresses = addresses; - await _siemensTcpMachine.SetDatasAsync(MachineSetDataType.CommunicationTag, dic1); - var ans = await _siemensTcpMachine.GetDatasAsync(MachineGetDataType.CommunicationTag); - Assert.AreEqual(ans["A1"].PlcValue, dic1["A1"]); - Assert.AreEqual(ans["A2"].PlcValue, dic1["A2"]); - Assert.AreEqual(ans["A3"].PlcValue, dic1["A3"]); - Assert.AreEqual(ans["A4"].PlcValue, dic1["A4"]); - Assert.AreEqual(ans["A5"].PlcValue, dic1["A5"]); - Assert.AreEqual(ans["A6"].PlcValue, dic1["A6"]); + await _siemensTcpMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.CommunicationTag); + Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans["A6"].DeviceValue, dic1["A6"]); } [TestCleanup]