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
|
{
|
/// <summary>
|
/// 出库的层
|
/// </summary>
|
private static List<string> OutboundStationLayerNo = new List<string>() { "90100", "90200", "90300", "90400", "90500", "90600", "90700", "90800" };
|
//入库托盘申请站台
|
private static string ReInboundRequestStationNo = "90101";
|
//出库站台交互
|
//private static string OutboundStationNo = "90201";
|
//提升机编号
|
private static string hoisterResultNo = "90100";
|
/// <summary>
|
/// 出库区调度
|
/// </summary>
|
/// <param name="taskWCSinfoRepository"></param>
|
/// <param name="client"></param>
|
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);
|
}
|
/// <summary>
|
/// 查询是否有可出的出库任务
|
/// </summary>
|
/// <param name="taskWCSinfoRepository"></param>
|
/// <param name="client"></param>
|
/// <returns></returns>
|
public static Dt_TaskWCSinfo GetOutboundTask(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client)
|
{
|
Dt_TaskWCSinfo wcsInfo = null;
|
|
List<Dt_TaskWCSinfo> 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<Dt_TaskWCSinfo> 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;
|
}
|
}
|
}
|