using HslCommunication; using System; using System.Collections.Generic; using System.Text; using System.Threading; using WIDESEA_Common; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.Tools; using WIDESEA_Core.Utilities; using WIDESEA_Entity.DomainModels; using WIDESEA_Services; using WIDESEA_Services.IRepositories; using WIDESEA_Services.Repositories; using WIDESEA_Services.Services; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.Jobs.ConveyorLine.InboundArea { public partial class InboundAreaDispatch { public static string[] OutboundStationNo = new string[] { "50101", "50102", "50103", "50104", "50105", "50106", "50107"}; //正常模式下的内容 public static void OutboundStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client) { foreach (var item in OutboundStationNo) { bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString()); if (!flag) continue; OutboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, false); } } //应急模式下的内容 public static void OutboundStationAction_YJ(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, bool leftState) { if (leftState) { foreach (var item in OutboundStationNo) { bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString()); if (!flag) continue; OutboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, false);//true } } else { foreach (var item in InboundStationNo) { bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString()); if (!flag) continue; OutboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, true); } } } /// /// 出库RGV完成 /// /// /// /// private static void OutboundLineTaskComplete(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, string station, bool yjState) { try { string lineCode = yjState ? "Outbound_E_YJ" : "Outbound_E"; string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString(); Dt_TaskWCSinfo taskWCSinfo = null; if (!string.IsNullOrEmpty(rfidResult) && !"0".Equals(rfidResult)) taskWCSinfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == rfidResult); else //找对应任务类型:TaskType_Empty_Pallet_Outbound,并且状态为TaskState_RGV_Finished的任务 taskWCSinfo = taskWCSinfoRepository.FindFirst(x => (x.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() || x.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || x.wcstask_type == TaskType.TaskType_CheckOutbound.ToString()) && x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString() && x.wcstask_startPoint.Contains(station)); if (null == taskWCSinfo) { ChangeLayerAction(taskWCSinfoRepository, taskRGVinfoRepository, client, station, yjState); return; } //读取逻辑控制值 查看线体状态,准备给线体下发任务信息 int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); //说明工位在等待调度,准备下发任务 if (logicValue == 1 || logicValue == 2) { if (!taskWCSinfo.wcstask_state.Contains("Executing")) { WriteTaskInfo.WriteTaskInfoAction(taskWCSinfo, client, lineCode); } } rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString(); if (!taskWCSinfo.wcstask_barcode.Equals(rfidResult)) return; logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); //说明站台已经收到任务数据,等待WCS的启动指令 if (logicValue == 3) { //启动任务 client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1); } else if (logicValue == 4 || logicValue == 5) { string state = string.Empty; if (taskWCSinfo.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()) state = TaskState.TaskState_Empty_Out_Line_Executing.ToString(); else if (taskWCSinfo.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || taskWCSinfo.wcstask_type == TaskType.TaskType_CheckOutbound.ToString()) state = TaskState.TaskState_Box_Out_Line_Executing.ToString(); else if (taskWCSinfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()) state = TaskState.TaskState_Measure_Out_Line_Executing.ToString(); if (taskWCSinfo.wcstask_state == state) return; WebResponseContent content = WMSApi.PostTaskStateToWMS(taskWCSinfo.wcstask_barcode, state); string str = string.Empty; if (content.Status) { taskWCSinfo.wcstask_state = state; taskWCSinfo.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(taskWCSinfo, true); str = $" { DateTime.Now }上报WMS更新任务状态成功{state},托盘号:{taskWCSinfo.wcstask_barcode},任务号:{ taskWCSinfo.wcstask_taskNumber}"; } else str = $" { DateTime.Now }上报WMS更新任务状态失败{state},托盘号:{taskWCSinfo.wcstask_barcode},任务号:{ taskWCSinfo.wcstask_taskNumber},原因:{content.Message}"; WriteLog.Info(station).Write(str, station); } } catch (Exception ex) { WriteLog.Info(station).Write($"{ DateTime.Now }出库站台调度失败:{ex.Message}", station); } } private static void ChangeLayerAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, string station, bool yjState) { try { string lineCode = yjState ? "ChangeLayer_YJ" : "ChangeLayer"; 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) { int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); //说明工位在等待调度,准备下发任务 if (logicValue == 1 || logicValue == 2) { if (!moveTask.wcstask_state.Contains("Executing")) { WriteTaskInfo.WriteTaskInfoAction(moveTask, client, lineCode); } } else if (logicValue == 3)//说明站台已经收到任务数据,等待WCS的启动指令 { client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1); } else 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; rgvInfo.rgvtask_areaCode = "InboundArea"; taskRGVinfoRepository.Add(rgvInfo, true); moveInTask.wcstask_state = TaskState.TaskState_MoveOutbound_Line_Finished.ToString(); moveInTask.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(moveInTask, true); } } catch (Exception ex) { WriteLog.Info(station).Write($"{ DateTime.Now }移库出库站台调度失败:{ex.Message}", station); } } } }