| | |
| | | using Autofac.Core; |
| | | using HslCommunication; |
| | | using HslCommunication.Core; |
| | | using HslCommunication.Enthernet; |
| | | using HslCommunication.WebSocket; |
| | | using Microsoft.Extensions.Hosting; |
| | | using Microsoft.VisualBasic.FileIO; |
| | | using Newtonsoft.Json; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; |
| | | using Quartz; |
| | | using SixLabors.ImageSharp.PixelFormats; |
| | | using System; |
| | |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Communicator; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseRepository; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_ISystemServices; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | |
| | | using WIDESEAWCS_QuartzJob; |
| | | using WIDESEAWCS_QuartzJob.DeviceBase; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane.Enum; |
| | | using WIDESEAWCS_TaskInfoService; |
| | | using WIDESEAWCS_Tasks.OHT; |
| | | |
| | | namespace WIDESEAWCS_Tasks |
| | |
| | | public static OHTReadData oHTReadData = new OHTReadData(); |
| | | private readonly ITaskService _taskService; |
| | | private readonly Idt_ErrormsginfoService _ErrormsginfoService; |
| | | private readonly IRepository<Dt_Task_hty> _taskhtyRepository; |
| | | WebSocketServer _webSocketServer; |
| | | public OHTJob(ITaskService taskService, WebSocketServer webSocketServer,Idt_ErrormsginfoService errormsginfoService) |
| | | OtherDevice devicese; |
| | | OtherDevice deviceses; |
| | | public OHTJob(ITaskService taskService, WebSocketServer webSocketServer, Idt_ErrormsginfoService errormsginfoService, IRepository<Dt_Task_hty> taskhtyRepository) |
| | | { |
| | | _taskService = taskService;//注å
¥ |
| | | _webSocketServer = webSocketServer; |
| | | _ErrormsginfoService = errormsginfoService; |
| | | _taskhtyRepository = taskhtyRepository; |
| | | } |
| | | 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; |
| | | OtherDevice zxj = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "鳿æ´å½¢æº"); |
| | | OtherDevice gzj = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "é³æè§æ´æº"); |
| | | devicese = zxj; |
| | | deviceses = gzj; |
| | | |
| | | |
| | | //æ´å½¢æº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; |
| | | } |
| | | //if (!device.Communicator.IsConnected || !ZXJdevice.Communicator.IsConnected || !GZJevice.Communicator.IsConnected) |
| | | //{ |
| | | // return Task.CompletedTask; |
| | | //} |
| | | try |
| | | { |
| | | #region å¤©è½¦å®æä»»å¡é»è¾ |
| | |
| | | { |
| | | 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) |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | //åºåº |
| | | 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); |
| | | } |
| | | } |
| | | //åé¤åºåº |
| | | else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuChuKu) |
| | | { |
| | | //ä¿®æ¹ç¶æ |
| | | WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); |
| | | if (result.Status) |
| | | { |
| | | //gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); |
| | | device.SetValue(DeviceDBName.W_ConfirmSignal, 3); |
| | | } |
| | | } |
| | | //åé¤å
¥åº |
| | | else if (nawtask.TaskType == (int)TaskInboundTypeEnum.TiChuRuKu) |
| | | { |
| | | //ä¿®æ¹ç¶æ |
| | | WebResponseContent result = _taskService.UpdateTaskStatusToLine_Ingrab(nawtask); |
| | | if (result.Status) |
| | | { |
| | | device.SetValue(DeviceDBName.W_ConfirmSignal, 3); |
| | | } |
| | | } |
| | | //åé¤ç´æ¥åºåº |
| | | else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) |
| | | { |
| | | //ä¿®æ¹ç¶æ |
| | | WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); |
| | | if (result.Status) |
| | | { |
| | | //gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); |
| | | device.SetValue(DeviceDBName.W_ConfirmSignal, 3); |
| | | } |
| | | } |
| | | return Task.CompletedTask; |
| | |
| | | { |
| | | device.SetValue(DeviceDBName.W_ConfirmSignal, 3); |
| | | } |
| | | |
| | | var nawtask = _taskService.QueryTakNnmTask(oHTReadData.R_TaskNumber); |
| | | if (nawtask == null) |
| | | { |
| | | throw new Exception(string.Format("天车åè´§å®æä»»å¡æªæ¥è¯¢å°ä»»å¡å·{0}", oHTReadData.R_TaskNumber)); |
| | | } |
| | | //åé¤åºåºä¸åé¤ç´æ¥åºåº |
| | | //if (nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuChuKu || nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) |
| | | //{ |
| | | // gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, false); |
| | | //} |
| | | 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) |
| | | { |
| | | //åé¤åºåºãç´æ¥åºåºç»å®æä¿¡å· |
| | | //List<Dt_Task_hty> Task_hty = _taskhtyRepository.QueryData(); |
| | | //int shu = Task_hty.Count - 1; |
| | | //int zhi = Task_hty[shu].TaskId; |
| | | //Dt_Task_hty lishi = _taskhtyRepository.QueryFirst(x => x.TaskId == zhi); |
| | | //if (lishi.TargetAddress == "40-2-1") |
| | | //{ |
| | | // gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, false); |
| | | //} |
| | | 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_RunMode == (int)RunModeEnum.Automatic) |
| | | { |
| | | if (oHTReadData.R_RunState == (int)RunStateEnum.Standby) |
| | | { |
| | | Dt_Task? task = GetTask(InorOut); |
| | | if (task != null) |
| | | //æ¥ç任塿± 䏿¯å¦å卿§è¡ä¸çä»»å¡ |
| | | var tasking = _taskService.QueryTasking(); |
| | | if (tasking==null) |
| | | { |
| | | OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task); |
| | | if (oHTTaskCommand != null) |
| | | Dt_Task? task = GetTask(InorOut); |
| | | if (task != 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_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, short>(DeviceDBName.R_TaskState); |
| | | if (R_TaskState == 1) |
| | | OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task); |
| | | if (oHTTaskCommand != null) |
| | | { |
| | | device.SetValue(DeviceDBName.W_ConfirmSignal, 2); |
| | | //ç»å¤©è½¦ä¸åä»»å¡ä¹åå°æ¤å¼å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, short>(DeviceDBName.R_TaskState); |
| | | if (R_TaskState == 1) |
| | | { |
| | | device.SetValue(DeviceDBName.W_ConfirmSignal, 2); |
| | | } |
| | | //ä¸åæåï¼ä¿®æ¹ä»»å¡ç¶æ |
| | | _taskService.UpdateTaskStatus(task.TaskId, oHTTaskCommand.W_Task_Type); |
| | | } |
| | | //ä¸åæåï¼ä¿®æ¹ä»»å¡ç¶æ |
| | | _taskService.UpdateTaskStatus(task.TaskNum, oHTTaskCommand.W_Task_Type); |
| | | } |
| | | } |
| | | } |
| | |
| | | #endregion |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _ErrormsginfoService.UpdateErrorMsg(ex.Message,1); |
| | | { |
| | | _ErrormsginfoService.UpdateErrorMsg(ex.Message, 1); |
| | | } |
| | | } |
| | | return Task.CompletedTask; |
| | |
| | | public OHTTaskCommand? ConvertToOHTTaskCommand([NotNull] Dt_Task task) |
| | | { |
| | | OHTTaskCommand oHtTaskCommand = new OHTTaskCommand(); |
| | | |
| | | if (task.TaskState==(int)TaskInStatusEnum.InNew || task.TaskState == (int)TaskOutStatusEnum.OutNew) |
| | | |
| | | if (task.TaskState == (int)TaskInStatusEnum.InNew || task.TaskState == (int)TaskOutStatusEnum.OutNew) |
| | | { |
| | | oHtTaskCommand.W_Task_Type = 2; |
| | | string[] SourceCodes = task.SourceAddress.Split("-"); |
| | |
| | | oHtTaskCommand.W_Pick_Column = Convert.ToInt16(SourceCodes[1]); |
| | | oHtTaskCommand.W_Put_Line = 0; |
| | | oHtTaskCommand.W_Put_Column = 0; |
| | | |
| | | //åé¤åºåº(ä¸éè¦åéä¿¡å·) |
| | | //åé¤å
¥åº |
| | | if (task.TaskType == (int)TaskInboundTypeEnum.TiChuRuKu) |
| | | { |
| | | devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, true); |
| | | } |
| | | //åé¤ç´æ¥åºåº |
| | | else if (task.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) |
| | | { |
| | | devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, true); |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任塿ºå°åé
ç½®é误ï¼"); |
| | | return null; |
| | | } |
| | | oHtTaskCommand.W_CheckValue = task.TaskType + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); |
| | | 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_Pick_Column =0; |
| | | oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]); |
| | | oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]); |
| | | |
| | | //åé¤åºåº |
| | | //if (task.TaskType == (int)TaskOutboundTypeEnum.TiChuChuKu) |
| | | //{ |
| | | // deviceses.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); |
| | | //} |
| | | //åé¤å
¥åº |
| | | if (task.TaskType == (int)TaskInboundTypeEnum.TiChuRuKu) |
| | | { |
| | | |
| | | devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, false); |
| | | } |
| | | //åé¤ç´æ¥åºåº |
| | | else if (task.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) |
| | | { |
| | | |
| | | //deviceses.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); |
| | | devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, false); |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任塿ºå°åé
ç½®é误ï¼"); |
| | | return null; |
| | | } |
| | | oHtTaskCommand.W_CheckValue = task.TaskType + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); |
| | | 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_2 = 1; |
| | | oHtTaskCommand.W_CheckValue += 2; |
| | | } |
| | | oHtTaskCommand.W_TaskNumber = task.TaskNum; |
| | | oHtTaskCommand.W_CheckValue += task.TaskNum; |
| | | oHtTaskCommand.W_TaskNumber = task.TaskId; |
| | | oHtTaskCommand.W_CheckValue += task.TaskId; |
| | | return oHtTaskCommand; |
| | | } |
| | | |
| | |
| | | InorOut = "In"; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (workType.Equals("In")) |
| | | { |
| | | InorOut = "Out"; |
| | | } |
| | | else |
| | | { |
| | | InorOut = "In"; |
| | | } |
| | | } |
| | | return task; |
| | | } |
| | | } |