using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using Autofac.Core; using HslCommunication; using HslCommunication.Core; using Microsoft.VisualBasic.FileIO; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using Quartz; using SixLabors.ImageSharp.PixelFormats; using WIDESEAWCS_BasicInfoService; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class PLCJob : JobBase, IJob { private readonly IBoxingService _boxingService; private readonly IBoxingDetailService _boxingDetailService; private readonly IFormulaService _formulaService; private readonly IFormulaDetailService _formulaDetailService; private readonly IProcessInfoService _processInfoService; private readonly IUnitOfWorkManage _unitOfWorkManage; public PLCJob(IBoxingService boxingService, IBoxingDetailService boxingDetailService, IFormulaService formulaService, IFormulaDetailService formulaDetailService, IProcessInfoService processInfoService, IUnitOfWorkManage unitOfWorkManage) { _boxingService = boxingService; _boxingDetailService = boxingDetailService; _formulaService = formulaService; _formulaDetailService = formulaDetailService; _processInfoService = processInfoService; _unitOfWorkManage = unitOfWorkManage; } private readonly string set = "0x16,0x4D,0x0D,0x30,0x34,0x30,0x31,0x44,0x30,0x35,0x2E";//主机发送设置扫描模式为主机模式的命令,扫描器返回接收到的命令和(0x06)后,将扫描模式更改为主机模式 private readonly string Text = "开启扫码";//主机发送设置扫描模式为主机模式的命令,扫描器返回接收到的命令和(0x06)后,将扫描模式更改为主机模式 private readonly string command = "0x16,0x54,0x0D";//发送开始解码命令;"0x16,0x55,0x0D"发送停止解码命令 public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { if (value is OtherDevice) { OtherDevice device = (OtherDevice)value; try { var Heart = device.GetValue(R_PLCDBName.rboolHeart); var EMG = device.GetValue(R_PLCDBName.rboolEMG); var AutoExecuting = device.GetValue(R_PLCDBName.rboolAutoExecuting); var OnlineExecuting = device.GetValue(R_PLCDBName.rboolOnlineExecuting); var Error = device.GetValue(R_PLCDBName.rboolError); if (Heart && !EMG && AutoExecuting && OnlineExecuting && !Error) { #region 上线扫码 HandleOnlineScan(device); #endregion #region 压装扫码 HandlePressScan(device); #endregion #region 检测扫码 HandleDetectScan(device); #endregion #region 下线扫码 HandleOfflineScan(device); #endregion } } catch (Exception ex) { WriteError(device.DeviceName, "错误", ex); } } } return Task.CompletedTask; } /// /// 上线扫码 /// /// private void HandleOnlineScan(OtherDevice device) { var Location1ScanStart = device.GetValue(R_PLCDBName.rboolLocation1ScanStart); var Location1ScanDone = device.GetValue(W_PLCDBName.wboolLocation1ScanDone); if (Location1ScanStart && !Location1ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询组盘数据,判断托盘绑定成品是否已绑定所有所需零件 { #region 串口连接 SerialPortCommunicator portCommunicator1 = new SerialPortCommunicator("COM1", 9600, "上线扫码枪"); bool IsConnected1 = false; SerialPortCommunicator portCommunicator2 = new SerialPortCommunicator("COM2", 9600, "上线扫码枪"); bool IsConnected2 = false; if (!IsConnected1) IsConnected1 = portCommunicator1.Connect(); if (!IsConnected2) IsConnected2 = portCommunicator2.Connect(); byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//转成字节数组 portCommunicator1.Write(dataToSend1); string receiveData = portCommunicator2.ToString(Encoding.UTF8); //if (receiveData == "0x16,0x54,0x0D") //{ // Console.WriteLine(receiveData); byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//转成字节数组 portCommunicator2.Write(dataToSend2); //} string PalletCode = portCommunicator1.ToString(Encoding.UTF8); using (var uow = _unitOfWorkManage.CreateUnitOfWork()) { try { if (PalletCode.IsNotEmptyOrNull()) { var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode); if (boxing == null) { WriteError(device.DeviceName, "空托盘"); return; } List dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == boxing.Id); Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == boxing.ProductCode); if (dt_Formula == null) { WriteError(device.DeviceName, "无成品配方"); return; } List dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id); //比较零件是否齐全 if (!_boxingDetailService.IsComponentCodesEqual(dt_BoxingDetails, dt_FormulaDetails)) { WriteError(device.DeviceName, "零件有问题,请处理"); return; } } //提交事务 uow.Commit(); IsConnected1 = !portCommunicator1.Disconnect(); IsConnected2 = !portCommunicator2.Disconnect(); #endregion device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true); } catch (Exception ex) { WriteError(device.DeviceName, "上线扫码流程执行异常", ex); } } } else if (!Location1ScanStart && Location1ScanDone) { device.SetValue(W_PLCDBName.wboolLocation1ScanDone, false); } } /// /// 压装扫码 /// /// private void HandlePressScan(OtherDevice device) { var Location2ScanStart = device.GetValue(R_PLCDBName.rboolLocation2ScanStart); var Location2ScanDone = device.GetValue(W_PLCDBName.wboolLocation2ScanDone); if (Location2ScanStart && !Location2ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询托盘绑定成品加工所需数据,写入PLC { #region MyRegion #region 串口连接 SerialPortCommunicator portCommunicator17 = new SerialPortCommunicator("COM17", 9600, "压装扫码枪"); bool IsConnected17 = false; SerialPortCommunicator portCommunicator18 = new SerialPortCommunicator("COM18", 9600, "压装扫码枪"); bool IsConnected18 = false; if (!IsConnected17) IsConnected17 = portCommunicator17.Connect(); if (!IsConnected18) IsConnected18 = portCommunicator18.Connect(); byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//转成字节数组 portCommunicator17.Write(dataToSend1); string receiveData = portCommunicator18.ToString(Encoding.UTF8); byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//转成字节数组 portCommunicator18.Write(dataToSend2); //} string PalletCode = portCommunicator17.ToString(Encoding.UTF8); using (var uow = _unitOfWorkManage.CreateUnitOfWork()) { try { if (PalletCode.IsNotEmptyOrNull()) { Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode); Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode); //写入PLC device.SetValue(W_PLCDBName.wrealProductLength, dt_Formula.ProductLength); device.SetValue(W_PLCDBName.wrealProductWidth, dt_Formula.ProductWidth); device.SetValue(W_PLCDBName.wrealProductHeight, dt_Formula.ProductHeight); device.SetValue(W_PLCDBName.wrealScrewDownsetDistance, dt_Formula.ScrewDownsetDistance); device.SetValue(W_PLCDBName.wrealScrewTorqueOutput, dt_Formula.ScrewTorqueOutput); device.SetValue(W_PLCDBName.wDintAutoScrewOn, dt_Formula.DintAutoScrewOn); //压装扫码完成 device.SetValue(W_PLCDBName.wboolLocation2ScanDone, true); //接收数据 float PressHeight = device.GetValue(R_PLCDBName.rrealDetectPressHeight); float ScrewTorque = device.GetValue(R_PLCDBName.rrealDetectScrewTorque); float ScrewAngle = device.GetValue(R_PLCDBName.rrealDetectScrewAngle); //添加到数据库 Dt_ProcessInfo dt_ProcessInfo = new Dt_ProcessInfo() { PalletCode = PalletCode, ProductCode = dt_Formula.ProductCode, ProductName = dt_Formula.ProductName, PressHeight = PressHeight, ScrewTorque = ScrewTorque, ScrewAngle = ScrewAngle }; _processInfoService.Repository.AddData(dt_ProcessInfo); } //提交事务 uow.Commit(); IsConnected17 = !portCommunicator17.Disconnect(); IsConnected18 = !portCommunicator18.Disconnect(); #endregion #endregion } catch (Exception ex) { WriteError(device.DeviceName, "压装扫码流程执行异常", ex); } } } else if (!Location2ScanStart && Location2ScanDone) { device.SetValue(W_PLCDBName.wboolLocation2ScanDone, false); } } /// /// 检测扫码 /// /// private void HandleDetectScan(OtherDevice device) { var Location3ScanStart = device.GetValue(R_PLCDBName.rboolLocation3ScanStart); var Location3ScanDone = device.GetValue(W_PLCDBName.wboolLocation3ScanDone); if (Location3ScanStart && !Location3ScanDone) { #region MyRegion #region 串口连接 SerialPortCommunicator portCommunicator19 = new SerialPortCommunicator("COM19", 9600, "检测扫码枪"); bool IsConnected19 = false; SerialPortCommunicator portCommunicator20 = new SerialPortCommunicator("COM20", 9600, "检测扫码枪"); bool IsConnected20 = false; if (!IsConnected19) IsConnected19 = portCommunicator19.Connect(); if (!IsConnected20) IsConnected20 = portCommunicator20.Connect(); byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//转成字节数组 portCommunicator19.Write(dataToSend1); string receiveData = portCommunicator20.ToString(Encoding.UTF8); byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//转成字节数组 portCommunicator20.Write(dataToSend2); //} string PalletCode = portCommunicator19.ToString(Encoding.UTF8); using (var uow = _unitOfWorkManage.CreateUnitOfWork()) { try { if (PalletCode.IsNotEmptyOrNull()) { Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode); Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode); //写入PLC device.SetValue(W_PLCDBName.wrealXDirectionDistance1, dt_Formula.XDirectionDistance1); device.SetValue(W_PLCDBName.wrealYDirectionHeight1, dt_Formula.YDirectionHeight1); device.SetValue(W_PLCDBName.wrealXDirectionDistance2, dt_Formula.XDirectionDistance2); device.SetValue(W_PLCDBName.wrealYDirectionHeight2, dt_Formula.YDirectionHeight2); device.SetValue(W_PLCDBName.wrealXDirectionDistance3, dt_Formula.XDirectionDistance3); device.SetValue(W_PLCDBName.wrealYDirectionHeight3, dt_Formula.YDirectionHeight3); //检测扫码完成 device.SetValue(W_PLCDBName.wboolLocation3ScanDone, true); //接收数据 float Height1 = device.GetValue(R_PLCDBName.rrealDetectHeight1); float Height2 = device.GetValue(R_PLCDBName.rrealDetectHeight2); float Height3 = device.GetValue(R_PLCDBName.rrealDetectHeight3); Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode); if (dt_ProcessInfo == null) { WriteInfo(device.DeviceName, "成品未压装"); device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true); return; } dt_ProcessInfo.Height1 = Height1; dt_ProcessInfo.Height2 = Height2; dt_ProcessInfo.Height3 = Height3; _processInfoService.Repository.UpdateData(dt_ProcessInfo); } //提交事务 uow.Commit(); IsConnected19 = !portCommunicator19.Disconnect(); IsConnected20 = !portCommunicator20.Disconnect(); #endregion #endregion } catch (Exception ex) { WriteError(device.DeviceName, "检测扫码流程执行异常", ex); } } } else if (!Location3ScanStart && Location3ScanDone) { device.SetValue(W_PLCDBName.wboolLocation3ScanDone, false); } } /// /// 下线扫码 /// /// private void HandleOfflineScan(OtherDevice device) { var Location4ScanStart = device.GetValue(R_PLCDBName.rboolLocation4ScanStart); var Location4ScanDone = device.GetValue(W_PLCDBName.wboolLocation4ScanDone); if (Location4ScanStart && !Location4ScanDone)//控制扫码枪扫描托盘码,根据托盘码查询组盘数据,判断托盘绑定成品是否已绑定所有所需零件 { SerialPortCommunicator portCommunicator21 = new SerialPortCommunicator("COM21", 9600, "下线扫码枪"); bool IsConnected21 = false; SerialPortCommunicator portCommunicator22 = new SerialPortCommunicator("COM22", 9600, "下线扫码枪"); bool IsConnected22 = false; if (!IsConnected21) IsConnected21 = portCommunicator21.Connect(); if (!IsConnected22) IsConnected22 = portCommunicator22.Connect(); byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//转成字节数组 portCommunicator21.Write(dataToSend1); string receiveData = portCommunicator22.ToString(Encoding.UTF8); byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//转成字节数组 portCommunicator22.Write(dataToSend2); //} string PalletCode = portCommunicator21.ToString(Encoding.UTF8); using (var uow = _unitOfWorkManage.CreateUnitOfWork()) { try { if (PalletCode.IsNotEmptyOrNull()) { Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode); _boxingService.Repository.DeleteData(dt_Boxing); List dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == dt_Boxing.Id); foreach (Dt_BoxingDetail dt_BoxingDetail in dt_BoxingDetails) { _boxingDetailService.Repository.DeleteDataById(dt_BoxingDetail.Id); } uow.Commit(); //下线扫码完成 device.SetValue(W_PLCDBName.wboolLocation4ScanDone, true); } IsConnected21 = !portCommunicator21.Disconnect(); IsConnected22 = !portCommunicator22.Disconnect(); } catch (Exception ex) { WriteError(device.DeviceName, "下线扫码流程执行异常", ex); } } } else if (!Location4ScanStart && Location4ScanDone) { device.SetValue(W_PLCDBName.wboolLocation2ScanDone, false); } } } }