using HslCommunication; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using WIDESEA_Common; using WIDESEA_Common.CutomerModel; 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.OutboundArea { public partial class OutboundAreaDispatch { /// /// 出库的层 /// private static List OutboundStationLayerNo = new List() { "90100", "90200", "90300", "90400", "90500", "90600", "90700", "90800" }; //入库托盘申请站台 private static string ReInboundRequestStationNo = "90101"; //出库站台交互 //private static string OutboundStationNo = "90201"; //提升机编号 private static string hoisterResultNo = "90100"; /// /// 出库区调度 /// /// /// public static string currentModel = "Inbound"; public static void OutboundAreaDispathAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client) { try { //出库完成 OutboundCompleteAction(taskWCSinfoRepository, client); //读取提升机是否正常 //滚筒线状态 string hoisterResult = client.ReadValue(CLineInfoDBName.R_Line_DeviceNormal.ToString(), hoisterResultNo).ToString(); //提升机状态 string result = client.Read("DB506.36.0", "bool").ToString(); if (!bool.Parse(hoisterResult) || !bool.Parse(result)) return; Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() && (OutboundStationLayerNo.Contains(r.wcstask_startPoint) || OutboundStationLayerNo.Contains(r.wcstask_endPoint))); //有执行中的任务就不调度 if (null != executingTask) { //提升机层 string hoisterLayer = client.ReadValue(CLineInfoDBName.R_Line_Layer.ToString(), hoisterResultNo).ToString(); string[] locationArray = null; string rgvTaskType = string.Empty; //空托盘回库 if (executingTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString())) { locationArray = executingTask.wcstask_endLocation.Split('-'); rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString(); } //轴承出库 else if (executingTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString()) || executingTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString())) { locationArray = executingTask.wcstask_startLocation.Split('-'); rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString(); } //说明提升机到达了目标层 if (int.Parse(locationArray[0]).ToString() == hoisterLayer) { // 写入RGV开始执行 WriteRGVState(client, false); } return; } //client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), 1); //return; //提升机没有执行 Dt_TaskWCSinfo currentTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()); if (null == currentTask) { // //是否有入库申请的托盘号 // string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString(); // //负载待机 // bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString()); // if (currentModel == "Inbound") // { // Dt_TaskWCSinfo wcsTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_state == TaskState.TaskState_Assigned.ToString() && //(r.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || r.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()) //&& OutboundStationLayerNo.Contains(r.wcstask_startPoint)); // if (null != wcsTask) // OutboundRequestAction(taskWCSinfoRepository, client); // else if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load) // ReInboundRequestStationAction(taskWCSinfoRepository, client, barcode); // } // else // { // if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load) // ReInboundRequestStationAction(taskWCSinfoRepository, client, barcode); // else // OutboundRequestAction(taskWCSinfoRepository, client); // } Dt_TaskWCSinfo outboundTask = GetOutboundTask(taskWCSinfoRepository, client); if (null != outboundTask) OutboundRequestAction(taskWCSinfoRepository, client, outboundTask); else { string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString(); bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString()); if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load) ReInboundRequestStationAction(taskWCSinfoRepository, client, barcode); } //if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load) // ReInboundRequestStationAction(taskWCSinfoRepository, client, barcode); //else // OutboundRequestAction(taskWCSinfoRepository, client); } else { //入库读提升机 string hoisterTaskNumber = client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), hoisterResultNo).ToString(); string hoisterBarcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), hoisterResultNo).ToString(); if (!"0".Equals(hoisterTaskNumber) || !"0".Equals(hoisterBarcode)) { AddAGVTask(taskWCSinfoRepository, taskRGVinfoRepository, client, hoisterTaskNumber, hoisterBarcode); } else { string lineCode = "OutboundArea"; //出库读出库线 hoisterTaskNumber = client.ReadValue(CLineInfoDBName.W_Line_TaskNumber.ToString(), lineCode).ToString(); hoisterBarcode = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString(); if (!string.IsNullOrEmpty(hoisterTaskNumber) || !"0".Equals(hoisterBarcode)) { int outlogicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); if (outlogicValue != 4) return; AddAGVTask(taskWCSinfoRepository, taskRGVinfoRepository, client, hoisterTaskNumber, hoisterBarcode); } } } } catch (Exception ex) { WriteLog.Info("OutboundArea").Write($"{ DateTime.Now }出库区域调度失败:{ex.Message}", "OutboundArea"); } } public static void AddAGVTask(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client , string hoisterTaskNumber, string hoisterBarcode) { Dt_TaskWCSinfo wcsTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == hoisterBarcode && r.wcstask_taskNumber == int.Parse(hoisterTaskNumber)); if (null != wcsTask && wcsTask.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()) { Dt_TaskRGVinfo rgvInfo = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == hoisterBarcode && r.rgvtask_wcsTaskNumber == int.Parse(hoisterTaskNumber)); if (null != rgvInfo) return; //提升机层 string hoisterLayer = client.ReadValue(CLineInfoDBName.R_Line_Layer.ToString(), hoisterResultNo).ToString(); string[] locationArray = null; string rgvTaskType = string.Empty; //空托盘回库 if (wcsTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString())) { locationArray = wcsTask.wcstask_endLocation.Split('-'); rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString(); } //轴承出库 else if (wcsTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString()) || wcsTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString())) { locationArray = wcsTask.wcstask_startLocation.Split('-'); rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString(); } //说明提升机到达了目标层 //if (int.Parse(locationArray[0]).ToString() == hoisterLayer) //{ // // 写入RGV开始执行 // if (WriteRGVState(client, false)) // return; rgvInfo = GetRGVTask(taskRGVinfoRepository, wcsTask, rgvTaskType); taskRGVinfoRepository.Add(rgvInfo, true); wcsTask.wcstask_state = TaskState.TaskState_RGV_Received.ToString(); taskWCSinfoRepository.Update(wcsTask, x => x.wcstask_state, true); if (rgvTaskType == RGVTaskType.RgvTaskType_Outbound.ToString()) currentModel = "Outbound"; else currentModel = "Inbound"; // } } else throw new Exception($"当前提升机有数据但未找到符合条件的任务,托盘号:{hoisterBarcode},任务号:{hoisterTaskNumber}"); } public static bool WriteRGVState(PLCClient client, bool value) { client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), value); string rel = string.Empty; for (int i = 0; i < 5; i++) { rel = client.ReadValue(CLineInfoDBName.W_System_RGVState.ToString()).ToString(); if (value == bool.Parse(rel)) break; else { client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), value); Thread.Sleep(66); } } return bool.Parse(rel); } /// /// 查询是否有可出的出库任务 /// /// /// /// public static Dt_TaskWCSinfo GetOutboundTask(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client) { Dt_TaskWCSinfo wcsInfo = null; List listTask = taskWCSinfoRepository.Find(r => r.wcstask_state == TaskState.TaskState_Assigned.ToString() && (r.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || r.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()) && OutboundStationLayerNo.Contains(r.wcstask_startPoint)).OrderBy(r => r.wcstask_createTime).ToList(); foreach (var item in listTask) { List listTarget = taskWCSinfoRepository.Find(r => r.wcstask_endPoint == item.wcstask_endPoint && r.wcstask_state != TaskState.TaskState_Assigned.ToString()); string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.wcstask_endPoint).ToString(); if (string.IsNullOrEmpty(barcode)) { if (null != listTarget && listTarget.Count > 1) continue; else { wcsInfo = item; break; } } else { if (null != listTarget && listTarget.Count > 0) continue; else { wcsInfo = item; break; } } } return wcsInfo; } public static Dt_TaskRGVinfo GetRGVTask(IDt_TaskRGVinfoRepository taskRGVinfoRepository, Dt_TaskWCSinfo wcsTask, string rgvTaskType) { Dt_TaskRGVinfo rgvInfo = new Dt_TaskRGVinfo(); rgvInfo.rgvtask_taskId = GetTaskNumber.GetRgvTaskNumber(taskRGVinfoRepository).ToString(); rgvInfo.rgvtask_taskType = rgvTaskType; rgvInfo.rgvtask_taskStatus = RGVTaskState.RgvTaskState_Wait_Send.ToString(); rgvInfo.rgvtask_priorityCode = wcsTask.wcstask_grade.ToString(); rgvInfo.rgvtask_startNode = wcsTask.wcstask_startLocation; rgvInfo.rgvtask_endNode = wcsTask.wcstask_endLocation; rgvInfo.rgvtask_wcsTaskNumber = wcsTask.wcstask_taskNumber; rgvInfo.rgvtask_barCode = wcsTask.wcstask_barcode; rgvInfo.rgvtask_creator = wcsTask.wcstask_creator; rgvInfo.rgvtask_msgTime = DateTime.Now; rgvInfo.rgvtask_areaCode = "OutboundArea"; return rgvInfo; } } }