using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Hosting; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using Quartz; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.Log; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Enums; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_Tasks.StackerCraneJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonStackerCraneJob : IJob { private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly IRouterService _routerService; public CommonStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _routerService = routerService; } public Task Execute(IJobExecutionContext context) { try { CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams"); if (commonStackerCrane != null) { //Signalinteraction(commonStackerCrane); //出库信号交互 Siganlinteraction2(commonStackerCrane); //入库信号交互 if (!commonStackerCrane.IsEventSubscribed) { commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件 } if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal) { commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次 if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) { Dt_Task? task = GetTask(commonStackerCrane); if (task != null) { StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); if (stackerCraneTaskCommand != null) { bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand); if (sendFlag) { commonStackerCrane.LastTaskType = task.TaskType; _taskService.UpdateTaskStatusToNext(task.TaskNum); } } } } } } } catch (Exception ex) { //Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString()); } return Task.CompletedTask; } /// /// 任务完成事件订阅的方法 /// /// /// private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e) { CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane; if (commonStackerCrane != null) { if (commonStackerCrane.GetValue(StackerCraneDBName.WorkType) != 5) { Console.Out.WriteLine("TaskCompleted" + e.TaskNum); _taskService.StackCraneTaskCompleted(e.TaskNum); commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); } } } /// /// 获取任务 /// /// 堆垛机对象 /// private Dt_Task? GetTask(CommonStackerCrane commonStackerCrane) { Dt_Task task; if (commonStackerCrane.LastTaskType == null) { task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode); } else { if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) { task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode); if (task == null) { task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode); } } else { task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode); } } if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) { string[] targetCodes = task.SourceAddress.Split("-"); if (targetCodes[4] == "02") { task = OutTaskMovelibrary(task); if (task != null) { return task; } } if (OutTaskStationIsOccupied(task) != null) { return task; } else { List otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress).Select(x => x.ChildPosi).ToList(); List tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes); foreach (var item in tasks) { if (OutTaskStationIsOccupied(task) != null) { return task; } } task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode); } } return task; } /// /// 出库任务判断出库站台是否被占用 /// /// 任务实体 /// 如果未被占用,返回传入的任务信息,否则,返回null private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task) { IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Exists(x => x.DeviceChildCode == task.TargetAddress)); if (device != null) { CommonConveyorLine conveyorLine = (CommonConveyorLine)device; DeviceProDTO? deviceProDTO = GetDeviceProDTO(conveyorLine, task.TargetAddress, "R_Event"); //根据堆垛机地址,地址名称找协议 if (deviceProDTO != null) { int B_Event_Test = GetLine(conveyorLine, deviceProDTO.DeviceProDataBlock); //判断输送线是否允许放货信号 if (B_Event_Test == 0) { return task; } } } else { _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到出库站台【{task.TargetAddress}】对应的通讯对象,无法判断出库站台是否被占用"); } return null; } /// /// 出库任务判断是否需要进行移库Move the library /// /// 任务实体 /// 如果未被占用,返回传入的任务信息,否则,返回null private Dt_Task? OutTaskMovelibrary([NotNull] Dt_Task task) { try { string[] targetCodes = task.SourceAddress.Split("-"); if (targetCodes[1] == "001") { targetCodes[1] = "002"; } else if (targetCodes[1] == "004") { targetCodes[1] = "003"; } targetCodes[4] = "01"; string SourceAddress = string.Join("-", targetCodes); //组装浅库位地址 Dt_Task? tasks = _taskService.QueryStationIsOccupiedOutTasks(task.Roadway, SourceAddress).FirstOrDefault(); if (tasks != null) { return task; } else { //向wms申请判断浅库位是否有货,是否需要进行移库 Dt_Task? taskst = _taskService.RequestWMSTaskMovelibrary(task); if (taskst != null) { return taskst; } } } catch (Exception ex) { throw; } return null; } public void Signalinteraction(CommonStackerCrane commonStackerCrane) { if (Applyrelease(commonStackerCrane)) //读取堆垛机放货申请 { Dt_Task task = _taskService.IngStackerCraneTask(commonStackerCrane.DeviceCode); if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) { IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Exists(x => x.DeviceChildCode == task.TargetAddress)); if (device != null) { CommonConveyorLine conveyorLine = (CommonConveyorLine)device; DeviceProDTO? deviceProDTO = GetDeviceProDTO(conveyorLine, task.TargetAddress, "R_Event"); //根据堆垛机地址,地址名称找协议 if (deviceProDTO != null) { int B_Event_Test = GetLine(conveyorLine, deviceProDTO.DeviceProDataBlock); //判断输送线是否允许放货信号 if (B_Event_Test == 0) { if (Releasespermitted(commonStackerCrane, task.TargetAddress)) //写入堆垛机允许放货信 { LogSignalStatus("写入堆垛机允许放货信号失败", task.TargetAddress); } } else { LogSignalStatus("未读取到输送线允许放货信号", task.TargetAddress); } } if (Completesignal(commonStackerCrane, task.TargetAddress)) //读取到放货完成信号 { if(PLCSignal(conveyorLine, task.TargetAddress, task.PalletCode, (byte)task.PalletCodequantity)) //写入输送线 堆垛机放货 托盘条码,层数,类型 { //读取输送线反馈 堆垛机放下信号 DeviceProDTO? deviceProDTO2 = GetDeviceProDTO(conveyorLine, task.SourceAddress, "R_StackerCraneLowered"); //输送线协议找读取信号 if (deviceProDTO != null) { int B_TAKE = GetLine(conveyorLine, deviceProDTO.DeviceProDataBlock); //读取输送线的 堆垛机放下 信号 if (B_TAKE == 1) { //写入给堆垛机,输送线的 堆垛机放下确认 信号 if (Releasespermitted4(commonStackerCrane, task.SourceAddress)) { LogSignalStatus("写入堆垛机放下信号成功", task.SourceAddress); } else { LogSignalStatus("写入堆垛机放下信号失败", task.SourceAddress); } } else { LogSignalStatus("未读取输送线的堆垛机放下信号", task.SourceAddress); } } } else { LogSignalStatus("写入输送线堆垛机放货 托盘条码,层数,类型失败", task.TargetAddress); } } else { LogSignalStatus("未读取到堆垛机放货完成信号", task.TargetAddress); } } } } } public void Siganlinteraction2(CommonStackerCrane commonStackerCrane) { Dt_Task task = _taskService.IngStackerCraneTask(commonStackerCrane.DeviceCode); if (task != null && task.TaskType == (int)TaskInboundTypeEnum.Inbound) { IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Exists(x => x.DeviceChildCode == task.SourceAddress)); if (device != null) { CommonConveyorLine conveyorLine = (CommonConveyorLine)device; DeviceProDTO? deviceProDTO = GetDeviceProDTO(conveyorLine, task.SourceAddress, "R_Event"); //根据堆垛机地址,地址名称找协议 if (deviceProDTO != null) { int B_Event_Test = GetLine(conveyorLine, deviceProDTO.DeviceProDataBlock); //判断输送线是否允许取货信号 if (B_Event_Test == 1) { if (Releasespermitted2(commonStackerCrane, task.SourceAddress)) //写入堆垛机允许取货信号 { LogSignalStatus("写入堆垛机允许取货信号失败", task.SourceAddress); } } else { LogSignalStatus("未读取到输送线允许取货信号", task.SourceAddress); } } if (Completesignal2(commonStackerCrane, task.SourceAddress)) //读取堆垛机取货完成信号 { if(PLCSignal2(conveyorLine, task.SourceAddress, "W_StackerCranePicked")) //写入输送线取货完成信号 { DeviceProDTO? deviceProDTO2 = GetDeviceProDTO(conveyorLine, task.SourceAddress, "R_StackerCranePicked"); //输送线协议找读取信号 if (deviceProDTO != null) { int B_TAKE = GetLine(conveyorLine, deviceProDTO.DeviceProDataBlock); //读取输送线的 堆垛机取走 信号 if (B_TAKE == 1) { //写入给堆垛机,输送线的 堆垛机取走 信号 if(Releasespermitted3(commonStackerCrane, task.SourceAddress)) { LogSignalStatus("写入堆垛机取走信号成功", task.SourceAddress); } else { LogSignalStatus("写入堆垛机取走信号失败", task.SourceAddress); } } else { LogSignalStatus("未读取输送线的堆垛机取走信号", task.SourceAddress); } } } } else { LogSignalStatus("未读取到堆垛机放货完成信号", task.SourceAddress); } } } } //获取输送线实例 public DeviceProDTO? GetDeviceProDTO(CommonConveyorLine conveyorLine,string SCAddress,string Interactivet) { return conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SCAddress && x.DeviceProParamName == Interactivet); } //获取堆垛机例 public DeviceProDTO? GetDeviceProDTO2(CommonStackerCrane commonStackerCrane, string DeviceName, string Interactivet) { return commonStackerCrane.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == DeviceName && x.DeviceProParamName == Interactivet); } //读取堆垛机申请放货信号 public bool Applyrelease(CommonStackerCrane commonStackerCrane) { if (commonStackerCrane.DeviceCode == "SC02") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryRequest_Bout"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } DeviceProDTO? deviceProDTO2 = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryRequest_Dout"); if (deviceProDTO2 != null) { return GetStacker(commonStackerCrane, deviceProDTO2.DeviceProAddress); } } if (commonStackerCrane.DeviceCode == "SC01") { DeviceProDTO? deviceProDTO3 = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryRequest_Dout"); if (deviceProDTO3 != null) { return GetStacker(commonStackerCrane, deviceProDTO3.DeviceProAddress); } DeviceProDTO? deviceProDTO4 = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryRequest_Cout"); if (deviceProDTO4 != null) { return GetStacker(commonStackerCrane, deviceProDTO4.DeviceProAddress); } DeviceProDTO? deviceProDTO5 = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryRequest_Aout"); if (deviceProDTO5 != null) { return GetStacker(commonStackerCrane, deviceProDTO5.DeviceProAddress); } } return false; } //写入堆垛机允许放货信号 public bool Releasespermitted(CommonStackerCrane commonStackerCrane, string Destinationaddress) { if (Destinationaddress == "R02-002-027-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryPermission_Bout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R02-002-027-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryPermission_Dout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } //1号 if (Destinationaddress == "R01-002-041-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryPermission_Cout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-003-041-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryPermission_Dout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-044-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryPermission_Aout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } return false; } //读取堆垛机的放货完成信号 public bool Completesignal(CommonStackerCrane commonStackerCrane,string Destinationaddress) { if (Destinationaddress == "R02-002-027-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompleted_Bout"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R02-002-027-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompleted_Dout"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } //1号 if (Destinationaddress == "R01-002-041-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompleted_Cout"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R01-002-041-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompleted_Dout"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R01-002-044-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompleted_Aout"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } return false; } //写入堆垛机放货确认信号 public bool Releasespermitted4(CommonStackerCrane commonStackerCrane, string Destinationaddress) { if (Destinationaddress == "R02-002-027-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompletion_Bout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R02-002-027-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompletion_Din"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } //1号 if (Destinationaddress == "R01-002-041-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompletion_Cout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-041-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompletion_Dout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-043-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "DeliveryCompletion_Aout"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } return false; } //写入堆垛机允许取货信号 public bool Releasespermitted2(CommonStackerCrane commonStackerCrane, string Destinationaddress) { if (Destinationaddress == "R02-003-027-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupRequest_Bin"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R02-003-027-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupRequest_Din"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } //1号 if (Destinationaddress == "R01-003-041-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupRequest_Cin"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-003-041-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupRequest_Din"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-042-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupRequest_Ain"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-043-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupRequest_A2in"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } return false; } //读取堆垛机取货完成信号 public bool Completesignal2(CommonStackerCrane commonStackerCrane, string Destinationaddress) { if (Destinationaddress == "R02-003-027-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompleted_Bin"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R02-003-027-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompleted_Din"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } //1号 if (Destinationaddress == "R01-003-041-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompleted_Cin"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R01-003-041-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompleted_Din"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R01-002-042-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompleted_Ain"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } if (Destinationaddress == "R01-002-043-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompleted_A2in"); if (deviceProDTO != null) { return GetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress); } } return false; } //写入堆垛机取货确认信号 public bool Releasespermitted3(CommonStackerCrane commonStackerCrane, string Destinationaddress) { if (Destinationaddress == "R02-003-027-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompletion_Bin"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R02-003-027-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompletion_Din"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } //1号 if (Destinationaddress == "R01-003-041-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompletion_Cin"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-003-041-011-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompletion_Din"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-042-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompletion_Ain"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } if (Destinationaddress == "R01-002-043-001-01") { DeviceProDTO? deviceProDTO = GetDeviceProDTO2(commonStackerCrane, commonStackerCrane.DeviceCode, "PickupCompletion_A2in"); if (deviceProDTO != null) { return SetStacker(commonStackerCrane, deviceProDTO.DeviceProAddress, true); } } return false; } //写入输送线放货完成信号,条码,层数,类型 public bool PLCSignal(CommonConveyorLine conveyorLine,string TargetAddress,string PalletCode,byte PalletLayers) { byte PalletType = 2; if (TargetAddress == "R02-002-027-001-01" || TargetAddress == "R01-002-041-001-01") { PalletType = 1; } //处理出库放料完成后逻辑 try { DeviceProDTO? deviceProDTO2 = GetDeviceProDTO(conveyorLine, TargetAddress, "W_StackerCraneLowered"); //放货完成信号 DeviceProDTO? deviceProDTO3 = GetDeviceProDTO(conveyorLine, TargetAddress, "W_PalletBarcode"); //写入条码 DeviceProDTO? deviceProDTO4 = GetDeviceProDTO(conveyorLine, TargetAddress, "W_PalletLayers"); //层数 DeviceProDTO? deviceProDTO5 = GetDeviceProDTO(conveyorLine, TargetAddress, "W_PalletType"); //类型 if(deviceProDTO2 !=null && deviceProDTO3 != null && deviceProDTO4 != null && deviceProDTO5 != null) { if(SetLine(conveyorLine, deviceProDTO2.DeviceProDataBlock, 1) && SetLinestring(conveyorLine, deviceProDTO3.DeviceProDataBlock,PalletCode) && SetLine(conveyorLine, deviceProDTO2.DeviceProDataBlock, PalletLayers) && SetLine(conveyorLine, deviceProDTO2.DeviceProDataBlock, PalletType)) { LogSignalStatus($"写入放货完成信息,托盘条码,层数,类型信息成功", TargetAddress); return true; } else { LogSignalStatus($"写入放货完成信息,托盘条码,层数,类型信息失败", TargetAddress); } } else { LogSignalStatus($"未找到输送线协议信息", TargetAddress); } } catch (Exception ex) { LogSignalStatus($"写入失败,错误信息:{ex.Message}", TargetAddress); throw; } return false; } //写入输送线 堆垛机取货完成信号 public bool PLCSignal2(CommonConveyorLine conveyorLine, string SourceAddress,string DeviceProParamName) { DeviceProDTO? deviceProDTO2 = GetDeviceProDTO(conveyorLine, SourceAddress, DeviceProParamName); //取货完成信号 if (deviceProDTO2 != null) { return SetLine(conveyorLine, deviceProDTO2.DeviceProDataBlock, 1); } else { LogSignalStatus($"未找到输送线协议信息", SourceAddress); } return false; } /// /// 根据协议,地址,值,写入输送线信息, /// /// /// /// /// public bool SetLine(CommonConveyorLine conveyorLine,string DeviceProDataBlock,byte Pali) { return conveyorLine.Communicator.Write(DeviceProDataBlock, Pali); } public bool SetLinestring(CommonConveyorLine conveyorLine, string DeviceProDataBlock, string Pali) { return conveyorLine.Communicator.Write(DeviceProDataBlock, Pali); } /// /// 根地址读取输送线信息 /// /// /// /// public int GetLine(CommonConveyorLine conveyorLine, string DeviceProDataBlock) { return conveyorLine.Communicator.Read(DeviceProDataBlock); } /// /// 读取堆垛机地址 /// /// /// /// public bool GetStacker(CommonStackerCrane commonStackerCrane,string DeviceProDataBlock) { return commonStackerCrane.Communicator.Read(DeviceProDataBlock); } /// /// 写入堆垛机信号 /// /// /// /// public bool SetStacker(CommonStackerCrane commonStackerCrane, string DeviceProDataBlock,bool Pali) { return commonStackerCrane.Communicator.Write(DeviceProDataBlock, Pali); } /// /// 任务实体转换成命令Model /// /// 任务实体 /// /// public StackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task) { StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand(); stackerCraneTaskCommand.Barcode = task.PalletCode; stackerCraneTaskCommand.TaskNum = task.TaskNum; stackerCraneTaskCommand.WorkType = 1; stackerCraneTaskCommand.TrayType = 0; if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务 { string[] targetCodest = task.SourceAddress.Split("-"); if (targetCodest.Length == 5) { stackerCraneTaskCommand.StartRow = Convert.ToInt16(targetCodest[1]); stackerCraneTaskCommand.StartColumn = Convert.ToInt16(targetCodest[2]); stackerCraneTaskCommand.StartLayer = Convert.ToInt16(targetCodest[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库起点错误,起点:【{task.SourceAddress}】"); return null; } string[] targetCodes = task.NextAddress.Split("-"); if (targetCodes.Length == 5) { stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]); stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]); stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库任务终点错误,起点:【{task.NextAddress}】"); return null; } } else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) { string[] sourceCodes = task.CurrentAddress.Split("-"); if (sourceCodes.Length == 5) { stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]); stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]); stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"出库任务起点错误,起点:【{task.CurrentAddress}】"); return null; } string[] sourceCodest = task.TargetAddress.Split("-"); if (sourceCodest.Length == 5) { stackerCraneTaskCommand.EndRow = Convert.ToInt16(sourceCodest[1]); stackerCraneTaskCommand.EndColumn = Convert.ToInt16(sourceCodest[2]); stackerCraneTaskCommand.EndLayer = Convert.ToInt16(sourceCodest[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"出库任务终点错误,起点:【{task.TargetAddress}】"); return null; } } else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup) { string[] targetCodes = task.NextAddress.Split("-"); if (targetCodes.Length == 5) { stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]); stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]); stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,起点:【{task.NextAddress}】"); return null; } string[] sourceCodes = task.CurrentAddress.Split("-"); if (sourceCodes.Length == 5) { stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]); stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]); stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务起点错误,起点:【{task.CurrentAddress}】"); return null; } } return stackerCraneTaskCommand; } private void LogSignalStatus(string message, string sourceAddress) { WriteLog.GetLog("堆垛机与plc交互信号").Write($"站台编号:{sourceAddress},信息:{message}", $"{sourceAddress}"); } } }