#region << 版 本 注 释 >>
/*----------------------------------------------------------------
* 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob
* 创建者:胡童庆
* 创建时间:2024/8/2 16:13:36
* 版本:V1.0.0
* 描述:
*
* ----------------------------------------------------------------
* 修改人:
* 修改时间:
* 版本:V1.0.1
* 修改说明:
*
*----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using AutoMapper;
using HslCommunication;
using Quartz;
using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using WIDESEA_Common.Log;
using WIDESEAWCS_DTO.BasicInfo;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.System;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob;
namespace WIDESEAWCS_Tasks
{
///
/// 通用输送线任务,负责处理输送线设备的通信与任务执行
///
///
/// 1. 通过PLC通信读取设备状态和条码信息
/// 2. 根据条码查询产品信息和去向工位
/// 3. 将产品尺寸和去向信息写入PLC
/// 4. 处理异常情况并记录错误日志
///
/// [DisallowConcurrentExecution]
[DisallowConcurrentExecution]
public class CommonConveyorLineJob : JobBase, IJob
{
private readonly ITaskService _taskService;
private readonly ITaskExecuteDetailService _taskExecuteDetailService;
private readonly IRouterService _routerService;
private readonly IOrderDetailsService _OrderDetailsService;
private readonly IMapper _mapper;
public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IOrderDetailsService orderDetails, IMapper mapper)
{
_taskService = taskService;
_taskExecuteDetailService = taskExecuteDetailService;
_routerService = routerService;
_OrderDetailsService = orderDetails;
_mapper = mapper;
}
static string barcode = string.Empty; //条码
public Task Execute(IJobExecutionContext context)
{
try
{
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
if (flag && value != null && value is OtherDevice otherDevice)
{
bool request = otherDevice.Communicator.Read("DB15.22.0"); //申请
bool response = otherDevice.Communicator.Read("DB15.22.1"); //应答
bool wcsResponse = otherDevice.Communicator.Read("DB15.0.0"); //应答
if (request && !response && !wcsResponse)
{
bool[] useables = otherDevice.Communicator.Read("DB15.22.3", 3);
int[] useableArray = GetIndexArray(useables, false);
List useableStations = useableArray.ToList();
for (int i = 0; i < useableStations.Count; i++)
{
useableStations[i] += 1;
}
barcode = otherDevice.Communicator.Read("DB15.32"); //条码
List bytes = otherDevice.Communicator.Read("DB15.34", 40).ToList();
byte[] temp = bytes.ToArray().SelectMiddle(0, bytes.IndexOf(0));
barcode = Encoding.Default.GetString(temp);
string pattern = @"\d+"; // 匹配数字
Match match = Regex.Match(barcode, pattern);
string barcodeNumber = match.Value;
if (!string.IsNullOrEmpty(barcodeNumber))
{
// 1. 获取去向
int toplc = _OrderDetailsService.GetOrderDetails(barcodeNumber, useableStations, out ProductInfoDTO productInfo);
if (toplc > 0)//获取到有效去向
{
if (toplc == 1 && productInfo.Length < productInfo.Width)
{
otherDevice.Communicator.Write("DB15.10", productInfo.Width);
otherDevice.Communicator.Write("DB15.14", productInfo.Length);
otherDevice.Communicator.Write("DB15.18", productInfo.Height);
}
else
{
otherDevice.Communicator.Write("DB15.10", productInfo.Length);
otherDevice.Communicator.Write("DB15.14", productInfo.Width);
otherDevice.Communicator.Write("DB15.18", productInfo.Height);
}
otherDevice.Communicator.Write("DB15.6", toplc); //写入去向
otherDevice.Communicator.Write("DB15.0", true);
//var datast = _OrderDetailsService.ToMesBarc(int.Parse(barcode));
}
else if (toplc == -1)//板材无条码
{
otherDevice.Communicator.Write("DB15.0.3", true);
}
else if (toplc == -2) //板材大小不在区间
{
otherDevice.Communicator.Write("DB15.0.2", true);
}
}
}
else
{
if (wcsResponse && !request)
otherDevice.Communicator.Write("DB15.0", false); //清除响应
}
}
}
catch (Exception ex)
{
WriteError(nameof(CommonConveyorLineJob), ex.ToString(), ex);
}
return Task.CompletedTask;
}
public int[] GetIndexArray(T[] values, T value)
{
List result = new List();
for (int i = 0; i < values.Length; i++)
{
if (value?.Equals(values[i]) ?? false)
{
result.Add(i);
}
}
return result.ToArray();
}
}
}