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_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
|
{
|
private readonly ITaskService _taskService;
|
WebSocketServer _webSocketServer;
|
public OHTJob(ITaskService taskService, WebSocketServer webSocketServer)
|
{
|
_taskService = taskService;//注入
|
_webSocketServer = webSocketServer;
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
|
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
|
if (flag && value != null)
|
{
|
OtherDevice device = (OtherDevice)value;
|
try
|
{
|
//Example
|
//device.GetValue 读取
|
//device.SetValue 写入
|
//_taskService.Repository; //仓储层,进行数据库访问
|
OHTReadData oHTReadData = new OHTReadData();
|
#region 读取天车设备数据
|
oHTReadData.R_HeartBeat = device.GetValue<DeviceDBName, bool>(DeviceDBName.R_HeartBeat);
|
oHTReadData.R_RunMode = device.GetValue<DeviceDBName, short>(DeviceDBName.R_RunMode);
|
oHTReadData.R_RunState = device.GetValue<DeviceDBName, short>(DeviceDBName.R_RunState);
|
oHTReadData.R_AlarmCode = device.GetValue<DeviceDBName, short>(DeviceDBName.R_AlarmCode);
|
oHTReadData.R_TaskState = device.GetValue<DeviceDBName, short>(DeviceDBName.R_TaskState);
|
oHTReadData.R_CurrentLine = device.GetValue<DeviceDBName, int>(DeviceDBName.R_CurrentLine);
|
oHTReadData.R_CurrentColumn = device.GetValue<DeviceDBName, int>(DeviceDBName.R_CurrentColumn);
|
oHTReadData.R_RiseUp_Position = device.GetValue<DeviceDBName, int>(DeviceDBName.R_RiseUp_Position);
|
oHTReadData.R_TaskNumber = device.GetValue<DeviceDBName, int>(DeviceDBName.R_TaskNumber);
|
oHTReadData.R_Loaded_1 = device.GetValue<DeviceDBName, short>(DeviceDBName.R_Loaded_1);
|
oHTReadData.R_Loaded_2 = device.GetValue<DeviceDBName, short>(DeviceDBName.R_Loaded_2);
|
oHTReadData.weight = device.GetValue<DeviceDBName, float>(DeviceDBName.weight);
|
|
#region 测试用
|
//oHTReadData.R_HeartBeat = 1;
|
//oHTReadData.R_RunMode = 2;
|
//oHTReadData.R_RunState = 3;
|
//oHTReadData.R_AlarmCode = 4;
|
//oHTReadData.R_TaskState = 5;
|
//oHTReadData.R_CurrentLine = 6;
|
//oHTReadData.R_CurrentColumn = 7;
|
//oHTReadData.R_RiseUp_Position = 8;
|
//oHTReadData.R_TaskNumber = 9;
|
//oHTReadData.R_Loaded_1 =10;
|
//oHTReadData.R_Loaded_2 = 11;
|
//oHTReadData.R_Code_1 = "12";
|
//oHTReadData.R_Code_2 = "13";
|
//oHTReadData.R_Load_Requst_1 =true;
|
//oHTReadData.R_Load_Requst_2 = false;
|
#endregion
|
|
#endregion
|
|
//状态数据发送给前端
|
string ohtData = JsonConvert.SerializeObject(oHTReadData);
|
_webSocketServer.PublishAllClientPayload(ohtData);
|
|
//因为天的任务需要分段发送,所以取货完成与放货完成需要单独做逻辑控制
|
//判断天车当前有没有取货完成任务信号
|
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 (oHTReadData.R_RunState == (int)RunStateEnum.PutCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete)
|
{
|
//天车放货完成逻辑
|
_taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber);
|
}
|
|
|
if (oHTReadData.R_RunMode == (int)RunModeEnum.Automatic && oHTReadData.R_AlarmCode == (int)AlarmCodeEnum.Normal)
|
{
|
if (oHTReadData.R_RunState == (int)RunStateEnum.Standby)
|
{
|
Dt_Task? task = GetTask();
|
if (task != null)
|
{
|
OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task);
|
if (oHTTaskCommand != null)
|
{
|
//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_Pick_Layer, oHTTaskCommand.W_Pick_Layer);
|
device.SetValue(DeviceDBName.W_Put_Line, oHTTaskCommand.W_Put_Line);
|
device.SetValue(DeviceDBName.W_Put_Column, oHTTaskCommand.W_Put_Column);
|
device.SetValue(DeviceDBName.W_Put_Layer, oHTTaskCommand.W_Put_Layer);
|
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_TaskNumber, oHTTaskCommand.W_TaskNumber);
|
device.SetValue(DeviceDBName.W_CheckValue, oHTTaskCommand.W_CheckValue);
|
//确认信号写入1,任务下达完成
|
device.SetValue(DeviceDBName.W_ConfirmSignal, 1);
|
//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);
|
}
|
}
|
|
}
|
|
}
|
|
}
|
WriteInfo(device.DeviceName, "infoLog");
|
|
WriteDebug(device.DeviceName, "debugLog");
|
}
|
catch (Exception ex)
|
{
|
WriteError(device.DeviceName, "错误", ex);
|
}
|
}
|
|
|
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();
|
|
oHtTaskCommand.W_Task_Type = 1;
|
oHtTaskCommand.W_Load_Layer = 0;
|
oHtTaskCommand.W_Pick_Line = 1;
|
|
string[] SourceCodes = task.SourceAddress.Split("-");
|
if (SourceCodes.Length == 3)
|
{
|
oHtTaskCommand.W_Pick_Line = Convert.ToInt16(SourceCodes[1]);
|
oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[2]);
|
oHtTaskCommand.W_Put_Layer = Convert.ToInt16(SourceCodes[3]);
|
}
|
else
|
{
|
//数据配置错误
|
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!");
|
return null;
|
}
|
string[] targetCodes = task.TargetAddress.Split("-");
|
if (targetCodes.Length == 3)
|
{
|
oHtTaskCommand.W_Put_Line = Convert.ToInt16(targetCodes[1]);
|
oHtTaskCommand.W_Put_Column = Convert.ToInt16(targetCodes[2]);
|
oHtTaskCommand.W_Put_Layer = Convert.ToInt16(targetCodes[3]);
|
}
|
else
|
{
|
//数据配置错误
|
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务目标地址配置错误");
|
return null;
|
}
|
return oHtTaskCommand;
|
}
|
|
|
/// <summary>
|
/// 获取任务
|
/// </summary>
|
/// <returns></returns>
|
private Dt_Task? GetTask()
|
{
|
Dt_Task task;
|
task = _taskService.QueryStackerCraneTask("R01");
|
return task;
|
}
|
|
|
}
|
|
|
}
|