leiqunqing
2026-01-19 ba8aa925e7901381ceb394adb53eca8723d1c4c5
´úÂë¹ÜÀí/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs
@@ -1,27 +1,13 @@
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 System.Text;
using Quartz;
using SixLabors.ImageSharp.PixelFormats;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Common.PLCEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
namespace WIDESEAWCS_Tasks
{
@@ -33,22 +19,33 @@
        private readonly IFormulaService _formulaService;
        private readonly IFormulaDetailService _formulaDetailService;
        private readonly IProcessInfoService _processInfoService;
        private readonly IProcessInfoDetailService _processDetailInfoService;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public PLCJob(IBoxingService boxingService, IBoxingDetailService boxingDetailService, IFormulaService formulaService, IFormulaDetailService formulaDetailService, IProcessInfoService processInfoService, IUnitOfWorkManage unitOfWorkManage)
        private readonly IScanStationService _scanStationService;
        //private readonly string PalletCode = "PL107";
        public PLCJob(IBoxingService boxingService,
            IBoxingDetailService boxingDetailService,
            IFormulaService formulaService,
            IFormulaDetailService formulaDetailService,
            IProcessInfoService processInfoService,
            IProcessInfoDetailService processDetailInfoService,
            IUnitOfWorkManage unitOfWorkManage,
            IScanStationService scanStationService
            )
        {
            _boxingService = boxingService;
            _boxingDetailService = boxingDetailService;
            _formulaService = formulaService;
            _formulaDetailService = formulaDetailService;
            _processInfoService = processInfoService;
            _processDetailInfoService = processDetailInfoService;
            _unitOfWorkManage = unitOfWorkManage;
            _scanStationService = scanStationService;
        }
        private readonly string set = "0x16,0x4D,0x0D,0x30,0x34,0x30,0x31,0x44,0x30,0x35,0x2E";//主机发送设置扫描模式为主机模式的命令,扫描器返回接收到的命令和<ACK>(0x06)后,将扫描模式更改为主机模式
        private readonly string Text = "开启扫码";//主机发送设置扫描模式为主机模式的命令,扫描器返回接收到的命令和<ACK>(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)
            {
@@ -63,6 +60,7 @@
                        var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
                        var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
                        var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
                        if (Heart && !EMG && AutoExecuting && OnlineExecuting && !Error)
                        {
                            #region ä¸Šçº¿æ‰«ç 
@@ -103,64 +101,35 @@
            var Location1ScanDone = device.GetValue<W_PLCDBName, bool>(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())
                var PalletCode = TcpClientExample.Start("192.168.2.120", 2001);
                try
                {
                    try
                    if (!PalletCode.IsNotEmptyOrNull())
                    {
                        if (PalletCode.IsNotEmptyOrNull())
                        {
                            var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                            if (boxing == null)
                            {
                                WriteError(device.DeviceName, "空托盘");
                                return;
                            }
                            List<Dt_BoxingDetail> 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_FormulaDetail> 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);
                        throw new InvalidOperationException("托盘为空");
                    }
                    catch (Exception ex)
                    var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    if (boxing == null)
                    {
                        WriteError(device.DeviceName, "上线扫码流程执行异常", ex);
                        throw new InvalidOperationException("未添加组盘信息");
                    }
                    List<Dt_BoxingDetail> 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)
                    {
                        throw new InvalidOperationException("无成品配方");
                    }
                    List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id && x.IsScanned == 1);
                    //比较零件是否齐全
                    if (!_boxingDetailService.IsComponentCodesEqual(dt_BoxingDetails, dt_FormulaDetails))
                    {
                        throw new InvalidOperationException("零件有问题,请处理");
                    }
                    device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true);
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "上线扫码流程执行异常", ex);
                }
            }
            else if (!Location1ScanStart && Location1ScanDone)
