qinchulong
2025-03-01 de9b341ccc98d554f0c324478acab26d7d3cdafd
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/OHT/OHTJob.cs
@@ -31,6 +31,7 @@
    [DisallowConcurrentExecution]
    public class OHTJob : JobBase, IJob
    {
        public static string InorOut = "In";
        private readonly ITaskService _taskService;
        WebSocketServer _webSocketServer;
        public OHTJob(ITaskService taskService, WebSocketServer webSocketServer)
@@ -38,7 +39,6 @@
            _taskService = taskService;//注入
            _webSocketServer = webSocketServer;
        }
        public Task Execute(IJobExecutionContext context)
        {
           
@@ -53,6 +53,7 @@
                    //device.SetValue  å†™å…¥
                    //_taskService.Repository; //仓储层,进行数据库访问
                    OHTReadData oHTReadData = new OHTReadData();
                    #region è¯»å–天车设备数据
                    oHTReadData.R_HeartBeat = device.GetValue<DeviceDBName, bool>(DeviceDBName.R_HeartBeat);
                    oHTReadData.R_RunMode = device.GetValue<DeviceDBName, short>(DeviceDBName.R_RunMode);
@@ -91,23 +92,24 @@
                    string ohtData = JsonConvert.SerializeObject(oHTReadData);
                    _webSocketServer.PublishAllClientPayload(ohtData);
                    #region å¤©è½¦å®Œæˆä»»åŠ¡é€»è¾‘
                    //因为天的任务需要分段发送,所以取货完成与放货完成需要单独做逻辑控制
                    //判断天车当前有没有取货完成任务信号
                    if (oHTReadData.R_RunState == (int)RunStateEnum.PickUpCompleted && oHTReadData.R_TaskState==(int)TaskStateEnum.TaskComplete)
                    if (oHTReadData.R_RunState == (int)RunStateEnum.PickUpCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete)
                    {
                        //天车取货完成逻辑
                        var nawtask = _taskService.QueryTakNnmTask(oHTReadData.R_TaskNumber);
                        if (nawtask==null)
                        if (nawtask == null)
                        {
                            throw new Exception(string.Format("天车取货完成任务未查询到任务号{0}",oHTReadData.R_TaskNumber));
                            throw new Exception(string.Format("天车取货完成任务未查询到任务号{0}", oHTReadData.R_TaskNumber));
                        }
                        if (nawtask.TaskType== (int)TaskInboundTypeEnum.Inbound)
                        if (nawtask.TaskType == (int)TaskInboundTypeEnum.Inbound)
                        {
                            //如果任务的状态是天车入库取货执行中
                            if (nawtask.TaskState==(int)TaskInStatusEnum.Line_InGrabExecuting)
                            if (nawtask.TaskState == (int)TaskInStatusEnum.Line_InGrabExecuting)
                            {
                                WebResponseContent result=_taskService.UpdateTaskStatusToLine_Ingrab(nawtask);
                                if (result.Status)
                                WebResponseContent result = _taskService.UpdateTaskStatusToLine_Ingrab(nawtask);
                                if (result.Status)
                                {
                                    device.SetValue(DeviceDBName.W_ConfirmSignal, 3);
                                }
@@ -125,19 +127,26 @@
                                }
                            }
                        }
                        return Task.CompletedTask;
                    }
                    else if (oHTReadData.R_RunState == (int)RunStateEnum.PutCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete)
                    {
                        //天车放货完成逻辑
                        _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber);
                        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 && oHTReadData.R_AlarmCode == (int)AlarmCodeEnum.Normal)
                    {
                        if (oHTReadData.R_RunState == (int)RunStateEnum.Standby)
                        {
                            Dt_Task? task = GetTask();
                            Dt_Task? task = GetTask(InorOut);
                            if (task != null)
                            {
                                OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task);
@@ -147,41 +156,34 @@
                                    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_Pick_Layer, oHTTaskCommand.W_Pick_Layer);
                                    device.SetValue(DeviceDBName.W_Put_Line, oHTTaskCommand.W_Put_Line);
                                    device.SetValue(DeviceDBName.W_Put_Column, oHTTaskCommand.W_Put_Column);
                                    device.SetValue(DeviceDBName.W_Put_Layer, oHTTaskCommand.W_Put_Layer);
                                    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_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, short>(DeviceDBName.R_TaskState);
                                    if (R_TaskState == 1)
                                    {
                                        device.SetValue(DeviceDBName.W_ConfirmSignal, 2);
                                    }
                                    //下发成功,修改任务状态
                                    _taskService.UpdateTaskStatus(task.TaskNum, oHTTaskCommand.W_Task_Type);
                                }
                            }
                        }
                    }
                    WriteInfo(device.DeviceName, "infoLog");
                    WriteDebug(device.DeviceName, "debugLog");
                    #endregion
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "错误", ex);
                }
            }
            return Task.CompletedTask;
        }
@@ -196,36 +198,65 @@
        {
            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)
            if (task.TaskState==(int)TaskInStatusEnum.InNew || task.TaskState == (int)TaskOutStatusEnum.OutNew)
            {
                oHtTaskCommand.W_Pick_Line = Convert.ToInt16(SourceCodes[1]);
                oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[2]);
                oHtTaskCommand.W_Put_Layer = Convert.ToInt16(SourceCodes[3]);
                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 = task.TaskType + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]);
            }
            else
            else if (task.TaskState == (int)TaskInStatusEnum.Line_Ingrab || task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
            {
                //数据配置错误
                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!");
                return null;
                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 = task.TaskType + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]);
            }
            string[] targetCodes = task.TargetAddress.Split("-");
            if (targetCodes.Length == 3)
            if (task.WMSId==1)
            {
                oHtTaskCommand.W_Put_Line = Convert.ToInt16(targetCodes[1]);
                oHtTaskCommand.W_Put_Column = Convert.ToInt16(targetCodes[2]);
                oHtTaskCommand.W_Put_Layer = Convert.ToInt16(targetCodes[3]);
                oHtTaskCommand.W_Catch_1 = 1;
                oHtTaskCommand.W_Catch_2 = 0;
                oHtTaskCommand.W_CheckValue += 1;
            }
            else
            else if (task.WMSId == 2)
            {
                //数据配置错误
                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务目标地址配置错误");
                return null;
                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.TaskNum;
            oHtTaskCommand.W_CheckValue += task.TaskNum;
            return oHtTaskCommand;
        }
@@ -234,15 +265,22 @@
        /// èŽ·å–ä»»åŠ¡
        /// </summary>
        /// <returns></returns>
        private Dt_Task? GetTask()
        private Dt_Task? GetTask(string workType)
        {
            Dt_Task task;
            task = _taskService.QueryStackerCraneTask("R01");
            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";
                }
            }
            return task;
        }
    }
}