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_Communicator;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_ISystemServices;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_Model.Models.System;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_QuartzJob.DeviceBase;
|
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
|
using WIDESEAWCS_Tasks.OHT;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
[DisallowConcurrentExecution]
|
public class ZXJJob : JobBase, IJob
|
{
|
public static bool W_ZXJ_Heat = true;
|
public static bool W_TC_Heat = true;
|
public static bool W_GZJ_Heat = true;
|
private readonly ITaskService _taskService;
|
private readonly Idt_ThicknessHtyService _IThicknessHtyService;
|
private readonly Idt_WeightHtyService _IWeightHtyService;
|
WebSocketServer _webSocketServer;
|
private readonly Idt_ErrormsginfoService _ErrormsginfoService;
|
public ZXJJob(ITaskService taskService, WebSocketServer webSocketServer,Idt_ErrormsginfoService errormsginfoService, Idt_ThicknessHtyService ThicknessHtyService, Idt_WeightHtyService WeightHtyService)
|
{
|
_taskService = taskService;//注入
|
_webSocketServer = webSocketServer;
|
_ErrormsginfoService = errormsginfoService;
|
_IThicknessHtyService = ThicknessHtyService;
|
_IWeightHtyService = WeightHtyService;
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
//return Task.CompletedTask;
|
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
|
if (flag && value != null)
|
{
|
|
try
|
{
|
//天车PLC对象
|
OtherDevice TCevice = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "天车");
|
if (TCevice.Communicator.IsConnected)
|
{
|
#region 读取天车设备数据
|
OHTJob.oHTReadData.R_HeartBeat = TCevice.GetValue<DeviceDBName, bool>(DeviceDBName.R_HeartBeat);
|
OHTJob.oHTReadData.R_RunMode = TCevice.GetValue<DeviceDBName, short>(DeviceDBName.R_RunMode);
|
OHTJob.oHTReadData.R_RunState = TCevice.GetValue<DeviceDBName, short>(DeviceDBName.R_RunState);
|
OHTJob.oHTReadData.R_AlarmCode = TCevice.GetValue<DeviceDBName, short>(DeviceDBName.R_AlarmCode);
|
OHTJob.oHTReadData.R_TaskState = TCevice.GetValue<DeviceDBName, short>(DeviceDBName.R_TaskState);
|
OHTJob.oHTReadData.R_CurrentLine = TCevice.GetValue<DeviceDBName, int>(DeviceDBName.R_CurrentLine);
|
OHTJob.oHTReadData.R_CurrentColumn = TCevice.GetValue<DeviceDBName, int>(DeviceDBName.R_CurrentColumn);
|
OHTJob.oHTReadData.R_RiseUp_Position = TCevice.GetValue<DeviceDBName, int>(DeviceDBName.R_RiseUp_Position);
|
OHTJob.oHTReadData.R_TaskNumber = TCevice.GetValue<DeviceDBName, int>(DeviceDBName.R_TaskNumber);
|
OHTJob.oHTReadData.R_Loaded_1 = TCevice.GetValue<DeviceDBName, short>(DeviceDBName.R_Loaded_1);
|
OHTJob.oHTReadData.R_Loaded_2 = TCevice.GetValue<DeviceDBName, short>(DeviceDBName.R_Loaded_2);
|
OHTJob.oHTReadData.weight = TCevice.GetValue<DeviceDBName, float>(DeviceDBName.weight);
|
#endregion
|
if (W_TC_Heat)
|
{
|
W_TC_Heat = false;
|
TCevice.SetValue(DeviceDBName.W_HeartBeat, W_TC_Heat);
|
}
|
else
|
{
|
W_TC_Heat = true;
|
TCevice.SetValue(DeviceDBName.W_HeartBeat, W_TC_Heat);
|
}
|
}
|
else
|
{
|
throw new Exception($"天车PLC连接失败");
|
}
|
//整形机PLC对象
|
OtherDevice device = (OtherDevice)value;
|
if (device.Communicator.IsConnected)
|
{
|
#region 读取整形机设备数据
|
OHTJob.oHTReadData.R_ZXJ_HeartBeat = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_ZXJ_HeartBeat);
|
OHTJob.oHTReadData.R_ZXJ_isWork = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_ZXJ_isWork);
|
OHTJob.oHTReadData.R_ZXJ_RGVMode = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_ZXJ_RGVMode);
|
OHTJob.oHTReadData.R_ZXJ_TCMode = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_ZXJ_TCMode);
|
OHTJob.oHTReadData.R_ZXJ_TC_isready = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_ZXJ_TC_isready);
|
OHTJob.oHTReadData.R_TCMode_TC = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_TCMode_TC);
|
OHTJob.oHTReadData.R_TCMode_CC = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_TCMode_CC);
|
OHTJob.oHTReadData.R_HC_isReady = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_HC_isReady);
|
OHTJob.oHTReadData.R_HC_isReadyWork = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_HC_isReadyWork);
|
OHTJob.oHTReadData.R_issafe = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_issafe);
|
//总数
|
OHTJob.oHTReadData.R_CommonRecorder = device.GetValue<ZXJDBName, Int16>(ZXJDBName.R_CommonRecorder);
|
OHTJob.oHTReadData.R_SpecialRecorder = device.GetValue<ZXJDBName, Int16>(ZXJDBName.R_SpecialRecorder);
|
OHTJob.oHTReadData.R_TotalWeight = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TotalWeight);
|
//重量厚度上、下限值
|
//厚度
|
float tza1 = OHTJob.oHTReadData.R_TopLeftUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopLeftUp);
|
float tza2 = OHTJob.oHTReadData.R_TopLeftBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopLeftBelow);
|
float tzb1 = OHTJob.oHTReadData.R_TopMiddleUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopMiddleUp);
|
float tzb2 = OHTJob.oHTReadData.R_TopMiddleBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopMiddleBelow);
|
float tzc1 = OHTJob.oHTReadData.R_TopRightUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopRightUp);
|
float tzc2 = OHTJob.oHTReadData.R_TopRightBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopRightBelow);
|
float tzd1 = OHTJob.oHTReadData.R_CentreLeftUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreLeftUp);
|
float tzd2 = OHTJob.oHTReadData.R_CentreLeftBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreLeftBelow);
|
float tze1 = OHTJob.oHTReadData.R_CentreMiddleUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreMiddleUp);
|
float tze2 = OHTJob.oHTReadData.R_CentreMiddleBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreMiddleBelow);
|
float tzf1 = OHTJob.oHTReadData.R_CentreRightUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreRightUp);
|
float tzf2 = OHTJob.oHTReadData.R_CentreRightBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreRightBelow);
|
float tzg1 = OHTJob.oHTReadData.R_BottomLeftUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_BottomLeftUp);
|
float tzg2 = OHTJob.oHTReadData.R_BottomLeftBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_BottomLeftBelow);
|
float tzh1 = OHTJob.oHTReadData.R_BottomRightUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_BottomRightUp);
|
float tzh2 = OHTJob.oHTReadData.R_BottomRightBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_BottomRightBelow);
|
//重量
|
float ws1 = OHTJob.oHTReadData.R_WeightUp = device.GetValue<ZXJDBName, float>(ZXJDBName.R_WeightUp);
|
float ws2 = OHTJob.oHTReadData.R_WeightBelow = device.GetValue<ZXJDBName, float>(ZXJDBName.R_WeightBelow);
|
|
//重量厚度值
|
//厚度
|
float tz1 = OHTJob.oHTReadData.R_TopLeft = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopLeft);
|
float tz2 = OHTJob.oHTReadData.R_TopMiddle = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopMiddle);
|
float tz3 = OHTJob.oHTReadData.R_TopRight = device.GetValue<ZXJDBName, float>(ZXJDBName.R_TopRight);
|
float tz4 = OHTJob.oHTReadData.R_CentreLeft = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreLeft);
|
float tz5 = OHTJob.oHTReadData.R_CentreMiddle = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreMiddle);
|
float tz6 = OHTJob.oHTReadData.R_CentreRight = device.GetValue<ZXJDBName, float>(ZXJDBName.R_CentreRight);
|
float tz7 = OHTJob.oHTReadData.R_BottomLeft = device.GetValue<ZXJDBName, float>(ZXJDBName.R_BottomLeft);
|
float tz8 = OHTJob.oHTReadData.R_BottomRight = device.GetValue<ZXJDBName, float>(ZXJDBName.R_BottomRight);
|
//重量
|
float w = OHTJob.oHTReadData.R_Weight = device.GetValue<ZXJDBName, float>(ZXJDBName.R_Weight);
|
|
//记录重量厚度
|
bool thickness = OHTJob.oHTReadData.R_ThicknessRecorder = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_ThicknessRecorder);
|
bool weight = OHTJob.oHTReadData.R_WeightRecorder = device.GetValue<ZXJDBName, bool>(ZXJDBName.R_WeightRecorder);
|
#endregion
|
//记录重量与厚度
|
//厚度
|
if (thickness)
|
{
|
dt_Thickness_hty dt_thickness = new dt_Thickness_hty();
|
dt_thickness.topleft = tz1;
|
dt_thickness.topmiddle = tz2;
|
dt_thickness.topright = tz3;
|
dt_thickness.centreleft = tz4;
|
dt_thickness.centremiddle = tz5;
|
dt_thickness.centreright = tz6;
|
dt_thickness.bottomleft = tz7;
|
dt_thickness.bottomright = tz8;
|
//判断合格
|
if (tz1 < tza2 && tz1 > tza1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz2 < tzb2 && tz1 > tzb1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz3 < tzc2 && tz1 > tzc1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz4 < tzd2 && tz1 > tzd1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz5 < tze2 && tz1 > tze1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz6 < tzf2 && tz1 > tzf1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz7 < tzg2 && tz1 > tzg1)
|
{
|
dt_thickness.qualified = 1;
|
}else if (tz8 < tzh2 && tz1 > tzh1)
|
{
|
dt_thickness.qualified = 1;
|
}else
|
{
|
dt_thickness.qualified = 0;
|
}
|
//区间值
|
dt_thickness.interval = tza1 + "-" + tza2+","+ tzb1 + "-" + tzb2 + "," + tzc1 + "-" + tzc2 + "," + tzd1 + "-" + tzd2 + "," + tze1 + "-" + tze2 + "," + tzf1 + "-" + tzf2 + "," + tzg1 + "-" + tzg2 + "," + tzh1 + "-" + tzh2;
|
if(tz1 != 0 && tz2 != 0 && tz3 != 0 && tz4 != 0 && tz5 != 0 && tz6 != 0 && tz7 != 0 && tz8 != 0)
|
{
|
_IThicknessHtyService.AddData(dt_thickness);
|
}
|
device.SetValue(DeviceDBName.R_ThicknessSuccess, true);
|
//防止整形机没收到信号延时
|
Thread.Sleep(400);
|
device.SetValue(DeviceDBName.R_ThicknessSuccess, false);
|
//防止整形机不能即使更改信号导致重复生成记录,延时
|
Thread.Sleep(400);
|
}
|
//重量
|
if (weight)
|
{
|
dt_Weight_hty dt_weight = new dt_Weight_hty();
|
dt_weight.weight = w;
|
//判断合格
|
if (w>ws1&&w<ws2)
|
{
|
dt_weight.qualified = 1;
|
}
|
else
|
{
|
dt_weight.qualified = 0;
|
}
|
//区间值
|
dt_weight.interval = ws1+"-"+ws2;
|
//不得小于150大于350
|
if (w > 150 && w < 350 && w!=0)
|
{
|
_IWeightHtyService.AddData(dt_weight);
|
}
|
device.SetValue(DeviceDBName.R_WeightSuccess, true);
|
bool c = device.GetValue<DeviceDBName, bool>(DeviceDBName.R_WeightSuccess);
|
//防止整形机没收到信号延时
|
Thread.Sleep(400);
|
device.SetValue(DeviceDBName.R_WeightSuccess, false);
|
//防止整形机不能即使更改信号导致重复生成记录,延时
|
Thread.Sleep(400);
|
}
|
|
if (W_ZXJ_Heat)
|
{
|
W_ZXJ_Heat = false;
|
device.SetValue(ZXJDBName.W_ZXJ_HeartBeat, W_ZXJ_Heat);
|
}
|
else
|
{
|
W_ZXJ_Heat = true;
|
device.SetValue(ZXJDBName.W_ZXJ_HeartBeat, W_ZXJ_Heat);
|
}
|
}
|
else
|
{
|
throw new Exception($"整形机PLC连接失败");
|
}
|
//规整机PLC对象
|
OtherDevice GZJevice = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "阳极规整机");
|
if (GZJevice.Communicator.IsConnected)
|
{
|
#region 读取规整机设备数据
|
OHTJob.oHTReadData.R_ZXJ_HeartBeat = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_GZJ_HeartBeat);
|
OHTJob.oHTReadData.R_GZJ_isWork = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_GZJ_isWork);
|
OHTJob.oHTReadData.R_RGVMode = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_RGVMode);
|
OHTJob.oHTReadData.R_CCMode = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_CCMode);
|
OHTJob.oHTReadData.R_TCMode = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_TCMode);
|
OHTJob.oHTReadData.R_DK_isready = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_DK_isready);
|
OHTJob.oHTReadData.R_XK_isready = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_XK_isready);
|
OHTJob.oHTReadData.R_TC_isready = GZJevice.GetValue<GZJDBName, bool>(GZJDBName.R_TC_isready);
|
#endregion
|
if (W_GZJ_Heat)
|
{
|
W_GZJ_Heat = false;
|
GZJevice.SetValue(GZJDBName.W_GZJ_HeartBeat, W_GZJ_Heat);
|
}
|
else
|
{
|
W_GZJ_Heat = true;
|
GZJevice.SetValue(GZJDBName.W_GZJ_HeartBeat, W_GZJ_Heat);
|
}
|
}
|
else
|
{
|
throw new Exception($"规整机PLC连接失败");
|
}
|
//状态数据发送给前端
|
string ohtData = JsonConvert.SerializeObject(OHTJob.oHTReadData);
|
_webSocketServer.PublishAllClientPayload(ohtData);
|
}
|
catch (Exception ex)
|
{
|
//状态数据发送给前端
|
string ohtData = JsonConvert.SerializeObject(OHTJob.oHTReadData);
|
_webSocketServer.PublishAllClientPayload(ohtData);
|
_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();
|
|
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;
|
}
|
|
|
}
|
|
|
}
|