@@ -179,71 +148,44 @@
            var Location2ScanDone = device.GetValue<W_PLCDBName, bool>(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())
                var PalletCode = TcpClientExample.Start("192.168.2.121", 2001);
                try
                {
                    try
                    if (!PalletCode.IsNotEmptyOrNull())
                    {
                        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, float>(R_PLCDBName.rrealDetectPressHeight);
                            float ScrewTorque = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewTorque);
                            float ScrewAngle = device.GetValue<R_PLCDBName, float>(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
                        throw new InvalidOperationException("托盘为空");
                    }
                    catch (Exception ex)
                    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);
                    //接收数据
                    decimal PressHeight = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectPressHeight);
                    decimal ScrewTorque = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewTorque);
                    decimal ScrewAngle = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewAngle);
                    //添加到数据库
                    Dt_ProcessInfo dt_ProcessInfo = new Dt_ProcessInfo()
                    {
                        WriteError(device.DeviceName, "压装扫码流程执行异常", ex);
                    }
                        PalletCode = PalletCode,
                        ProductCode = dt_Formula.ProductCode,
                        ProductName = dt_Formula.ProductName,
                        PressHeight = PressHeight,
                        ScrewTorque = ScrewTorque,
                        ScrewAngle = ScrewAngle
                    };
                    _processInfoService.Repository.AddData(dt_ProcessInfo);
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "压装扫码流程执行异常", ex);
                }
            }
            else if (!Location2ScanStart && Location2ScanDone)
@@ -262,71 +204,44 @@
            var Location3ScanDone = device.GetValue<W_PLCDBName, bool>(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())
                var PalletCode = TcpClientExample.Start("192.168.2.122", 2001);
                try
                {
                    try
                    if (!PalletCode.IsNotEmptyOrNull())
                    {
                        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, float>(R_PLCDBName.rrealDetectHeight1);
                            float Height2 = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight2);
                            float Height3 = device.GetValue<R_PLCDBName, float>(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
                        throw new InvalidOperationException("托盘为空");
                    }
                    catch (Exception ex)
                    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);
                    //接收数据
                    decimal Height1 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight1);
                    decimal Height2 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight2);
                    decimal Height3 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight3);
                    Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                    if (dt_ProcessInfo == null)
                    {
                        WriteError(device.DeviceName, "检测扫码流程执行异常", ex);
                        throw new InvalidOperationException("成品未压装");
                    }
                    dt_ProcessInfo.Height1 = Height1;
                    dt_ProcessInfo.Height2 = Height2;
                    dt_ProcessInfo.Height3 = Height3;
                    _processInfoService.Repository.UpdateData(dt_ProcessInfo);
                }
                catch (Exception ex)
                {
                    WriteError(device.DeviceName, "检测扫码流程执行异常", ex);
                }
            }
            else if (!Location3ScanStart && Location3ScanDone)
@@ -346,38 +261,38 @@
            var Location4ScanDone = device.GetValue<W_PLCDBName, bool>(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);
                var PalletCode = TcpClientExample.Start("192.168.2.123", 2001);
                using (var uow = _unitOfWorkManage.CreateUnitOfWork())
                {
                    try
                    {
                        if (PalletCode.IsNotEmptyOrNull())
                        if (!PalletCode.IsNotEmptyOrNull())
                        {
                            Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                            _boxingService.Repository.DeleteData(dt_Boxing);
                            List<Dt_BoxingDetail> 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);
                            throw new InvalidOperationException("托盘为空");
                        }
                        IsConnected21 = !portCommunicator21.Disconnect();
                        IsConnected22 = !portCommunicator22.Disconnect();
                        Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                        if (dt_ProcessInfo == null)
                        {
                            throw new InvalidOperationException("成品未压装和检测");
                        }
                        Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
                        _boxingService.Repository.DeleteData(dt_Boxing);
                        List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == dt_Boxing.Id);
                        _boxingDetailService.Repository.DeleteData(dt_BoxingDetails);
                        Dt_ProcessInfoDetail dt_ProcessInfoDetail = new Dt_ProcessInfoDetail()
                        {
                            PalletCode = PalletCode,
                            ProductCode = dt_ProcessInfo.ProductCode,
                            ProductName = dt_ProcessInfo.ProductName,
                            Creater = "admin",
                            CreateDate = DateTime.Now
                        };
                        _processDetailInfoService.Repository.AddData(dt_ProcessInfoDetail);
                        _processInfoService.DeleteData(dt_ProcessInfo);
                        uow.Commit();
                        //下线扫码完成
                        device.SetValue(W_PLCDBName.wboolLocation4ScanDone, true);
                    }
                    catch (Exception ex)
                    {