using HslCommunication; using System; using System.Collections.Generic; using System.Text; using WIDESEA_Common; using WIDESEA_Common.LogEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.Utilities; using WIDESEA_Entity.DomainModels; using WIDESEA_Services; using WIDESEA_Services.Repositories; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.Jobs.ConveyorLine.Logic { public class PalletOutboundLogic { /// /// 处理空托出库的线体逻辑 /// /// /// /// public static void DealWithPalletOutboundLogic(VOLContext dbContext, PLCClient client, string station) { try { Dt_TaskWCSinfoRepository taskWCSinfoRepository = new Dt_TaskWCSinfoRepository(dbContext); Dt_TaskRGVinfoRepository taskRGVinfoRepository = new Dt_TaskRGVinfoRepository(dbContext); //找对应任务类型:TaskType_Empty_Pallet_Outbound,并且状态为TaskState_RGV_Finished的任务 Dt_TaskWCSinfo palletOutTask = taskWCSinfoRepository.FindFirst(x => (x.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() || x.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString()) && x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString() && x.wcstask_startPoint.Contains(station)); if (palletOutTask == null) { Dt_TaskWCSinfo moveTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_startPoint.Contains(station) && x.wcstask_type == TaskType.TaskType_MoveOutbound.ToString() && x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString()); if (null != moveTask) { OperateResult logicResult = (OperateResult)client.ReadValue(CLineInfoDBName.R_Line_Logic_Outbound_Change.ToString(), "ChangeLay"); if (logicResult.IsSuccess) { Int16 logicValue = logicResult.Content; //说明工位在等待调度,准备下发任务 if (logicValue == 1 || logicValue == 2) { if (!moveTask.wcstask_state.Contains("Executing")) { client.WriteValue(CLineInfoDBName.W_TaskNumber_Outbound_Change.ToString(), moveTask.wcstask_taskNumber); client.WriteValue(CLineInfoDBName.W_RFID_Outbound_Change.ToString(), moveTask.wcstask_barcode); client.WriteValue(CLineInfoDBName.W_StartStation_Outbound_Change.ToString(), moveTask.wcstask_startPoint); client.WriteValue(CLineInfoDBName.W_EndStation_Outbound_Change.ToString(), moveTask.wcstask_endPoint); } } //说明站台已经收到任务数据,等待WCS的启动指令 if (logicValue == 3) { client.WriteValue(CLineInfoDBName.W_Line_Logic_Outbound_Change.ToString(), 1); } if (logicValue == 4 || logicValue == 5) { moveTask.wcstask_state = TaskState.TaskState_MoveOutbound_Line_Executing.ToString(); moveTask.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(moveTask, true); } } } Dt_TaskWCSinfo moveInTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_endPoint.Contains(station) && x.wcstask_type == TaskType.TaskType_MoveOutbound.ToString() && x.wcstask_state == TaskState.TaskState_MoveOutbound_Line_Executing.ToString()); if (null != moveInTask) { if (taskRGVinfoRepository.Exists(r => r.rgvtask_barCode == moveInTask.wcstask_barcode)) return; //在此生成RGV任务 Dt_TaskRGVinfo rgvInfo = new Dt_TaskRGVinfo(); rgvInfo.rgvtask_taskId = WIDESEA_Services.Services.GetTaskNumber.GetRgvTaskNumber(taskRGVinfoRepository).ToString(); rgvInfo.rgvtask_taskType = RGVTaskType.RgvTaskType_Inbound.ToString(); rgvInfo.rgvtask_taskStatus = RGVTaskState.RgvTaskState_Wait_Send.ToString(); rgvInfo.rgvtask_priorityCode = moveInTask.wcstask_grade.ToString(); rgvInfo.rgvtask_startNode = moveInTask.wcstask_endPoint; rgvInfo.rgvtask_endNode = moveInTask.wcstask_endLocation; rgvInfo.rgvtask_wcsTaskNumber = moveInTask.wcstask_taskNumber; rgvInfo.rgvtask_barCode = moveInTask.wcstask_barcode; rgvInfo.rgvtask_msgTime = DateTime.Now; taskRGVinfoRepository.Add(rgvInfo, true); moveInTask.wcstask_state = TaskState.TaskState_MoveOutbound_Line_Finished.ToString(); moveInTask.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(moveInTask, true); } return; } int taskNumber = palletOutTask.wcstask_taskNumber; Dt_TaskWCSinfo taskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_taskNumber == taskNumber); if (taskWCSinfo != null) { //查看线体状态,准备给线体下发任务信息 //读取逻辑控制值 OperateResult logicResult = (OperateResult)client.ReadValue(CLineInfoDBName.R_Line_Logic_Outbound_Empty.ToString(), "Outbound_E"); if (logicResult.IsSuccess) { Int16 logicValue = logicResult.Content; //说明工位在等待调度,准备下发任务 if (logicValue == 1 || logicValue == 2) { if (!taskWCSinfo.wcstask_state.Contains("Executing")) { //任务号--空托出库模式 bool writeTaskNumber = client.WriteValue(CLineInfoDBName.W_TaskNumber_Outbound_Empty.ToString(), taskWCSinfo.wcstask_taskNumber); //托盘号--空托出库模式 bool writeBarcode = client.WriteValue(CLineInfoDBName.W_RFID_Outbound_Empty.ToString(), taskWCSinfo.wcstask_barcode); //起始站台--空托出库模式 bool writeStartStation = client.WriteValue(CLineInfoDBName.W_StartStation_Outbound_Empty.ToString(), taskWCSinfo.wcstask_startPoint); //终点站台--空托出库模式 bool writeEndStation = client.WriteValue(CLineInfoDBName.W_EndStation_Outbound_Empty.ToString(), taskWCSinfo.wcstask_endPoint); if (writeTaskNumber == true && writeBarcode == true && writeStartStation == true && writeEndStation == true) { LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>Success => 【空托出库】给站台:【{taskWCSinfo.wcstask_startPoint}】,写到任务号:【{taskWCSinfo.wcstask_taskNumber}】,托盘号:【{taskWCSinfo.wcstask_barcode}】,终点:【{taskWCSinfo.wcstask_endPoint}】"); Console.WriteLine($"{DateTime.Now}=>Success => 【空托出库】给站台:【{taskWCSinfo.wcstask_startPoint}】,写到任务号:【{taskWCSinfo.wcstask_taskNumber}】,托盘号:【{taskWCSinfo.wcstask_barcode}】,终点:【{taskWCSinfo.wcstask_endPoint}】"); } else { LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>::Failed:: => 【空托出库】给站台:【{taskWCSinfo.wcstask_startPoint}】,写到任务号:【{taskWCSinfo.wcstask_taskNumber}】,托盘号:【{taskWCSinfo.wcstask_barcode}】,终点:【{taskWCSinfo.wcstask_endPoint}】"); Console.WriteLine($"{DateTime.Now}=>::Failed:: => 【空托出库】给站台:【{taskWCSinfo.wcstask_startPoint}】,写到任务号:【{taskWCSinfo.wcstask_taskNumber}】,托盘号:【{taskWCSinfo.wcstask_barcode}】,终点:【{taskWCSinfo.wcstask_endPoint}】"); } } } //说明站台已经收到任务数据,等待WCS的启动指令 else if (logicValue == 3) { //启动任务 bool startTask = client.WriteValue(CLineInfoDBName.W_Line_Logic_Outbound_Empty.ToString(), 1); if (startTask) { LogRecord.WriteLog(LogEnum.OutBound, $"Success=> 【空托出库】启动任务成功,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); Console.WriteLine($"Success=> 【空托出库】启动任务成功,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); } else { LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>Failed=> 【空托出库】启动任务失败,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); Console.WriteLine($"{DateTime.Now}=>Failed=> 【空托出库】启动任务失败,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); } } else if (logicValue == 4 || logicValue == 5) { int station1 = int.Parse(taskWCSinfo.wcstask_startPoint); OperateResult rfidResult_ = (OperateResult)client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), station1.ToString()); OperateResult taskRes_ = (OperateResult)client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), station1.ToString()); if (rfidResult_.IsSuccess && taskRes_.IsSuccess) { UInt32 _rfid = rfidResult_.Content; UInt32 _tasknum = taskRes_.Content; Dt_TaskWCSinfo _tmpTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() && x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString() && x.wcstask_taskNumber == _tasknum && x.wcstask_barcode == _rfid.ToString()); if (_tmpTask != null) { //启动成功后,在此更新任务状态、上报WMS任务状态 WebResponseContent content = WMSApi.PostTaskStateToWMS( taskWCSinfo.wcstask_barcode, TaskState.TaskState_Empty_Out_Line_Executing.ToString()); if (content.Status) { taskWCSinfo.wcstask_state = TaskState.TaskState_Empty_Out_Line_Executing.ToString(); taskWCSinfo.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(taskWCSinfo, true); LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>Success=> 【空托出库】上报WMS更新任务状态成功【TaskState_Empty_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); Console.WriteLine($"{DateTime.Now}=>Success=> 【空托出库】上报WMS更新任务状态成功【TaskState_Empty_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); } else { LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>Failed=> 【空托出库】上报WMS更新任务状态出错【TaskState_Empty_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】,原因:{content.Message}"); Console.WriteLine($"{DateTime.Now}=>Failed=> 【空托出库】上报WMS更新任务状态出错【TaskState_Empty_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】,原因:{content.Message}"); } } else { _tmpTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() && x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString() && x.wcstask_taskNumber == _tasknum && x.wcstask_barcode == _rfid.ToString()); if (_tmpTask != null) { //启动成功后,在此更新任务状态、上报WMS任务状态 WebResponseContent content = WMSApi.PostTaskStateToWMS( taskWCSinfo.wcstask_barcode, TaskState.TaskState_Box_Out_Line_Executing.ToString()); if (content.Status) { taskWCSinfo.wcstask_state = TaskState.TaskState_Box_Out_Line_Executing.ToString(); taskWCSinfo.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(taskWCSinfo, true); LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>Success=> 【轴承出库】上报WMS更新任务状态成功【TaskState_Box_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); Console.WriteLine($"{DateTime.Now}=>Success=> 【空托出库】上报WMS更新任务状态成功【TaskState_Box_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】"); } else { LogRecord.WriteLog(LogEnum.OutBound, $"{DateTime.Now}=>Failed=> 【轴承出库】上报WMS更新任务状态出错【TaskState_Box_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】,原因:{content.Message}"); Console.WriteLine($"{DateTime.Now}=>Failed=> 【空托出库】上报WMS更新任务状态出错【TaskState_Box_Out_Line_Executing】,任务号:【{taskWCSinfo.wcstask_taskNumber}】,原因:{content.Message}"); } } } } //清除测量出库模式下发的数据 //bool writeTaskNumber = client.WriteValue(CLineInfoDBName.W_TaskNumber_Outbound_Empty.ToString(), 0); //bool writeBarcode = client.WriteValue(CLineInfoDBName.W_RFID_Outbound_Empty.ToString(), 0); //bool writeStartStation = client.WriteValue(CLineInfoDBName.W_StartStation_Outbound_Empty.ToString(), 0); //bool writeEndStation = client.WriteValue(CLineInfoDBName.W_EndStation_Outbound_Empty.ToString(), 0); //bool writelogicValue = client.WriteValue(CLineInfoDBName.W_Line_Logic_Outbound_Empty.ToString(), 0); } } } else { Console.WriteLine($"::Error::=> 【空托出库】空托出库任务,没有找到任务号对应的任务:{taskNumber}"); } } catch (Exception ex) { Console.WriteLine($"::Error::=> 空托出库任务,当穿梭车放货后的处理逻辑出现异常:{ex.Message}"); } } } }