diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs index f3c5e7b..14f0e1f 100644 --- a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs +++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs @@ -32,26 +32,44 @@ namespace Modbus.Net public sealed class MachineJobSchedulerCreator { - public static async Task CreateScheduler(string triggerKey, int count, double interval) + public static async Task CreateScheduler(string triggerKey, int count = 0, double interval = 1) { IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); ITrigger trigger; if (count >= 0) trigger = TriggerBuilder.Create() - .WithIdentity("Modbus.Net.DataQuery.Trigger." + triggerKey, "Modbus.Net.DataQuery.Group") + .WithIdentity(triggerKey, "Modbus.Net.DataQuery.Group."+ triggerKey) .StartNow() .WithSimpleSchedule(b => b.WithInterval(TimeSpan.FromSeconds(interval)).WithRepeatCount(count)) .Build(); else trigger = TriggerBuilder.Create() - .WithIdentity("Modbus.Net.DataQuery.Trigger." + triggerKey, "Modbus.Net.DataQuery.Group") + .WithIdentity(triggerKey, "Modbus.Net.DataQuery.Group."+ triggerKey) .StartNow() .WithSimpleSchedule(b => b.WithInterval(TimeSpan.FromSeconds(interval)).RepeatForever()) .Build(); + var listener = new JobChainingJobListenerWithDataMap("Modbus.Net.DataQuery.Chain." + triggerKey, new string[1] { "Value" }); + scheduler.ListenerManager.AddJobListener(listener, GroupMatcher.GroupEquals("Modbus.Net.DataQuery.Group." + triggerKey)); + + if (await scheduler.GetTrigger(new TriggerKey(triggerKey)) != null) + { + await scheduler.UnscheduleJob(new TriggerKey(triggerKey, "Modbus.Net.DataQuery.Group." + triggerKey)); + } + var jobKeys = await scheduler.GetJobKeys(GroupMatcher.GroupEquals("Modbus.Net.DataQuery.Group." + triggerKey)); + await scheduler.DeleteJobs(jobKeys); + return new MachineGetJobScheduler(scheduler, trigger); } + + public static async void CancelJob(string triggerKey) + { + IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); + var jobKeys = await scheduler.GetJobKeys(GroupMatcher.GroupEquals("Modbus.Net.DataQuery.Group." + triggerKey)); + await scheduler.DeleteJobs(jobKeys); + await scheduler.UnscheduleJob(new TriggerKey(triggerKey, "Modbus.Net.DataQuery.Group." + triggerKey)); + } } public sealed class MachineGetJobScheduler @@ -60,24 +78,44 @@ namespace Modbus.Net ITrigger _trigger; + JobKey _parentJobKey = null; + public MachineGetJobScheduler(IScheduler scheduler, ITrigger trigger) { _scheduler = scheduler; _trigger = trigger; } + public MachineGetJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey) + { + _scheduler = scheduler; + _trigger = trigger; + _parentJobKey = parentJobKey; + } + public async Task From(string queryId, IMachineMethodData machine, MachineDataType machineDataType) { - JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group"); + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); IJobDetail job = JobBuilder.Create() .WithIdentity(jobKey) + .StoreDurably(true) .Build(); job.JobDataMap.Put("DataType", machineDataType); job.JobDataMap.Put("Machine", machine); - await _scheduler.ScheduleJob(job, _trigger); + if (_parentJobKey != null) + { + var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + listener.AddJobChainLink(_parentJobKey, jobKey); + + await _scheduler.AddJob(job, true); + } + else + { + await _scheduler.ScheduleJob(job, _trigger); + } return new MachineQueryJobScheduler(_scheduler, _trigger, jobKey); } @@ -89,20 +127,63 @@ namespace Modbus.Net 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"); + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); IJobDetail job = JobBuilder.Create>() .WithIdentity(jobKey) + .StoreDurably(true) .Build(); job.JobDataMap.Put("DataType", machineDataType); job.JobDataMap.Put("Value", values); job.JobDataMap.Put("QueryMethod", null); - await _scheduler.ScheduleJob(job, _trigger); + if (_parentJobKey != null) + { + var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + listener.AddJobChainLink(_parentJobKey, jobKey); + + await _scheduler.AddJob(job, true); + } + else + { + await _scheduler.ScheduleJob(job, _trigger); + } return new MachineQueryJobScheduler(_scheduler, _trigger, jobKey); } + + public Task ApplyTo(string queryId, Dictionary values, MachineDataType machineDataType) + { + return ApplyTo(queryId, values, machineDataType); + } + + public async Task ApplyTo(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); + + IJobDetail job = JobBuilder.Create>() + .WithIdentity(jobKey) + .StoreDurably(true) + .Build(); + + job.JobDataMap.Put("DataType", machineDataType); + job.JobDataMap.Put("Value", values); + + if (_parentJobKey != null) + { + var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + listener.AddJobChainLink(_parentJobKey, jobKey); + + await _scheduler.AddJob(job, true); + } + else + { + await _scheduler.ScheduleJob(job, _trigger); + } + + return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); + } } public sealed class MachineQueryJobScheduler @@ -127,20 +208,9 @@ namespace Modbus.Net public async Task Query(string queryId = null, Func> QueryDataFunc = null) where TMachineKey : IEquatable { - JobChainingJobListenerWithDataMap listener; - try - { - listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain") as JobChainingJobListenerWithDataMap; - } - catch - { - listener = new JobChainingJobListenerWithDataMap("Modbus.Net.DataQuery.Chain", new string[1]{ "Value" }); - _scheduler.ListenerManager.AddJobListener(listener, GroupMatcher.GroupEquals("Modbus.Net.DataQuery.Group")); - } + if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, _parentJobKey); - if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, listener, _parentJobKey); - - JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group"); + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); IJobDetail job = JobBuilder.Create>() .WithIdentity(jobKey) @@ -149,11 +219,12 @@ namespace Modbus.Net job.JobDataMap.Put("QueryMethod", QueryDataFunc); + var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; listener.AddJobChainLink(_parentJobKey, jobKey); await _scheduler.AddJob(job, true); - return new MachineSetJobScheduler(_scheduler, _trigger, listener, jobKey); + return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); } } @@ -163,24 +234,20 @@ namespace Modbus.Net ITrigger _trigger; - JobChainingJobListenerWithDataMap _listener; - JobKey _parentJobKey; - public MachineSetJobScheduler(IScheduler scheduler, ITrigger trigger, JobChainingJobListenerWithDataMap listener, JobKey parentJobKey) + public MachineSetJobScheduler(IScheduler scheduler, ITrigger trigger, 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"); + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); IJobDetail job = JobBuilder.Create() .WithIdentity(jobKey) @@ -189,11 +256,17 @@ namespace Modbus.Net job.JobDataMap.Put("Machine", machine); - _listener.AddJobChainLink(_parentJobKey, jobKey); + var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + listener.AddJobChainLink(_parentJobKey, jobKey); await _scheduler.AddJob(job, true); - return new MachineSetJobScheduler(_scheduler, _trigger, _listener, jobKey); + return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); + } + + 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() @@ -208,8 +281,8 @@ namespace Modbus.Net { object machine; object machineDataType; - context.MergedJobDataMap.TryGetValue("Machine", out machine); - context.MergedJobDataMap.TryGetValue("DataType", out machineDataType); + context.JobDetail.JobDataMap.TryGetValue("Machine", out machine); + context.JobDetail.JobDataMap.TryGetValue("DataType", out machineDataType); var values = await (machine as IMachineMethodData)!.GetDatasAsync((MachineDataType)machineDataType); context.JobDetail.JobDataMap.Put("Value", values); @@ -224,14 +297,14 @@ namespace Modbus.Net object machine; object values; object QueryMethod; - context.MergedJobDataMap.TryGetValue("Machine", out machine); - context.MergedJobDataMap.TryGetValue("Value", out values); - context.MergedJobDataMap.TryGetValue("QueryMethod", out QueryMethod); + context.JobDetail.JobDataMap.TryGetValue("Machine", out machine); + context.JobDetail.JobDataMap.TryGetValue("Value", out values); + context.JobDetail.JobDataMap.TryGetValue("QueryMethod", out QueryMethod); Func> QueryMethodDispatch = (Func>)QueryMethod; if (QueryMethod != null) { - context.JobDetail.JobDataMap.Put("Value", QueryMethodDispatch(new DataReturnDef() { MachineId = ((IMachineProperty)machine).GetMachineIdString(), ReturnValues = (Dictionary)values })); + context.JobDetail.JobDataMap.Put("Value", QueryMethodDispatch(new DataReturnDef() { MachineId = machine == null ? null : ((IMachineProperty)machine).GetMachineIdString(), ReturnValues = (Dictionary)values })); await context.Scheduler.AddJob(context.JobDetail, true, false); } } @@ -244,9 +317,9 @@ namespace Modbus.Net object machine; object machineDataType; object values; - context.MergedJobDataMap.TryGetValue("Machine", out machine); - context.MergedJobDataMap.TryGetValue("DataType", out machineDataType); - context.MergedJobDataMap.TryGetValue("Value", out values); + context.JobDetail.JobDataMap.TryGetValue("Machine", out machine); + context.JobDetail.JobDataMap.TryGetValue("DataType", out machineDataType); + context.JobDetail.JobDataMap.TryGetValue("Value", out values); Dictionary valuesSet = ((Dictionary)values).MapGetValuesToSetValues(); var success = await (machine as IMachineMethodData)!.SetDatasAsync((MachineDataType)machineDataType, valuesSet); diff --git a/Samples/MachineJob/Program.cs b/Samples/MachineJob/Program.cs index fa7a0fc..5b5df1c 100644 --- a/Samples/MachineJob/Program.cs +++ b/Samples/MachineJob/Program.cs @@ -17,9 +17,11 @@ 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, 1, 2, Endian.BigEndianLsb); +IMachine machine = new ModbusMachine("ModbusMachine1", ModbusType.Tcp, "192.168.0.172", _addresses, true, 1, 2, Endian.BigEndianLsb); +IMachine machine2 = new ModbusMachine("ModbusMachine2", ModbusType.Tcp, "192.168.0.172:503", _addresses, true, 3, 2, Endian.BigEndianLsb); -await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 5).Result.From(machine.Id, machine, MachineDataType.Name).Result.Query("ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Run(); +await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 5).Result.From(machine.Id, machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.To(machine2.Id + ".To", machine2).Result.Run(); +//await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 5).Result.Apply(machine2.Id + ".Apply", null, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery2", QueryConsole2).Result.To(machine2.Id + ".To2", machine2).Result.From(machine2.Id, machine2, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.Run(); Console.ReadLine(); @@ -31,31 +33,77 @@ Dictionary QueryConsole(DataReturnDef dataReturnDef) Console.WriteLine(dataReturnDef.MachineId + " " + value.Key + " " + value.Value.DeviceValue); } - using (var context = new DatabaseWriteContext()) + try { - context.DatabaseWrites.Add(new DatabaseWriteEntity + using (var context = new DatabaseWriteContext()) { - Value1 = values["Test1"].DeviceValue, - Value2 = values["Test2"].DeviceValue, - Value3 = values["Test3"].DeviceValue, - Value4 = values["Test4"].DeviceValue, - Value5 = values["Test5"].DeviceValue, - Value6 = values["Test6"].DeviceValue, - Value7 = values["Test7"].DeviceValue, - Value8 = values["Test8"].DeviceValue, - Value9 = values["Test9"].DeviceValue, - Value10 = values["Test10"].DeviceValue, - UpdateTime = DateTime.Now, - }); - context.SaveChanges(); + context.DatabaseWrites.Add(new DatabaseWriteEntity + { + Value1 = values["Test1"].DeviceValue, + Value2 = values["Test2"].DeviceValue, + Value3 = values["Test3"].DeviceValue, + Value4 = values["Test4"].DeviceValue, + Value5 = values["Test5"].DeviceValue, + Value6 = values["Test6"].DeviceValue, + Value7 = values["Test7"].DeviceValue, + Value8 = values["Test8"].DeviceValue, + Value9 = values["Test9"].DeviceValue, + Value10 = values["Test10"].DeviceValue, + UpdateTime = DateTime.Now, + }); + context.SaveChanges(); + } + } + catch + { + //ignore } + Random r = new Random(); foreach (var value in values) { - value.Value.DeviceValue = new Random().Next(65536) - 32768; + value.Value.DeviceValue = r.Next(65536) - 32768; } return values; } +Dictionary QueryConsole2(DataReturnDef dataReturnDef) +{ + Random r = new Random(); + var datas = new Dictionary() + { + { + "Test1", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test2", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test3", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test4", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test5", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test6", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test7", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test8", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test9", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + }, + { + "Test10", new ReturnUnit(){DeviceValue = r.Next(65536) - 32768 } + } + }; + return datas; +} diff --git a/Tests/Modbus.Net.PersistedTests/Program.cs b/Tests/Modbus.Net.PersistedTests/Program.cs index f777084..5eee48a 100644 --- a/Tests/Modbus.Net.PersistedTests/Program.cs +++ b/Tests/Modbus.Net.PersistedTests/Program.cs @@ -102,7 +102,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Appl "4X 3.0", new ReturnUnit(){DeviceValue = r.Next() % 65536 } } }, MachineDataType.Address).Result.Query().Result.To(machine.Id + ".To", machine).Result.Run(); -await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Apply(machine2.Id + ".Apply", new Dictionary() {{ +await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.Apply(machine2.Id + ".Apply", new Dictionary() {{ "4X 1.0", new ReturnUnit(){DeviceValue = r.Next() % 65536 } }, { @@ -112,7 +112,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Appl "4X 3.0", new ReturnUnit(){DeviceValue = r.Next() % 65536 } } }, MachineDataType.Address).Result.Query().Result.To(machine2.Id + ".To", machine2).Result.Run(); -await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Apply(machine3.Id + ".Apply", new Dictionary() {{ +await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.Apply(machine3.Id + ".Apply", new Dictionary() {{ "4X 1.0", new ReturnUnit(){DeviceValue = r.Next() % 65536 } }, {