using Autofac.Core;
|
using HslCommunication;
|
using HslCommunication.Core;
|
using HslCommunication.WebSocket;
|
using Microsoft.Extensions.Hosting;
|
using Microsoft.VisualBasic.FileIO;
|
using Newtonsoft.Json;
|
using Quartz;
|
using SixLabors.ImageSharp.PixelFormats;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Diagnostics.CodeAnalysis;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEAWCS_Communicator;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_ISystemServices;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_QuartzJob.DeviceBase;
|
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
|
using WIDESEAWCS_Tasks.OHT;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
[DisallowConcurrentExecution]
|
public class OHTJob : JobBase, IJob
|
{
|
public static string InorOut = "In";
|
public static OHTReadData oHTReadData = new OHTReadData();
|
private readonly ITaskService _taskService;
|
private readonly Idt_ErrormsginfoService _ErrormsginfoService;
|
WebSocketServer _webSocketServer;
|
public OHTJob(ITaskService taskService, WebSocketServer webSocketServer, Idt_ErrormsginfoService errormsginfoService)
|
{
|
_taskService = taskService;//注入
|
_webSocketServer = webSocketServer;
|
_ErrormsginfoService = errormsginfoService;
|
}
|
public Task Execute(IJobExecutionContext context)
|
{
|
//return Task.CompletedTask;
|
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
|
if (flag && value != null)
|
{
|
//天车PLC对象
|
OtherDevice device = (OtherDevice)value;
|
//整形机PLC对象
|
var ZXJdevice = Storage.Devices.Find(v => v.DeviceName == "阳极整形机");
|
//规整机PLC对象
|
var GZJevice = Storage.Devices.Find(v => v.DeviceName == "阳极规整机");
|
//if (!device.Communicator.IsConnected || !ZXJdevice.Communicator.IsConnected || !GZJevice.Communicator.IsConnected)
|
//{
|
// return Task.CompletedTask;
|
//}
|
try
|
{
|
#region 天车完成任务逻辑
|
//因为天的任务需要分段发送,所以取货完成与放货完成需要单独做逻辑控制
|
//判断天车当前有没有取货完成任务信号
|
if (oHTReadData.R_RunState == (int)RunStateEnum.PickUpCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete)
|
{
|
//天车取货完成逻辑
|
var nawtask = _taskService.QueryTakNnmTask(oHTReadData.R_TaskNumber);
|
if (nawtask == null)
|
{
|
throw new Exception(string.Format("天车取货完成任务未查询到任务号{0}", oHTReadData.R_TaskNumber));
|
}
|
//入库
|
if (nawtask.TaskType == (int)TaskInboundTypeEnum.Inbound)
|
{
|
//如果任务的状态是否是天车入库取货执行中
|
if (nawtask.TaskState == (int)TaskInStatusEnum.Line_InGrabExecuting)
|
{
|
//修改状态
|
WebResponseContent result = _taskService.UpdateTaskStatusToLine_Ingrab(nawtask);
|
if (result.Status)
|
{
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 3);
|
}
|
}
|
}
|
//出库
|
else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.Outbound)
|
{
|
//如果任务状态是否是天车出库取货执行中
|
if (nawtask.TaskState == (int)TaskOutStatusEnum.Line_OutGrabExecuting)
|
{
|
//修改状态
|
WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask);
|
if (result.Status)
|
{
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 3);
|
}
|
}
|
}
|
//直接出库
|
else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.OutInventory)
|
{
|
//修改状态
|
WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask);
|
if (result.Status)
|
{
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 3);
|
}
|
}
|
return Task.CompletedTask;
|
}
|
else if (oHTReadData.R_RunState == (int)RunStateEnum.PutCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete)
|
{
|
//天车放货完成逻辑
|
WebResponseContent result = _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber, oHTReadData.weight);
|
if (result.Status)
|
{
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 3);
|
}
|
return Task.CompletedTask;
|
}
|
else if (oHTReadData.R_RunState == (int)RunStateEnum.MoveCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete)
|
{
|
//天车移动完成
|
WebResponseContent result = _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber, oHTReadData.weight);
|
if (result.Status)
|
{
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 3);
|
}
|
return Task.CompletedTask;
|
}
|
#endregion
|
|
#region 天车发送任务逻辑
|
if (oHTReadData.R_RunMode == (int)RunModeEnum.Automatic)
|
{
|
if (oHTReadData.R_RunState == (int)RunStateEnum.Standby)
|
{
|
//查看任务池中是否存在执行中的任务
|
var tasking = _taskService.QueryTasking();
|
if (tasking==null)
|
{
|
Dt_Task? task = GetTask(InorOut);
|
if (task != null)
|
{
|
OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task);
|
if (oHTTaskCommand != null)
|
{
|
//给天车下发任务之前将此值写0
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 0);
|
//todo:写入任务命令
|
device.SetValue(DeviceDBName.W_Task_Type, oHTTaskCommand.W_Task_Type);
|
device.SetValue(DeviceDBName.W_Pick_Line, oHTTaskCommand.W_Pick_Line);
|
device.SetValue(DeviceDBName.W_Pick_Column, oHTTaskCommand.W_Pick_Column);
|
device.SetValue(DeviceDBName.W_Put_Line, oHTTaskCommand.W_Put_Line);
|
device.SetValue(DeviceDBName.W_Put_Column, oHTTaskCommand.W_Put_Column);
|
device.SetValue(DeviceDBName.W_Catch_1, oHTTaskCommand.W_Catch_1);
|
device.SetValue(DeviceDBName.W_Catch_2, oHTTaskCommand.W_Catch_2);
|
device.SetValue(DeviceDBName.W_TaskNumber, oHTTaskCommand.W_TaskNumber);
|
device.SetValue(DeviceDBName.W_CheckValue, oHTTaskCommand.W_CheckValue);
|
//确认信号写入1,任务下达完成
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 1);
|
Thread.Sleep(500);
|
//WCS检测到天车的R_TaskState=1,通过W_ConfirmSignal置2表示让天车开始执行任务
|
int R_TaskState = device.GetValue<DeviceDBName, short>(DeviceDBName.R_TaskState);
|
if (R_TaskState == 1)
|
{
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 2);
|
}
|
//下发成功,修改任务状态
|
_taskService.UpdateTaskStatus(task.TaskId, oHTTaskCommand.W_Task_Type);
|
}
|
}
|
}
|
}
|
}
|
#endregion
|
}
|
catch (Exception ex)
|
{
|
_ErrormsginfoService.UpdateErrorMsg(ex.Message, 1);
|
}
|
}
|
return Task.CompletedTask;
|
}
|
|
|
/// <summary>
|
/// 任务实体转换成命令Model
|
/// </summary>
|
/// <param name="task">任务实体</param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public OHTTaskCommand? ConvertToOHTTaskCommand([NotNull] Dt_Task task)
|
{
|
OHTTaskCommand oHtTaskCommand = new OHTTaskCommand();
|
|
if (task.TaskState == (int)TaskInStatusEnum.InNew || task.TaskState == (int)TaskOutStatusEnum.OutNew)
|
{
|
oHtTaskCommand.W_Task_Type = 2;
|
string[] SourceCodes = task.SourceAddress.Split("-");
|
if (SourceCodes.Length == 3)
|
{
|
oHtTaskCommand.W_Pick_Line = Convert.ToInt16(SourceCodes[0]);
|
oHtTaskCommand.W_Pick_Column = Convert.ToInt16(SourceCodes[1]);
|
oHtTaskCommand.W_Put_Line = 0;
|
oHtTaskCommand.W_Put_Column = 0;
|
}
|
else
|
{
|
//数据配置错误
|
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!");
|
return null;
|
}
|
oHtTaskCommand.W_CheckValue = 2 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]);
|
}
|
else if (task.TaskState == (int)TaskInStatusEnum.Line_Ingrab || task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
|
{
|
oHtTaskCommand.W_Task_Type = 3;
|
string[] SourceCodes = task.TargetAddress.Split("-");
|
if (SourceCodes.Length == 3)
|
{
|
oHtTaskCommand.W_Pick_Line = 0;
|
oHtTaskCommand.W_Pick_Column =0;
|
oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]);
|
oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]);
|
}
|
else
|
{
|
//数据配置错误
|
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!");
|
return null;
|
}
|
oHtTaskCommand.W_CheckValue = 3 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]);
|
}
|
else if(task.TaskState == (int)TaskMoveStatusEnum.OutNewMove )
|
{
|
oHtTaskCommand.W_Task_Type = 4;
|
string[] SourceCodes = task.TargetAddress.Split("-");
|
if (SourceCodes.Length == 3)
|
{
|
oHtTaskCommand.W_Pick_Line = 0;
|
oHtTaskCommand.W_Pick_Column = 0;
|
oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]);
|
oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]);
|
}
|
else
|
{
|
//数据配置错误
|
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!");
|
return null;
|
}
|
oHtTaskCommand.W_CheckValue = 4 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]);
|
}
|
|
if (task.WMSId==1)
|
{
|
oHtTaskCommand.W_Catch_1 = 1;
|
oHtTaskCommand.W_Catch_2 = 0;
|
oHtTaskCommand.W_CheckValue += 1;
|
}
|
else if (task.WMSId == 2)
|
{
|
oHtTaskCommand.W_Catch_1 = 0;
|
oHtTaskCommand.W_Catch_2 = 1;
|
oHtTaskCommand.W_CheckValue += 1;
|
}
|
else if (task.WMSId == 3)
|
{
|
oHtTaskCommand.W_Catch_1 = 1;
|
oHtTaskCommand.W_Catch_2 = 1;
|
oHtTaskCommand.W_CheckValue += 2;
|
}
|
oHtTaskCommand.W_TaskNumber = task.TaskId;
|
oHtTaskCommand.W_CheckValue += task.TaskId;
|
return oHtTaskCommand;
|
}
|
|
|
/// <summary>
|
/// 获取任务
|
/// </summary>
|
/// <returns></returns>
|
private Dt_Task? GetTask(string workType)
|
{
|
Dt_Task task;
|
task = _taskService.QueryStackerCraneTask(workType);
|
if (task!=null && (task.TaskState==(int)TaskInStatusEnum.InNew|| task.TaskState == (int)TaskOutStatusEnum.OutNew))
|
{
|
if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
|
{
|
InorOut = "Out";
|
}
|
else
|
{
|
InorOut = "In";
|
}
|
}
|
else
|
{
|
if (workType.Equals("In"))
|
{
|
InorOut = "Out";
|
}
|
else
|
{
|
InorOut = "In";
|
}
|
}
|
return task;
|
}
|
}
|
}
|