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_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 { private readonly ITaskService _taskService; WebSocketServer _webSocketServer; public OHTJob(ITaskService taskService, WebSocketServer webSocketServer) { _taskService = taskService;//注入 _webSocketServer = webSocketServer; } public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { OtherDevice device = (OtherDevice)value; try { //Example //device.GetValue 读取 //device.SetValue 写入 //_taskService.Repository; //仓储层,进行数据库访问 OHTReadData oHTReadData = new OHTReadData(); #region 读取天车设备数据 oHTReadData.R_HeartBeat = device.GetValue(DeviceDBName.R_HeartBeat); oHTReadData.R_RunMode = device.GetValue(DeviceDBName.R_RunMode); oHTReadData.R_RunState = device.GetValue(DeviceDBName.R_RunState); oHTReadData.R_AlarmCode = device.GetValue(DeviceDBName.R_AlarmCode); oHTReadData.R_TaskState = device.GetValue(DeviceDBName.R_TaskState); oHTReadData.R_CurrentLine = device.GetValue(DeviceDBName.R_CurrentLine); oHTReadData.R_CurrentColumn = device.GetValue(DeviceDBName.R_CurrentColumn); oHTReadData.R_RiseUp_Position = device.GetValue(DeviceDBName.R_RiseUp_Position); oHTReadData.R_TaskNumber = device.GetValue(DeviceDBName.R_TaskNumber); oHTReadData.R_Loaded_1 = device.GetValue(DeviceDBName.R_Loaded_1); oHTReadData.R_Loaded_2 = device.GetValue(DeviceDBName.R_Loaded_2); oHTReadData.R_Code_1 = device.GetValue(DeviceDBName.R_Code_1); oHTReadData.R_Code_2 = device.GetValue(DeviceDBName.R_Code_2); oHTReadData.R_Load_Requst_1 = device.GetValue(DeviceDBName.R_Load_Requst_1); oHTReadData.R_Load_Requst_2 = device.GetValue(DeviceDBName.R_Load_Requst_2); #region 测试用 //oHTReadData.R_HeartBeat = 1; //oHTReadData.R_RunMode = 2; //oHTReadData.R_RunState = 3; //oHTReadData.R_AlarmCode = 4; //oHTReadData.R_TaskState = 5; //oHTReadData.R_CurrentLine = 6; //oHTReadData.R_CurrentColumn = 7; //oHTReadData.R_RiseUp_Position = 8; //oHTReadData.R_TaskNumber = 9; //oHTReadData.R_Loaded_1 =10; //oHTReadData.R_Loaded_2 = 11; //oHTReadData.R_Code_1 = "12"; //oHTReadData.R_Code_2 = "13"; //oHTReadData.R_Load_Requst_1 =true; //oHTReadData.R_Load_Requst_2 = false; #endregion #endregion //状态数据发送给前端 string ohtData = JsonConvert.SerializeObject(oHTReadData); _webSocketServer.PublishAllClientPayload(ohtData); if (oHTReadData.R_RunMode == (int)RunModeEnum.Automatic && oHTReadData.R_AlarmCode == (int)AlarmCodeEnum.Normal) { if (oHTReadData.R_RunState == (int)RunStateEnum.Standby) { Dt_Task? task = GetTask(); if (task != null) { OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task); if (oHTTaskCommand != null) { //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_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); //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); } } } } } WriteInfo(device.DeviceName, "infoLog"); WriteDebug(device.DeviceName, "debugLog"); } catch (Exception ex) { WriteError(device.DeviceName, "错误", ex); } } 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; } } }