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;
}
}
}