using HslCommunication.WebSocket; using Newtonsoft.Json; using Quartz; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Core.HttpContextUser; using WIDESEAWCS_Core; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_TelescopicService; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_Core.Helper; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class AlarmResetJob : JobBase, IJob { private readonly IAlarmResetHsyServer _alarmResetHsyServer; private readonly ISys_UserService _UserService; WebSocketServer _webSocketServer; private readonly Idt_ErrormsginfoService _ErrormsginfoService; private readonly AlarmResetHsyServer _alarmResetHsy; //private static readonly object _lockObj = new object(); //加锁 // 增添的字典跟踪报警为每个装置 Quartz 默认每次调度任务时会重新创建 private static readonly Dictionary _leftAlarmStates = new Dictionary() //加锁 { ["M109"] = false,//伺服报警 ["M111"] = false,//其他报警 ["M110"] = false,//急停报警 ["M120"] = false,//障碍报警 }; private static readonly Dictionary _rightAlarmStates = new Dictionary() { ["M109"] = false,//伺服报警 ["M111"] = false,//其他报警 ["M110"] = false,//急停报警 ["M120"] = false,//障碍报警 }; public AlarmResetJob(Idt_ErrormsginfoService errormsginfoService, WebSocketServer webSocketServer, IAlarmResetHsyServer alarmResetHsyServer, ISys_UserService UserService) { _webSocketServer = webSocketServer; _alarmResetHsyServer = alarmResetHsyServer; _UserService = UserService; _ErrormsginfoService = errormsginfoService; } public Task Execute(IJobExecutionContext context) { try { if (!int.TryParse(AppSettings.Get("DepartmentID"), out int deid)) { Console.WriteLine("配置项 DepartmentID 无法转换为整数"); } var devices = GetDevicesByDeptId(deid); if (devices != null) { // Left PLC processing try { if (devices.Value.left.IsConnected) { var leftPLcstuck1 = devices.Value.left.Communicator.Read("M109"); // Servo alarm var leftPLcOher1 = devices.Value.left.Communicator.Read("M111"); // Other alarm var leftscram = devices.Value.left.Communicator.Read("M110"); // Emergency stop var leftstop = devices.Value.left.Communicator.Read("M120"); // Obstacle stop var leftPLcNowAdd = devices.Value.left.Communicator.Read("D80"); Console.WriteLine($"{devices.Value.left.DeviceName}:卡住报警{leftPLcstuck1},其他报警{leftPLcOher1}"); // Check and record alarms only when state changes from false to true if (leftPLcstuck1 && !_leftAlarmStates["M109"]) { string text = $"检8道左侧警惕机构:伸缩卡住报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, leftPLcstuck1); _leftAlarmStates["M109"] = true; } else if (!leftPLcstuck1) { _leftAlarmStates["M109"] = false; } if (leftPLcOher1 && !_leftAlarmStates["M111"]) { string text = $"检8道左侧警惕机构:其他故障报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, leftPLcOher1); _leftAlarmStates["M111"] = true; } else if (!leftPLcOher1) { _leftAlarmStates["M111"] = false; } if (leftscram && !_leftAlarmStates["M110"]) { string text = $"检8道左侧警惕机构:急停报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, leftscram); _leftAlarmStates["M110"] = true; } else if (!leftscram) { _leftAlarmStates["M110"] = false; } if (leftstop && !_leftAlarmStates["M120"]) { string text = $"检8道左侧警惕机构:遇障碍停止报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, leftstop); _leftAlarmStates["M120"] = true; } else if (!leftstop) { _leftAlarmStates["M120"] = false; } _webSocketServer.PublishAllClientPayload(JsonConvert.SerializeObject(new { device = "左Plc", Liftvalue = leftPLcNowAdd })); } } catch (Exception) { string text = $"轨道{deid}:左PLC未连接"; //var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, false); } // Right PLC processing try { if (devices.Value.right.IsConnected) { var rightPLcSuck = devices.Value.right.Communicator.Read("M109"); // Servo alarm var rightPLcOher = devices.Value.right.Communicator.Read("M111"); // Other alarm var rightscram = devices.Value.right.Communicator.Read("M110"); // Emergency stop var rightstop = devices.Value.right.Communicator.Read("M120"); // Obstacle stop var rightPLcNowAdd = devices.Value.right.Communicator.Read("D80"); Console.WriteLine($"{devices.Value.right.DeviceName}:卡住报警{rightPLcSuck},其他报警{rightPLcOher}"); // Check and record alarms only when state changes from false to true if (rightPLcSuck && !_rightAlarmStates["M109"]) { string text = $"检8道右侧警惕机构:报警伸缩卡住报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, rightPLcSuck); _rightAlarmStates["M109"] = true; } else if (!rightPLcSuck) { _rightAlarmStates["M109"] = false; } if (rightPLcOher && !_rightAlarmStates["M111"]) { string text = $"检8道右侧警惕机构:其他故障报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, rightPLcOher); _rightAlarmStates["M111"] = true; } else if (!rightPLcOher) { _rightAlarmStates["M111"] = false; } if (rightscram && !_rightAlarmStates["M110"]) { string text = $"检8道右侧警惕机构:急停报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, rightscram); _rightAlarmStates["M110"] = true; } else if (!rightscram) { _rightAlarmStates["M110"] = false; } if (rightstop && !_rightAlarmStates["M120"]) { string text = $"检8道右侧警惕机构:遇障碍停止报警"; var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, rightstop); _rightAlarmStates["M120"] = true; } else if (!rightstop) { _rightAlarmStates["M120"] = false; } _webSocketServer.PublishAllClientPayload(JsonConvert.SerializeObject(new { device = "右Plc", Rightvalue = rightPLcNowAdd })); } } catch (Exception) { string text = $"轨道{deid}:右PLC未连接"; //var reslut = _alarmResetHsyServer.AddAlarmHsy(deid, text, false); } var alrt = _alarmResetHsyServer.GetWebSocketInfo(deid); _webSocketServer.PublishAllClientPayload(JsonConvert.SerializeObject(alrt)); } } catch (Exception ex) { _ErrormsginfoService.UpdateErrorMsg(ex.Message, 1); Console.WriteLine("错误信息:" + ex.Message); Console.WriteLine(ex.StackTrace); } return Task.CompletedTask; } public (OtherDevice left, OtherDevice right)? GetDevicesByDeptId(int deptId) { int baseCode = 1 + (deptId - 1) * 2; string leftCode = $"SSG{baseCode.ToString("D3")}"; string rightCode = $"SSG{(baseCode + 1).ToString("D3")}"; var left = (OtherDevice)Storage.Devices.Find(x => x.DeviceCode == leftCode); var right = (OtherDevice)Storage.Devices.Find(x => x.DeviceCode == rightCode); return (left, right); } } }