using Quartz; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.Elevator; namespace WIDESEAWCS_Tasks { public class ElevatorJob : JobBase, IJob, IDisposable { public void Dispose() { GC.SuppressFinalize(this); } public Task Execute(IJobExecutionContext context) { try { // 从上下文中获取 JobParams 并转换为 Roast 类型 //CommonElevator elevator = (CommonElevator)context.JobDetail.JobDataMap.Get("JobParams"); CommonRoast elevator = (CommonRoast)context.JobDetail.JobDataMap.Get("JobParams"); // 初始化 AGV 变量 AGV agv = null; if (elevator == null) { throw new Exception("未找到提升机设备参数。"); } // 连接 AGV // 根据设备名称决定是正极还是负极 AGV List agvNames = new List() { "正极AGV", "负极AGV" }; //"正极AGV", foreach (var agvName in agvNames) { // 从存储中查找指定名称的设备 IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == agvName); if (device != null) { agv = (AGV)device; } else { ConsoleHelper.WriteErrorLine($"未找到{agvName}设备参数。"); continue; } var elevatorNamesValues = GetDBElevatorNamesValues(agvName); var agvNamesValues = GetDBAGVNamesValues(agvName); DeviceInteraction(elevator, agv, elevatorNamesValues, agvNamesValues); } } catch (Exception ex) { throw; } return Task.CompletedTask; } public static void DeviceInteraction(CommonRoast elevator, AGV agv, List elevatorNames, List agvNames) { if (agv.DeviceName == "正极AGV") { HandlePositiveAGV(elevator, agv, elevatorNames, agvNames); } else { HandleNegativeAGV(elevator, agv, elevatorNames, agvNames); } } private static void HandlePositiveAGV(CommonRoast elevator, AGV agv, List elevatorNames, List agvNames) { // 正极AGV只需要处理前两个信号 var elevatorSignal = elevator.Communicator.Read(elevatorNames[0], 100); var agvSignal = agv.Communicator.Read(agvNames[1], 100); agv.Communicator.Write(agvNames[0], elevatorSignal); elevator.Communicator.Write(elevatorNames[1], agvSignal); ConsoleHelper.WriteInfoLine($"正极AGV交互: 写入电梯信号[{elevatorSignal}]到{agvNames[0]}," + $"写入AGV信号[{agvSignal}]到{agvNames[1]}"); } private static void HandleNegativeAGV(CommonRoast elevator, AGV agv, List elevatorNames, List agvNames) { // 定义信号组处理(起始索引,操作类型,日志描述) var operations = new List<(int startIdx, string type, string desc)> { (0, "E→A", "基础信号交互"), (2, "A→E", "状态反馈"), (4, "E→A", "设备状态同步"), (6, "A→E", "任务指令"), (8, "E→A", "位置信息同步"), (10, "A→E", "单信号反馈"), (11, "A→E", "双信号反馈"), (13, "A→E", "单信号反馈"), (14, "E→A", "设备状态同步"), (16, "A→E", "运行指令"), (18, "E→A", "多信号同步"), (22, "A→E", "结束信号反馈") }; foreach (var op in operations) { ProcessSignalGroup( elevator, agv, elevatorNames, agvNames, op.startIdx, op.type, op.desc ); } } private static void ProcessSignalGroup(CommonRoast elevator, AGV agv, List elevatorNames, List agvNames, int startIdx, string operationType, string description) { const int GROUP_SIZE = 2; // 每组处理2个信号 // 特殊处理最后几个信号组 if (startIdx >= 18) { HandleSpecialSignals(elevator, agv, elevatorNames, agvNames, startIdx); return; } var values = new List(); var targets = new List(); // 根据操作类型处理信号 if (operationType == "E→A") { for (int i = 0; i < GROUP_SIZE; i++) { int idx = startIdx + i; if (idx >= elevatorNames.Count) break; var value = elevator.Communicator.Read(elevatorNames[idx], 100); agv.Communicator.Write(agvNames[idx], value); values.Add(value); targets.Add(agvNames[idx]); if (description == "单信号反馈") break; } } else if (operationType == "A→E") { for (int i = 0; i < GROUP_SIZE; i++) { int idx = startIdx + i; if (idx >= agvNames.Count) break; var value = agv.Communicator.Read(agvNames[idx], 100); elevator.Communicator.Write(elevatorNames[idx], value); values.Add(value); targets.Add(elevatorNames[idx]); if (description == "单信号反馈") break; } } // 生成动态日志描述 var logValues = string.Join("], [", values); var logTargets = string.Join(",", targets); ConsoleHelper.WriteInfoLine($"负极AGV交互({description}): 传输信号组[{logValues}]到目标地址[{logTargets}]"); } private static void HandleSpecialSignals(CommonRoast elevator, AGV agv, List elevatorNames, List agvNames, int startIdx) { // 处理18-21号电梯信号(4个信号) var elevatorSignals = Enumerable.Range(18, 4) .Select(i => elevator.Communicator.Read(elevatorNames[i], 100)) .ToList(); for (int i = 0; i < 4; i++) { agv.Communicator.Write(agvNames[18 + i], elevatorSignals[i]); } // 处理22-23号AGV信号 var agvSignals = Enumerable.Range(22, 2) .Select(i => agv.Communicator.Read(agvNames[i], 100)) .ToList(); for (int i = 0; i < 2; i++) { elevator.Communicator.Write(elevatorNames[22 + i], agvSignals[i]); } ConsoleHelper.WriteInfoLine($"负极AGV交互(特殊信号组): " + $"写入电梯信号[{string.Join(",", elevatorSignals)}]到AGV," + $"读取AGV信号[{string.Join(",", agvSignals)}]到电梯"); } private List GetDBElevatorNamesValues(string deviceName) { List dbNamesValues = null; if (deviceName == "正极AGV") { dbNamesValues = new List() { "DB1002.1600", "DB1002.1700" }; } else { dbNamesValues = new List() { "DB1002.0", "DB1002.600", "DB1002.100", "DB1002.700", "DB1002.1000", "DB1002.1200", "DB1002.1100", "DB1002.1300", "DB1002.1800", "DB1002.1200", "DB1002.11400", "DB1002.1900", "DB1002.2100", "DB1002.2300", "DB1002.2400", "DB1002.2600", "DB1002.2500", "DB1002.2700", "DB1002.2000", "DB1002.2800", "DB1002.3000", "DB1002.2200", "DB1002.2900", "DB1002.3100" }; } return dbNamesValues; } private List GetDBAGVNamesValues(string deviceName) { List dbNamesValues = null; if (deviceName == "正极AGV") { dbNamesValues = new List() { "DB1002.4000", "DB1002.4100" }; } else { dbNamesValues = new List() { "DB1002.200", "DB1002.600", "DB1002.300", "DB1002.700", "DB1002.1000", "DB1002.1400", "DB1002.1100", "DB1002.1500", "DB1002.17800", "DB1002.1400", "DB1002.2200", "DB1002.17900", "DB1002.18100", "DB1002.18300", "DB1002.18400", "DB1002.18600", "DB1002.18500", "DB1002.18700", "DB1002.18000", "DB1002.18800", "DB1002.19000", "DB1002.18200", "DB1002.18900", "DB1002.19100" }; } return dbNamesValues; } } }