using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HslCommunication.WebSocket; using Quartz; using WIDESEAWCS_Common; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; namespace WIDESEAWCS_Tasks { /// /// 通用传送带灯光控制任务
/// 从PLC读取站点状态和释放信号,更新灯光状态字典,并设置对应的PLC信号
/// 主要功能:
/// 1. 读取PLC中DB15.922.0和DB15.924.0的16位布尔数组作为站点状态和释放信号
/// 2. 根据设备子码分组更新LightStatusStorage中的状态字典
/// 3. 根据当前灯光状态设置PLC对应的完成/错误/工作中/语音信号
/// 异常处理:记录设备代码和名称相关的异常信息 ///
[DisallowConcurrentExecution] public class CommonConveyorLightJob : JobBase, IJob { private readonly ITaskRepository _taskRepository; private readonly WebSocketServer _webSocketServer; private readonly IContainerRepository _containerRepository; public CommonConveyorLightJob(ITaskRepository taskRepository, WebSocketServer webSocketServer) { _taskRepository = taskRepository; _webSocketServer = webSocketServer; } public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null && value is OtherDevice otherDevice) { try { bool[] stationStatusArray = otherDevice.Communicator.Read("DB15.922.0", 16); bool[] releaseArray = otherDevice.Communicator.Read("DB15.924.0", 16); string? dbAddress = otherDevice.DeviceProDTOs.OrderBy(x => x.DeviceProOffset).Select(x => x.DeviceProAddress).FirstOrDefault(); if (!string.IsNullOrEmpty(dbAddress)) { List deviceChildCodes = otherDevice.DeviceProDTOs.GroupBy(x => x.DeviceChildCode).Select(x => x.Key).ToList(); for (int i = 0; i < deviceChildCodes.Count; i++) { if (LightStatusStorage.StationStautsDic.ContainsKey(deviceChildCodes[i])) { LightStatusStorage.StationStautsDic[deviceChildCodes[i]] = stationStatusArray[i]; } else { LightStatusStorage.StationStautsDic.Add(deviceChildCodes[i], stationStatusArray[i]); } if (LightStatusStorage.StationReleaseDic.ContainsKey(deviceChildCodes[i])) { LightStatusStorage.StationReleaseDic[deviceChildCodes[i]] = releaseArray[i]; } else { LightStatusStorage.StationReleaseDic.Add(deviceChildCodes[i], releaseArray[i]); } if (!LightStatusStorage.LightStatusDic.ContainsKey(deviceChildCodes[i])) { LightStatusStorage.LightStatusDic.Add(deviceChildCodes[i], LightStatusEnum.None); if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]); } else { if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.LightCompleted) { if (!otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightCompleted, true, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]); } else if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.LightError) { if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]); if (!otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightError, true, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]); } else if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.LightWorking) { if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]); if (!otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightWorking, true, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]); } else if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.Ready) { if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]); if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i])) otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]); } } } } } catch (Exception ex) { WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", ex.Message, ex); } } else { WriteError(nameof(CommonConveyorLightJob), "参数错误,未传递设备参数或设备类型错误"); } return Task.CompletedTask; } } }