using Autofac.Core; using HslCommunication; using HslCommunication.Core; using HslCommunication.WebSocket; using Microsoft.Extensions.Hosting; using Microsoft.VisualBasic.FileIO; using Newtonsoft.Json; using Quartz; using SixLabors.ImageSharp.PixelFormats; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_Model.Models.System; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_Tasks.OHT; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class ZXJJob : JobBase, IJob { public static bool W_ZXJ_Heat = true; public static bool W_TC_Heat = true; public static bool W_GZJ_Heat = true; private readonly ITaskService _taskService; private readonly Idt_ThicknessHtyService _IThicknessHtyService; private readonly Idt_WeightHtyService _IWeightHtyService; WebSocketServer _webSocketServer; private readonly Idt_ErrormsginfoService _ErrormsginfoService; public ZXJJob(ITaskService taskService, WebSocketServer webSocketServer,Idt_ErrormsginfoService errormsginfoService, Idt_ThicknessHtyService ThicknessHtyService, Idt_WeightHtyService WeightHtyService) { _taskService = taskService;//注入 _webSocketServer = webSocketServer; _ErrormsginfoService = errormsginfoService; _IThicknessHtyService = ThicknessHtyService; _IWeightHtyService = WeightHtyService; } public Task Execute(IJobExecutionContext context) { //return Task.CompletedTask; bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { try { //天车PLC对象 OtherDevice TCevice = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "天车"); if (TCevice.Communicator.IsConnected) { #region 读取天车设备数据 OHTJob.oHTReadData.R_HeartBeat = TCevice.GetValue(DeviceDBName.R_HeartBeat); OHTJob.oHTReadData.R_RunMode = TCevice.GetValue(DeviceDBName.R_RunMode); OHTJob.oHTReadData.R_RunState = TCevice.GetValue(DeviceDBName.R_RunState); OHTJob.oHTReadData.R_AlarmCode = TCevice.GetValue(DeviceDBName.R_AlarmCode); OHTJob.oHTReadData.R_TaskState = TCevice.GetValue(DeviceDBName.R_TaskState); OHTJob.oHTReadData.R_CurrentLine = TCevice.GetValue(DeviceDBName.R_CurrentLine); OHTJob.oHTReadData.R_CurrentColumn = TCevice.GetValue(DeviceDBName.R_CurrentColumn); OHTJob.oHTReadData.R_RiseUp_Position = TCevice.GetValue(DeviceDBName.R_RiseUp_Position); OHTJob.oHTReadData.R_TaskNumber = TCevice.GetValue(DeviceDBName.R_TaskNumber); OHTJob.oHTReadData.R_Loaded_1 = TCevice.GetValue(DeviceDBName.R_Loaded_1); OHTJob.oHTReadData.R_Loaded_2 = TCevice.GetValue(DeviceDBName.R_Loaded_2); OHTJob.oHTReadData.weight = TCevice.GetValue(DeviceDBName.weight); #endregion if (W_TC_Heat) { W_TC_Heat = false; TCevice.SetValue(DeviceDBName.W_HeartBeat, W_TC_Heat); } else { W_TC_Heat = true; TCevice.SetValue(DeviceDBName.W_HeartBeat, W_TC_Heat); } } else { throw new Exception($"天车PLC连接失败"); } //整形机PLC对象 OtherDevice device = (OtherDevice)value; if (device.Communicator.IsConnected) { #region 读取整形机设备数据 OHTJob.oHTReadData.R_ZXJ_HeartBeat = device.GetValue(ZXJDBName.R_ZXJ_HeartBeat); OHTJob.oHTReadData.R_ZXJ_isWork = device.GetValue(ZXJDBName.R_ZXJ_isWork); OHTJob.oHTReadData.R_ZXJ_RGVMode = device.GetValue(ZXJDBName.R_ZXJ_RGVMode); OHTJob.oHTReadData.R_ZXJ_TCMode = device.GetValue(ZXJDBName.R_ZXJ_TCMode); OHTJob.oHTReadData.R_ZXJ_TC_isready = device.GetValue(ZXJDBName.R_ZXJ_TC_isready); OHTJob.oHTReadData.R_TCMode_TC = device.GetValue(ZXJDBName.R_TCMode_TC); OHTJob.oHTReadData.R_TCMode_CC = device.GetValue(ZXJDBName.R_TCMode_CC); OHTJob.oHTReadData.R_HC_isReady = device.GetValue(ZXJDBName.R_HC_isReady); OHTJob.oHTReadData.R_HC_isReadyWork = device.GetValue(ZXJDBName.R_HC_isReadyWork); OHTJob.oHTReadData.R_issafe = device.GetValue(ZXJDBName.R_issafe); //总数 OHTJob.oHTReadData.R_CommonRecorder = device.GetValue(ZXJDBName.R_CommonRecorder); OHTJob.oHTReadData.R_SpecialRecorder = device.GetValue(ZXJDBName.R_SpecialRecorder); OHTJob.oHTReadData.R_TotalWeight = device.GetValue(ZXJDBName.R_TotalWeight); //重量厚度上、下限值 //厚度 float tza1 = OHTJob.oHTReadData.R_TopLeftUp = device.GetValue(ZXJDBName.R_TopLeftUp); float tza2 = OHTJob.oHTReadData.R_TopLeftBelow = device.GetValue(ZXJDBName.R_TopLeftBelow); float tzb1 = OHTJob.oHTReadData.R_TopMiddleUp = device.GetValue(ZXJDBName.R_TopMiddleUp); float tzb2 = OHTJob.oHTReadData.R_TopMiddleBelow = device.GetValue(ZXJDBName.R_TopMiddleBelow); float tzc1 = OHTJob.oHTReadData.R_TopRightUp = device.GetValue(ZXJDBName.R_TopRightUp); float tzc2 = OHTJob.oHTReadData.R_TopRightBelow = device.GetValue(ZXJDBName.R_TopRightBelow); float tzd1 = OHTJob.oHTReadData.R_CentreLeftUp = device.GetValue(ZXJDBName.R_CentreLeftUp); float tzd2 = OHTJob.oHTReadData.R_CentreLeftBelow = device.GetValue(ZXJDBName.R_CentreLeftBelow); float tze1 = OHTJob.oHTReadData.R_CentreMiddleUp = device.GetValue(ZXJDBName.R_CentreMiddleUp); float tze2 = OHTJob.oHTReadData.R_CentreMiddleBelow = device.GetValue(ZXJDBName.R_CentreMiddleBelow); float tzf1 = OHTJob.oHTReadData.R_CentreRightUp = device.GetValue(ZXJDBName.R_CentreRightUp); float tzf2 = OHTJob.oHTReadData.R_CentreRightBelow = device.GetValue(ZXJDBName.R_CentreRightBelow); float tzg1 = OHTJob.oHTReadData.R_BottomLeftUp = device.GetValue(ZXJDBName.R_BottomLeftUp); float tzg2 = OHTJob.oHTReadData.R_BottomLeftBelow = device.GetValue(ZXJDBName.R_BottomLeftBelow); float tzh1 = OHTJob.oHTReadData.R_BottomRightUp = device.GetValue(ZXJDBName.R_BottomRightUp); float tzh2 = OHTJob.oHTReadData.R_BottomRightBelow = device.GetValue(ZXJDBName.R_BottomRightBelow); //重量 float ws1 = OHTJob.oHTReadData.R_WeightUp = device.GetValue(ZXJDBName.R_WeightUp); float ws2 = OHTJob.oHTReadData.R_WeightBelow = device.GetValue(ZXJDBName.R_WeightBelow); //重量厚度值 //厚度 float tz1 = OHTJob.oHTReadData.R_TopLeft = device.GetValue(ZXJDBName.R_TopLeft); float tz2 = OHTJob.oHTReadData.R_TopMiddle = device.GetValue(ZXJDBName.R_TopMiddle); float tz3 = OHTJob.oHTReadData.R_TopRight = device.GetValue(ZXJDBName.R_TopRight); float tz4 = OHTJob.oHTReadData.R_CentreLeft = device.GetValue(ZXJDBName.R_CentreLeft); float tz5 = OHTJob.oHTReadData.R_CentreMiddle = device.GetValue(ZXJDBName.R_CentreMiddle); float tz6 = OHTJob.oHTReadData.R_CentreRight = device.GetValue(ZXJDBName.R_CentreRight); float tz7 = OHTJob.oHTReadData.R_BottomLeft = device.GetValue(ZXJDBName.R_BottomLeft); float tz8 = OHTJob.oHTReadData.R_BottomRight = device.GetValue(ZXJDBName.R_BottomRight); //重量 float w = OHTJob.oHTReadData.R_Weight = device.GetValue(ZXJDBName.R_Weight); //记录重量厚度 bool thickness = OHTJob.oHTReadData.R_ThicknessRecorder = device.GetValue(ZXJDBName.R_ThicknessRecorder); bool weight = OHTJob.oHTReadData.R_WeightRecorder = device.GetValue(ZXJDBName.R_WeightRecorder); #endregion //记录重量与厚度 //厚度 if (thickness) { dt_Thickness_hty dt_thickness = new dt_Thickness_hty(); dt_thickness.topleft = tz1; dt_thickness.topmiddle = tz2; dt_thickness.topright = tz3; dt_thickness.centreleft = tz4; dt_thickness.centremiddle = tz5; dt_thickness.centreright = tz6; dt_thickness.bottomleft = tz7; dt_thickness.bottomright = tz8; int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0; //判断合格 if (tz1 < tza2 && tz1 > tza1) { a = 1; } if (tz2 < tzb2 && tz2 > tzb1) { b = 1; } if (tz3 < tzc2 && tz3 > tzc1) { c = 1; } if (tz4 < tzd2 && tz4 > tzd1) { d = 1; } if (tz5 < tze2 && tz5 > tze1) { e = 1; } if (tz6 < tzf2 && tz6 > tzf1) { f = 1; } if (tz7 < tzg2 && tz7 > tzg1) { g = 1; } if (tz8 < tzh2 && tz8 > tzh1) { h = 1; } if (a == 1 && b == 1 && c == 1 && d == 1 && e == 1 && f == 1 && g == 1 && h == 1) { dt_thickness.qualified = 1; } else { dt_thickness.qualified = 0; } //区间值 dt_thickness.interval = tza1 + "-" + tza2+","+ tzb1 + "-" + tzb2 + "," + tzc1 + "-" + tzc2 + "," + tzd1 + "-" + tzd2 + "," + tze1 + "-" + tze2 + "," + tzf1 + "-" + tzf2 + "," + tzg1 + "-" + tzg2 + "," + tzh1 + "-" + tzh2; if(tz1 != 0 && tz2 != 0 && tz3 != 0 && tz4 != 0 && tz5 != 0 && tz6 != 0 && tz7 != 0 && tz8 != 0) { _IThicknessHtyService.AddData(dt_thickness); } device.SetValue(DeviceDBName.R_ThicknessSuccess, true); //防止整形机没收到信号延时 Thread.Sleep(400); device.SetValue(DeviceDBName.R_ThicknessSuccess, false); //防止整形机不能即使更改信号导致重复生成记录,延时 Thread.Sleep(400); } //重量 if (weight) { dt_Weight_hty dt_weight = new dt_Weight_hty(); dt_weight.weight = w; //判断合格 if (w>ws1&&w 150 && w < 350 && w!=0) { _IWeightHtyService.AddData(dt_weight); } device.SetValue(DeviceDBName.R_WeightSuccess, true); bool c = device.GetValue(DeviceDBName.R_WeightSuccess); //防止整形机没收到信号延时 Thread.Sleep(400); device.SetValue(DeviceDBName.R_WeightSuccess, false); //防止整形机不能即使更改信号导致重复生成记录,延时 Thread.Sleep(400); } if (W_ZXJ_Heat) { W_ZXJ_Heat = false; device.SetValue(ZXJDBName.W_ZXJ_HeartBeat, W_ZXJ_Heat); } else { W_ZXJ_Heat = true; device.SetValue(ZXJDBName.W_ZXJ_HeartBeat, W_ZXJ_Heat); } } else { throw new Exception($"整形机PLC连接失败"); } //规整机PLC对象 OtherDevice GZJevice = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "阳极规整机"); if (GZJevice.Communicator.IsConnected) { #region 读取规整机设备数据 OHTJob.oHTReadData.R_ZXJ_HeartBeat = GZJevice.GetValue(GZJDBName.R_GZJ_HeartBeat); OHTJob.oHTReadData.R_GZJ_isWork = GZJevice.GetValue(GZJDBName.R_GZJ_isWork); OHTJob.oHTReadData.R_RGVMode = GZJevice.GetValue(GZJDBName.R_RGVMode); OHTJob.oHTReadData.R_CCMode = GZJevice.GetValue(GZJDBName.R_CCMode); OHTJob.oHTReadData.R_TCMode = GZJevice.GetValue(GZJDBName.R_TCMode); OHTJob.oHTReadData.R_DK_isready = GZJevice.GetValue(GZJDBName.R_DK_isready); OHTJob.oHTReadData.R_XK_isready = GZJevice.GetValue(GZJDBName.R_XK_isready); OHTJob.oHTReadData.R_TC_isready = GZJevice.GetValue(GZJDBName.R_TC_isready); #endregion if (W_GZJ_Heat) { W_GZJ_Heat = false; GZJevice.SetValue(GZJDBName.W_GZJ_HeartBeat, W_GZJ_Heat); } else { W_GZJ_Heat = true; GZJevice.SetValue(GZJDBName.W_GZJ_HeartBeat, W_GZJ_Heat); } } else { throw new Exception($"规整机PLC连接失败"); } //状态数据发送给前端 string ohtData = JsonConvert.SerializeObject(OHTJob.oHTReadData); _webSocketServer.PublishAllClientPayload(ohtData); } catch (Exception ex) { //状态数据发送给前端 string ohtData = JsonConvert.SerializeObject(OHTJob.oHTReadData); _webSocketServer.PublishAllClientPayload(ohtData); _ErrormsginfoService.UpdateErrorMsg(ex.Message, 1); } } return Task.CompletedTask; } /// /// 任务实体转换成命令Model /// /// 任务实体 /// /// public OHTTaskCommand? ConvertToOHTTaskCommand([NotNull] Dt_Task task) { OHTTaskCommand oHtTaskCommand = new OHTTaskCommand(); oHtTaskCommand.W_Task_Type = 1; oHtTaskCommand.W_Load_Layer = 0; oHtTaskCommand.W_Pick_Line = 1; string[] SourceCodes = task.SourceAddress.Split("-"); if (SourceCodes.Length == 3) { oHtTaskCommand.W_Pick_Line = Convert.ToInt16(SourceCodes[1]); oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[2]); oHtTaskCommand.W_Put_Layer = Convert.ToInt16(SourceCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); return null; } string[] targetCodes = task.TargetAddress.Split("-"); if (targetCodes.Length == 3) { oHtTaskCommand.W_Put_Line = Convert.ToInt16(targetCodes[1]); oHtTaskCommand.W_Put_Column = Convert.ToInt16(targetCodes[2]); oHtTaskCommand.W_Put_Layer = Convert.ToInt16(targetCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务目标地址配置错误"); return null; } return oHtTaskCommand; } /// /// 获取任务 /// /// private Dt_Task? GetTask() { Dt_Task task; task = _taskService.QueryStackerCraneTask("R01"); return task; } } }