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_Common.TaskEnum; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_Tasks.OHT; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class OHTJob : JobBase, IJob { public static string InorOut = "In"; public static OHTReadData oHTReadData = new OHTReadData(); private readonly ITaskService _taskService; private readonly Idt_ErrormsginfoService _ErrormsginfoService; WebSocketServer _webSocketServer; public OHTJob(ITaskService taskService, WebSocketServer webSocketServer, Idt_ErrormsginfoService errormsginfoService) { _taskService = taskService;//注入 _webSocketServer = webSocketServer; _ErrormsginfoService = errormsginfoService; } public Task Execute(IJobExecutionContext context) { //return Task.CompletedTask; bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { //天车PLC对象 OtherDevice device = (OtherDevice)value; //整形机PLC对象 var ZXJdevice = Storage.Devices.Find(v => v.DeviceName == "阳极整形机"); //规整机PLC对象 var GZJevice = Storage.Devices.Find(v => v.DeviceName == "阳极规整机"); //if (!device.Communicator.IsConnected || !ZXJdevice.Communicator.IsConnected || !GZJevice.Communicator.IsConnected) //{ // return Task.CompletedTask; //} try { #region 天车完成任务逻辑 //因为天的任务需要分段发送,所以取货完成与放货完成需要单独做逻辑控制 //判断天车当前有没有取货完成任务信号 if (oHTReadData.R_RunState == (int)RunStateEnum.PickUpCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete) { //天车取货完成逻辑 var nawtask = _taskService.QueryTakNnmTask(oHTReadData.R_TaskNumber); if (nawtask == null) { throw new Exception(string.Format("天车取货完成任务未查询到任务号{0}", oHTReadData.R_TaskNumber)); } //入库 if (nawtask.TaskType == (int)TaskInboundTypeEnum.Inbound) { //如果任务的状态是否是天车入库取货执行中 if (nawtask.TaskState == (int)TaskInStatusEnum.Line_InGrabExecuting) { //修改状态 WebResponseContent result = _taskService.UpdateTaskStatusToLine_Ingrab(nawtask); if (result.Status) { device.SetValue(DeviceDBName.W_ConfirmSignal, 3); } } } //出库 else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.Outbound) { //如果任务状态是否是天车出库取货执行中 if (nawtask.TaskState == (int)TaskOutStatusEnum.Line_OutGrabExecuting) { //修改状态 WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); if (result.Status) { device.SetValue(DeviceDBName.W_ConfirmSignal, 3); } } } //直接出库 else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.OutInventory) { //修改状态 WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); if (result.Status) { device.SetValue(DeviceDBName.W_ConfirmSignal, 3); } } return Task.CompletedTask; } else if (oHTReadData.R_RunState == (int)RunStateEnum.PutCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete) { //天车放货完成逻辑 WebResponseContent result = _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber, oHTReadData.weight); if (result.Status) { device.SetValue(DeviceDBName.W_ConfirmSignal, 3); } return Task.CompletedTask; } else if (oHTReadData.R_RunState == (int)RunStateEnum.MoveCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete) { //天车移动完成 WebResponseContent result = _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber, oHTReadData.weight); if (result.Status) { device.SetValue(DeviceDBName.W_ConfirmSignal, 3); } return Task.CompletedTask; } #endregion #region 天车发送任务逻辑 if (oHTReadData.R_RunMode == (int)RunModeEnum.Automatic) { if (oHTReadData.R_RunState == (int)RunStateEnum.Standby) { //查看任务池中是否存在执行中的任务 var tasking = _taskService.QueryTasking(); if (tasking==null) { Dt_Task? task = GetTask(InorOut); if (task != null) { OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task); if (oHTTaskCommand != null) { //给天车下发任务之前将此值写0 device.SetValue(DeviceDBName.W_ConfirmSignal, 0); //todo:写入任务命令 device.SetValue(DeviceDBName.W_Task_Type, oHTTaskCommand.W_Task_Type); device.SetValue(DeviceDBName.W_Pick_Line, oHTTaskCommand.W_Pick_Line); device.SetValue(DeviceDBName.W_Pick_Column, oHTTaskCommand.W_Pick_Column); device.SetValue(DeviceDBName.W_Put_Line, oHTTaskCommand.W_Put_Line); device.SetValue(DeviceDBName.W_Put_Column, oHTTaskCommand.W_Put_Column); device.SetValue(DeviceDBName.W_Catch_1, oHTTaskCommand.W_Catch_1); device.SetValue(DeviceDBName.W_Catch_2, oHTTaskCommand.W_Catch_2); device.SetValue(DeviceDBName.W_TaskNumber, oHTTaskCommand.W_TaskNumber); device.SetValue(DeviceDBName.W_CheckValue, oHTTaskCommand.W_CheckValue); //确认信号写入1,任务下达完成 device.SetValue(DeviceDBName.W_ConfirmSignal, 1); Thread.Sleep(500); //WCS检测到天车的R_TaskState=1,通过W_ConfirmSignal置2表示让天车开始执行任务 int R_TaskState = device.GetValue(DeviceDBName.R_TaskState); if (R_TaskState == 1) { device.SetValue(DeviceDBName.W_ConfirmSignal, 2); } //下发成功,修改任务状态 _taskService.UpdateTaskStatus(task.TaskId, oHTTaskCommand.W_Task_Type); } } } } } #endregion } catch (Exception ex) { _ErrormsginfoService.UpdateErrorMsg(ex.Message, 1); } } return Task.CompletedTask; } /// /// 任务实体转换成命令Model /// /// 任务实体 /// /// public OHTTaskCommand? ConvertToOHTTaskCommand([NotNull] Dt_Task task) { OHTTaskCommand oHtTaskCommand = new OHTTaskCommand(); if (task.TaskState == (int)TaskInStatusEnum.InNew || task.TaskState == (int)TaskOutStatusEnum.OutNew) { oHtTaskCommand.W_Task_Type = 2; string[] SourceCodes = task.SourceAddress.Split("-"); if (SourceCodes.Length == 3) { oHtTaskCommand.W_Pick_Line = Convert.ToInt16(SourceCodes[0]); oHtTaskCommand.W_Pick_Column = Convert.ToInt16(SourceCodes[1]); oHtTaskCommand.W_Put_Line = 0; oHtTaskCommand.W_Put_Column = 0; } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); return null; } oHtTaskCommand.W_CheckValue = 2 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); } else if (task.TaskState == (int)TaskInStatusEnum.Line_Ingrab || task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) { oHtTaskCommand.W_Task_Type = 3; string[] SourceCodes = task.TargetAddress.Split("-"); if (SourceCodes.Length == 3) { oHtTaskCommand.W_Pick_Line = 0; oHtTaskCommand.W_Pick_Column =0; oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]); oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); return null; } oHtTaskCommand.W_CheckValue = 3 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); } else if(task.TaskState == (int)TaskMoveStatusEnum.OutNewMove ) { oHtTaskCommand.W_Task_Type = 4; string[] SourceCodes = task.TargetAddress.Split("-"); if (SourceCodes.Length == 3) { oHtTaskCommand.W_Pick_Line = 0; oHtTaskCommand.W_Pick_Column = 0; oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]); oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); return null; } oHtTaskCommand.W_CheckValue = 4 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); } if (task.WMSId==1) { oHtTaskCommand.W_Catch_1 = 1; oHtTaskCommand.W_Catch_2 = 0; oHtTaskCommand.W_CheckValue += 1; } else if (task.WMSId == 2) { oHtTaskCommand.W_Catch_1 = 0; oHtTaskCommand.W_Catch_2 = 1; oHtTaskCommand.W_CheckValue += 1; } else if (task.WMSId == 3) { oHtTaskCommand.W_Catch_1 = 1; oHtTaskCommand.W_Catch_2 = 1; oHtTaskCommand.W_CheckValue += 2; } oHtTaskCommand.W_TaskNumber = task.TaskId; oHtTaskCommand.W_CheckValue += task.TaskId; return oHtTaskCommand; } /// /// 获取任务 /// /// private Dt_Task? GetTask(string workType) { Dt_Task task; task = _taskService.QueryStackerCraneTask(workType); if (task!=null && (task.TaskState==(int)TaskInStatusEnum.InNew|| task.TaskState == (int)TaskOutStatusEnum.OutNew)) { if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) { InorOut = "Out"; } else { InorOut = "In"; } } else { if (workType.Equals("In")) { InorOut = "Out"; } else { InorOut = "In"; } } return task; } } }