#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using AutoMapper;
|
using Newtonsoft.Json;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
|
using Quartz;
|
using StackExchange.Profiling.Internal;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Reflection.Metadata;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.Log;
|
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.DTO;
|
using WIDESEAWCS_QuartzJob.Models;
|
using WIDESEAWCS_QuartzJob.Service;
|
using WIDESEAWCS_Tasks.ConveyorLineJob;
|
using WIDESEAWCS_Tasks.StackerCraneJob;
|
using static Microsoft.IO.RecyclableMemoryStreamManager;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
[DisallowConcurrentExecution]
|
public class CommonConveyorLineJob : IJob
|
{
|
private readonly ITaskService _taskService;
|
private readonly ITaskExecuteDetailService _taskExecuteDetailService;
|
private readonly IRouterService _routerService;
|
private readonly IMapper _mapper;
|
|
public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper)
|
{
|
_taskService = taskService;
|
_taskExecuteDetailService = taskExecuteDetailService;
|
_routerService = routerService;
|
_mapper = mapper;
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
try
|
{
|
CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams");
|
|
if( conveyorLine != null )
|
{
|
RequestInbound(conveyorLine); //判断巷道去哪个巷道
|
}
|
//RequestInNextAddress(conveyorLine);
|
|
|
}
|
catch (Exception ex)
|
{
|
//Console.Out.WriteLine(nameof(CommonConveyorLineJob) + ":" + ex.ToString());
|
}
|
finally
|
{
|
//Console.Out.WriteLine(DateTime.Now);
|
}
|
return Task.CompletedTask;
|
}
|
|
/// <summary>
|
/// 输送线请求入库到哪个巷道
|
/// </summary>
|
/// <param name="conveyorLine">输送线实例对象</param>
|
/// <param name="command">读取的请求信息</param>
|
/// <param name="childDeviceCode">子设备编号</param>
|
public void RequestInbound(CommonConveyorLine conveyorLine)
|
{
|
//1楼输送线判断
|
HandleEvent(conveyorLine, "PLC_WCS_B._03_PLC_EVENT", "PLC_WCS_B._03_PLC_LPN", "WCS_PLC_B._03_WCS_TO"); //判断巷道
|
HandleEvent(conveyorLine, "PLC_WCS_C._02_PLC_EVENT", "PLC_WCS_C._02_PLC_LPN", "WCS_PLC_C._02_WCS_TO"); //判断巷道
|
CheckForEmptyPallet(conveyorLine, "PLC_WCS_B._01_PLC_EVENT"); //判断是否取空托
|
CheckForEmptyPallet(conveyorLine, "PLC_WCS_C._01_PLC_EVENT"); //判断是否取空托
|
ProcessConveyorEvent(conveyorLine, "PLC_WCS_B._01_PLC_EVENT", "PLC_WCS_B._01_PLC_LPN", "R02-003-027-001-01");// 处理 B 站台事件 //判断输送线到达信号
|
ProcessConveyorEvent(conveyorLine, "PLC_WCS_C._03_PLC_EVENT", "PLC_WCS_C._03_PLC_LPN", "R01-003-041-001-01");// 处理 C 站台事件 //判断输送线到达信号
|
}
|
|
|
|
/// <summary>
|
/// 判断出库站台是否需要空托
|
/// </summary>
|
/// <param name="conveyorLine">输送线实例对象</param>
|
/// <param name="command">读取的请求信息</param>
|
/// <param name="childDeviceCode">子设备编号</param>
|
public void ConveyorLineInFinish(CommonConveyorLine conveyorLine)
|
{
|
|
}
|
|
|
/// <summary>
|
/// 用于入库判断巷道
|
/// </summary>
|
/// <param name="conveyorLine"></param>
|
/// <param name="eventTag"></param>
|
/// <param name="barcodeTag"></param>
|
/// <param name="writeTag"></param>
|
private void HandleEvent(CommonConveyorLine conveyorLine,string eventTag, string barcodeTag, string writeTag)
|
{
|
try
|
{
|
byte events = conveyorLine.Communicator.Read<byte>(eventTag); // 读取事件
|
if (events == 1)
|
{
|
string barcode = conveyorLine.Communicator.Read<string>(barcodeTag); // 读取条码
|
if ((_taskService.ToPlatform(barcode)).Status)
|
{
|
// 写入去向1号堆垛机
|
bool result = conveyorLine.Communicator.Write(writeTag, 1);
|
if (result)
|
{
|
WriteLog.GetLog("PLC日志").Write("写入去向:1", "去向");
|
}
|
}
|
/*else
|
{
|
// 写入去向2号堆垛机
|
*//*bool result = conveyorLine.Communicator.Write(writeTag, 2);
|
if (result)
|
{
|
WriteLog.GetLog("PLC日志").Write("写入去向:2", "去向");
|
}*//*
|
|
WriteLog.GetLog("PLC日志").Write("入库失败", "入库组盘");
|
}*/
|
}
|
}
|
catch (Exception ex)
|
{
|
|
throw;
|
}
|
}
|
|
//用于判断是否补空托
|
private void CheckForEmptyPallet(CommonConveyorLine conveyorLine,string eventTag)
|
{
|
|
Byte events = conveyorLine.Communicator.Read<Byte>(eventTag); // 读取事件
|
if (events == 0)
|
{
|
WriteLog.GetLog("PLC日志").Write($"读取到出库口补空托信号:{events}", "需要空托");
|
// 生成堆垛机取空托任务
|
if ((_taskService.RequestWMSTask2(conveyorLine.DeviceCode)).Status)
|
{
|
WriteLog.GetLog("PLC日志").Write($"已生成空托出库任务:{events}", "需要空托");
|
}
|
else
|
{
|
WriteLog.GetLog("PLC日志").Write($"未生成空托出库任务:{events}", "需要空托");
|
}
|
}
|
}
|
|
//用于判断入库站台
|
private void ProcessConveyorEvent(CommonConveyorLine conveyorLine, string eventTag, string barcodeTag, string taskCode)
|
{
|
byte eventStatus = conveyorLine.Communicator.Read<byte>(eventTag);
|
if (eventStatus == 1)
|
{
|
string barcode = conveyorLine.Communicator.Read<string>(barcodeTag);
|
if (barcode != null)
|
{
|
// 拿取托盘条码申请入库信息
|
WebResponseContent content = _taskService.RequestWMSTask(barcode, taskCode); // 申请入库,生成堆垛机任务
|
if (content !=null)
|
{
|
if (content.Status)
|
{
|
WriteLog.GetLog("PLC入库站台日志").Write($"申请入库成功,站台编号为:{taskCode}", "站台信息");
|
}
|
else
|
{
|
WriteLog.GetLog("PLC入库站台日志").Write($"申请入库失败,站台编号为:{taskCode}", "站台信息");
|
}
|
}
|
}
|
else
|
{
|
WriteLog.GetLog("PLC入库站台日志").Write($"读取到输送线信息为空,站台编号为:{taskCode}", "站台信息");
|
}
|
}
|
}
|
}
|
}
|