diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs
index 4233b32..7881332 100644
--- a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs
+++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs
@@ -3,6 +3,7 @@ using Quartz.Impl;
using Quartz.Impl.Matchers;
using System;
using System.Collections.Generic;
+using System.Reflection.PortableExecutable;
using System.Threading.Tasks;
namespace Modbus.Net
@@ -353,7 +354,7 @@ namespace Modbus.Net
/// 写入数据的设备实例
///
///
- public async Task To(string queryId, IMachineMethodData machine)
+ public async Task To(string queryId, IMachineMethodData machine)
{
JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name);
@@ -370,7 +371,7 @@ namespace Modbus.Net
await _scheduler.AddJob(job, true);
- return new MachineSetJobScheduler(_scheduler, _trigger, jobKey);
+ return new MachineDealJobScheduler(_scheduler, _trigger, jobKey);
}
///
@@ -394,6 +395,63 @@ namespace Modbus.Net
await _scheduler.Start();
}
}
+
+ ///
+ /// 处理写返回任务
+ ///
+ public sealed class MachineDealJobScheduler
+ {
+ private IScheduler _scheduler;
+
+ private ITrigger _trigger;
+
+ private JobKey _parentJobKey;
+
+ ///
+ /// 处理写返回任务
+ ///
+ /// 调度器
+ /// 触发器
+ /// 父任务的键
+ public MachineDealJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey)
+ {
+ _scheduler = scheduler;
+
+ _trigger = trigger;
+
+ _parentJobKey = parentJobKey;
+ }
+
+ ///
+ /// 处理写返回
+ ///
+ /// 任务ID,每个触发器唯一
+ /// 成功回调方法
+ /// 失败回调方法
+ ///
+ ///
+ public async Task Deal(string queryId = null, Func onSuccess = null, Func onFailure = null)
+ {
+ if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, _parentJobKey);
+ 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("OnSuccess", onSuccess);
+ job.JobDataMap.Put("OnFailure", onFailure);
+
+ 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);
+
+ return new MachineSetJobScheduler(_scheduler, _trigger, jobKey);
+ }
+ }
///
/// 获取数据任务
@@ -458,9 +516,44 @@ namespace Modbus.Net
if (valuesSet == null && values != null)
valuesSet = ((Dictionary)values).MapGetValuesToSetValues();
- if (valuesSet == null) throw new NullReferenceException("Set value is null");
+ if (valuesSet == null)
+ {
+ context.JobDetail.JobDataMap.Put("Success", false);
+ return;
+ }
var success = await (machine as IMachineMethodData)!.SetDatasAsync((MachineDataType)machineDataType, (Dictionary)valuesSet);
+ context.JobDetail.JobDataMap.Put("Success", success);
+ }
+ }
+
+ ///
+ /// 处理写返回任务
+ ///
+ public class MachineDealDataJob : IJob
+ {
+ ///
+ public async Task Execute(IJobExecutionContext context)
+ {
+ object success;
+ object onSuccess;
+ object onFailure;
+ context.JobDetail.JobDataMap.TryGetValue("Success", out success);
+ context.JobDetail.JobDataMap.TryGetValue("OnSuccess", out onSuccess);
+ context.JobDetail.JobDataMap.TryGetValue("OnFailure", out onFailure);
+ bool? successValue = (bool?)success;
+ if (successValue == true && onSuccess != null)
+ {
+ await ((Func)onSuccess)();
+ }
+ if (successValue == false && onFailure != null)
+ {
+ await ((Func)onFailure)();
+ }
+
+ context.JobDetail.JobDataMap.Remove("Success");
+ context.JobDetail.JobDataMap.Remove("OnSuccess");
+ context.JobDetail.JobDataMap.Remove("OnFailure");
}
}
}
\ No newline at end of file
diff --git a/Samples/MachineJob/Worker.cs b/Samples/MachineJob/Worker.cs
index eded1e4..85f528f 100644
--- a/Samples/MachineJob/Worker.cs
+++ b/Samples/MachineJob/Worker.cs
@@ -28,11 +28,11 @@ namespace MachineJob.Service
new AddressUnit() { Area = "4X", Address = 10, DataType = typeof(short), Id = "10", Name = "Test10" }
};
- IMachine machine = new ModbusMachine("ModbusMachine1", ModbusType.Tcp, "192.168.0.161", _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", _addresses, true, 3, 2, Endian.BigEndianLsb);
- 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.Run();
- //await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 5).Result.Apply(machine2.Id + ".Apply", null, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery", QueryConsole2).Result.To(machine2.Id + ".To2", machine2).Result.From(machine2.Id, machine2, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery2", QueryConsole).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.Deal(machine.Id+".Deal", OnSuccess, OnFailure).Result.Run();
+ //await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 5).Result.Apply(machine2.Id + ".Apply", null, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery", QueryConsole2).Result.To(machine2.Id + ".To", machine2).Result.Deal(machine.Id + ".Deal", OnSuccess, OnFailure).Result.From(machine2.Id, machine2, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery2", QueryConsole).Result.Run();
}
public override async Task StopAsync(CancellationToken cancellationToken)
@@ -40,6 +40,18 @@ namespace MachineJob.Service
await MachineJobSchedulerCreator.CancelJob("Trigger1");
}
+ public Task OnSuccess()
+ {
+ Console.WriteLine("дɹ");
+ return Task.CompletedTask;
+ }
+
+ public Task OnFailure()
+ {
+ Console.WriteLine("дʧ");
+ return Task.CompletedTask;
+ }
+
private Dictionary QueryConsole(DataReturnDef dataReturnDef)
{
var values = dataReturnDef.ReturnValues;
diff --git a/Tests/Modbus.Net.PersistedTests/Program.cs b/Tests/Modbus.Net.PersistedTests/Program.cs
index b622d6b..c3696df 100644
--- a/Tests/Modbus.Net.PersistedTests/Program.cs
+++ b/Tests/Modbus.Net.PersistedTests/Program.cs
@@ -101,7 +101,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Appl
{
"4X 3.0", r.Next() % 65536
}
-}, MachineDataType.Address).Result.To(machine.Id + ".To", machine).Result.Run();
+}, MachineDataType.Address).Result.To(machine.Id + ".To", machine).Result.Deal().Result.Run();
await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.ApplyTo(machine2.Id + ".Apply", new Dictionary() {{
"4X 1.0", r.Next() % 65536
},
@@ -111,7 +111,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.Appl
{
"4X 3.0", r.Next() % 65536
}
-}, MachineDataType.Address).Result.To(machine2.Id + ".To", machine2).Result.Run();
+}, MachineDataType.Address).Result.To(machine2.Id + ".To", machine2).Result.Deal().Result.Run();
await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.ApplyTo(machine3.Id + ".Apply", new Dictionary() {{
"4X 1.0", r.Next() % 65536
},
@@ -121,5 +121,5 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.Appl
{
"4X 3.0", r.Next() % 65536
}
-}, MachineDataType.Address).Result.To(machine3.Id + ".To", machine3).Result.Run();
+}, MachineDataType.Address).Result.To(machine3.Id + ".To", machine3).Result.Deal().Result.Run();
Console.ReadLine();
\ No newline at end of file