11
yanjinhui
2025-03-26 4073bcc6e43f8f72945da396915f32d9d986967c
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Tasks/SerialPort/SerialPortTestJob.cs
@@ -1,177 +1,290 @@
using System.IO.Ports;
using System.Text;
using Quartz;
using WIDESEA_ISerialPortService;
using WIDESEAWCS_Model.Models;
//using System;
//using System.Collections.Generic;
//using System.IO.Ports;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
//using Quartz;
//using WIDESEA_ISerialPortRepository;
//using WIDESEA_SerialPortRepository;
//using WIDESEAWCS_Model.Models;
//using WIDESEAWCS_QuartzJob;
//namespace WIDESEAWCS_Tasks
//{
//    [DisallowConcurrentExecution]
//    public class SerialPortJob : JobBase, IJob
//    {
//        //dispatchinfo
//        //1   æµ‹è¯• OtherDevice WIDESEAWCS_Tasks SerialPortJob   1   NULL NULL    NULL   1   2025-02-19 14:55:02.167   NULL NULL
//        public enum CommandType
//        {
//            None = 0,
//            Get = 1,
//            Set = 2,
//        }
//        private readonly IPutakeRepository _putakeRepository;
//        private readonly INJCommandsRepository _nJCommandsRepository;
//        private readonly IProcessRepository _processRepository;
//        private readonly ITorqueOpRepository _orqueOpRepository;
//        public SerialPortJob(IPutakeRepository putakeRepository, INJCommandsRepository nJCommandsRepository, IProcessRepository processRepository, ITorqueOpRepository torqueOpRepository)
//        {
//            _putakeRepository = putakeRepository;
//            _nJCommandsRepository = nJCommandsRepository;
//            _processRepository = processRepository;
//            _orqueOpRepository = torqueOpRepository;
//        }
namespace WIDESEAWCS_Tasks
{
    public class SerialPortTestJob:IJob
    {
        // åœ¨ SerialPortTestService ç±»ä¸­æ·»åР坹 ISerialPortService çš„引用
        private readonly ISerialPortService _serialPortService;
        public readonly string _port;
        public SerialPort SerialPort { get; set; } =null!; //表示要打开的串口,可为空
        // æž„造函数
        public SerialPortTestJob(ISerialPortService serialPortService)
        {
            _serialPortService = serialPortService;
            _port = "COM3";
//        private static SerialPort serialPort;
//        private static CommandType commandType = CommandType.None;
//        //private string commandGet = "824070241JNT\r";//读值
//        //private string commandSet = "824070241JNT,0012500,+0001000[+TOL],-0001000[-TOL]\r";//设值
//        private string setOK = "ParseOK";
//        //private string getOK = "82407024103";
//        //private string getError = "82407024104";
//        public Task Execute(IJobExecutionContext context)
//        {
//            #region å…ˆæŸ¥åˆ°è¿™æ¡å‘½ä»¤
//            string commandSet = "";
//            string commandGet = "";
//            string getOK = "";
//            string getError = "";
            SerialPort = new SerialPort(_port);
//            var com = _nJCommandsRepository.QueryFirst(x => x.ID == 3);
//            if (com != null)
//            {
//                commandSet = string.Format("{0}JNT,{1},{2},{3}\r", com.DeviceNum, com.TorqueValue, com.TorqueMax, com.TorqueMin);//"824070241JNT,0005000,+0001000[+TOL],-0001000[-TOL]\r"
//                commandGet = string.Format("{0}\t", com.DeviceNum);// "824070241JNT\r"
//                getOK = string.Format("{0}03", com.DeviceNum);// "82407024103"
//                getError = string.Format("{0}04", com.DeviceNum);// "82407024104"
//            }
//            else
//            {
//                throw new Exception("未找到指定的命令数据!");
//            }
//            #endregion
            //串口接收到数据时,SerialPort ä¼šè‡ªåŠ¨è§¦å‘ DataReceived äº‹ä»¶
            //SerialPort.DataReceived += OnDataReceived; //接收串口发出的数据
        }
        private CancellationTokenSource _cancellationTokenSource;
        private Task _sendTask;
        private int commandType = 2;
        // å‘½ä»¤å­—符串
        private string command0 = "";  // ä¸å‘送命令
        private string command1 = "824070241JNT\r"; //发送信号
        private string command2 = "824070241JNT,0005000,+0001000[+TOL],-0001000[-TOL]\r"; //设值
        public Task Execute(IJobExecutionContext context)
        {
            //OpenSerialPort();
            SerialPort.DataReceived += OnDataReceived;
            return Task.CompletedTask;
        }
//            try
//            {
//                if (serialPort == null) { serialPort = new SerialPort("COM3"); serialPort.DataReceived += SerialPort_DataReceived; }
//                if (!serialPort.IsOpen)
//                {
//                    serialPort.Open();
        // ç”¨äºŽå­˜å‚¨æŽ¥æ”¶åˆ°çš„æ•°æ®
        private List<string> receivedDataList = new List<string>();
//                    serialPort.Write(commandSet);//打开串口时先设值
//                    commandType = CommandType.Set;
//                }
//                switch (commandType)
//                {
//                    case CommandType.Get://读值
//                        serialPort.Write(commandGet);
//                        break;
//                    case CommandType.Set://设值
//                        serialPort.Write(commandSet);
//                        break;
//                }
//            }
//            catch (Exception ex)
//            {
//                throw new Exception(ex.Message);
//            }
//            return Task.CompletedTask;
//        }
//        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
//        {
//            # region å…ˆæŸ¥åˆ°è¿™æ¡å‘½ä»¤
//            string getError = "";
//            string getOK = "";
        // æ‰“开串口并开始持续发送信号
        public void OpenSerialPort()
        {
            if (!SerialPort.IsOpen)
            {
                SerialPort.Open();
                StartSendingData();//开启后台循环
            }
        }
//            var com = _nJCommandsRepository.QueryFirst(x => x.ID == 3);
//            if (com != null)
//            {
//                getOK = string.Format("{0}03", com.DeviceNum);// "82407024103"
        // å…³é—­ä¸²å£å¹¶åœæ­¢å‘送信号
        public void CloseSerialPort()
        {
            if (SerialPort.IsOpen)
            {
                SerialPort.Close();
            }
        }
//                getError = string.Format("{0}04", com.DeviceNum);// "82407024104"
//            }
//            else
//            {
//                throw new Exception("未找到指定的命令数据!");
//            }
//            #endregion
        // å‘送数据一次
        public void SendData(string data)
        {
            if (SerialPort.IsOpen)
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes(data);
                SerialPort.Write(bytesToSend, 0, bytesToSend.Length);//将数据发送到串口
            }
        }
//            byte[] buffers = new byte[1024];
//            while (serialPort.BytesToRead > 0)
//            {
//                serialPort.Read(buffers, 0, serialPort.BytesToRead > buffers.Length ? buffers.Length : serialPort.BytesToRead);
//                string data = Encoding.Default.GetString(buffers);
//                if (data.Contains(setOK) && commandType == CommandType.Set)
//                {
//                    commandType = CommandType.Get;
//                }
//                else if (data.Contains(getOK) && commandType == CommandType.Get) //成功就保存到数据库中
//                {
//                    //这里如果成了就存到数据库中的torqueop表中,并且在这判断torqueop表中的数据size和步骤,是否满足工艺表所要求的
//                    //_orqueOpRepository.
        // èŽ·å–ä¸²å£çŠ¶æ€
        public bool GetSerialPortStatus()
        {
            return SerialPort.IsOpen;
        }
        // èŽ·å–æŽ¥æ”¶åˆ°çš„æ‰€æœ‰æ•°æ®
        public List<string> GetReceivedData()
        {
            return receivedDataList;
        }
        // å¤„理接收到的数据
        //每当串口收到数据时,会触发此方法
        private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //从串口接收数据,并将接收到的数据转换为字符串
            byte[] buffer = new byte[1024];//一个字节数组 buffer,大小为 1024 å­—节
            int bytesRead = SerialPort.Read(buffer, 0, buffer.Length);//从串口流 SerialPort ä¸­è¯»å–数据并将其存入 buffer æ•°ç»„中。
            string receivedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);//将接收到的字节数据转换成一个字符串
            //这里写一个方法用于判断每次receivedDat是否满足条件
            //截取设备编号后的俩为是否为03,03成功就进行下步
            string deviceCodePostfix = receivedData.Substring(9, 2);  // ç´¢å¼•从 9 å¼€å§‹ï¼Œé•¿åº¦ä¸º 2,即提取 "04"
            // æå–从第24位后的数据(例如 "0008000")
            string dataAfter24th = receivedData.Substring(13, 7);  // ä»Žç¬¬23位开始提取7个字符,得到 "0008000"
            if (deviceCodePostfix == "03")
            {
                //插入数据
                Dt_TorqueOp torqueOp = new Dt_TorqueOp
                {
                    TorqueSize = dataAfter24th
                };
                _serialPortService.AddSerialPort(torqueOp);
                //receivedDataList.Add(receivedData);
            }
//                    commandType = CommandType.Set;
//                }
//                else if (data.Contains(getError) && commandType == CommandType.Get)
//                {
//                    commandType = CommandType.Set;
           receivedDataList.Add(receivedData);
//                }
//            }
//        }
//    }
//}
#region
//if (group == "电气")
//{
//    //获取当前任务号  //IPutakeServer里面的待执行的第一条任务;
//    var take = _putakeRepository.QueryData(x => x.Grouptype == group)
//        .OrderBy(x => x.Dispatchtime)
//        .FirstOrDefault();
//    var takeid = take?.Njtakeid;//拿到任务号
//    //调用Getcircuit拿到当前步骤
//    var process = _processServer.Getcircuit(group, takeid);
//    if (process != null && process.Status)
//    {
//        var list = JsonConvert.SerializeObject(process.Data);
//        var data = JsonConvert.DeserializeObject<ProcessData>(list);
//        if (data?.proNow != null)
//        {
//            int setpNum = data.proNow.SetpNum;
//            int sum = data.proNow.TorqueSum;
//            double torqueone = data.proNow.TorqueOne;
//            double torquetwo = data.proNow.TorqueTwo;
//            int onequantity = data.proNow.TorqueOneQuantity;
//            int towquantity = data.proNow.TorqueTwoQuantity;
            // å¤„理命令切换逻辑
            if (commandType == 2 && receivedData.Contains("ParseOK"))
            {
                commandType = 1;
            }
            else if (commandType == 1 && (receivedData.Contains("82407024103") || receivedData.Contains("82407024104")))
            {
                commandType = 2;
            }
        }
//            //判断op表中这个值是否有该条任务的数据
//            var op = _orqueOpRepository.QueryData(x => x.TakeId == takeid && x.GroupOp == group && x.ProcessSte == setpNum);
//            if (op.Any())//判断是否有数据
//            {
//                //找到了就要对比现在op表中有多少条,是否和工艺表中的目标一致
        // å¯åŠ¨åŽå°ä»»åŠ¡ï¼Œæ¯éš”ä¸€æ®µæ—¶é—´å‘é€ä¿¡å·
        private void StartSendingData()
        {
            _cancellationTokenSource = new CancellationTokenSource();
            _sendTask = Task.Run(() =>
            {
                while (SerialPort.IsOpen)
                {
                    string command = command0;
                    //先判断commandType
                    if (commandType == 1)
                    {
                        command = command1;
                    }
                    else if (commandType == 2)
                    {
                        command = command2;
                    }
//                // è®¡ç®—第一个扭矩的数量(在 Â±1 è¯¯å·®èŒƒå›´å†…)//Math.Abs(5.2 - 4.5) = 0.7 // è®¡å…¥ Math.Abs(6.0 - 4.5) = 1.5 ä¸è®¡å…¥
//                var oponecount = op.Count(x => Math.Abs(x.TorqueSize - torqueone) <= 1);
//                int times = 0;
//                if (op.Count() > onequantity)
//                {
//                    times = onequantity;//如果第一条以及满足就移除onequantity数量的数据
//                }
//                else
//                {
//                    times = op.Count();//没有满足就移除当前的数据数据
//                }
//                for (int i = 0; i < times; i++)
//                {
//                    //移除第一次值的影响(以为有可能俩个目标值相近而产生误判)
//                    op.RemoveAt(0); //移除 op åˆ—表的 ç¬¬ä¸€ä¸ªå…ƒç´ ï¼ˆå³æœ€æ—©å­˜å…¥çš„记录)
//                }
//                // è®¡ç®—第二个扭矩的数量(在 Â±1 è¯¯å·®èŒƒå›´å†…)
//                var optowcount = op.Count(x => Math.Abs(x.TorqueSize - torquetwo) <= 1);
//                sum = oponecount + optowcount;
//                //第一种,第一个扭力值没有扭完
//                if (oponecount < onequantity && torqueone != 0)
//                {
//                    //设值
//                    //var com = item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue
//                    //        .Replace("[setNum]", (torqueone * 1000).ToString().PadLeft(7, '0')) + "\r";
//                    var com = item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue
//                              .Replace("[setNum]", Math.Round(torqueone * 1000).ToString().PadLeft(7, '0')) + "\r";
//                    //格式化成整数
//                    serialPortDevice.Communicator.Write(com);
//                    //WriteDebug("写入", com);
//                }
//                //第二种,第一个值扭完了,第二个没有扭完
//                if (oponecount == onequantity && optowcount < towquantity && torquetwo != 0)
//                {
//                    //设值
//                    var com = item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue
//                            .Replace("[setNum]", Math.Round(torquetwo * 1000).ToString().PadLeft(7, '0')) + "\r";
//                    serialPortDevice.Communicator.Write(com);
//                }
//            }
//            //这里这个任务第一次执行,op表中肯定是没有数据的,所有第一次就要把工艺表中的值给它
//            else //防止步骤一中torqueone的值为0导致报错
//            {
//                //设值
//                var com = item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue
//                        .Replace("[setNum]", Math.Round(torqueone * 1000).ToString().PadLeft(7, '0')) + "\r";
//                serialPortDevice.Communicator.Write(com);
//            }
//        }
//        else
//        {
//            Console.WriteLine("proNow ä¸ºç©º");
//        }
//    }
//    else
//    {
//        Console.WriteLine($"Getcireit接口错误:{process?.Message}");
//    }
//}
#endregion
                    //再检查 command å­—符串是否为空或 null
                    if (!string.IsNullOrEmpty(command))
                    {
                        byte[] dataToSend = Encoding.ASCII.GetBytes(command);//将command转成字节数组
                        //(三个参数的含义,1数组,2从第0位开始截取,3是要发送的字节数,这里表示整个字节数组的长度)
                        SerialPort.Write(dataToSend, 0, dataToSend.Length);//最后向串口发送数据
#region æ ¹æ®ä¸åŒçš„group存值
//if (group == "电气")
//{
//    var take = _putakeRepository.QueryData(x => x.Grouptype == group)
//                        .OrderBy(x => x.Dispatchtime)
//                        .FirstOrDefault();
//    var takeid = take?.Njtakeid;//拿到任务号
                    }
//    //调用Getcircuit拿到当前步骤
//    var process = _processServer.Getcircuit(group, takeid);
                    Thread.Sleep(1000); // æ¯éš”1秒发送一次命令
                }
            });
        }
//    if (process != null && process.Status)
//    {
//        var list = JsonConvert.SerializeObject(process.Data);
//        var dataz = JsonConvert.DeserializeObject<ProcessData>(list);
    }
}
//        if (dataz?.proNow != null)
//        {
//            int setpNum = dataz.proNow.SetpNum;
//            int sum = dataz.proNow.TorqueSum;
//            double torqueone = dataz.proNow.TorqueOne;
//            int onequantity = dataz.proNow.TorqueOneQuantity;
//            int towquantity = dataz.proNow.TorqueTwoQuantity;
//            double torquetwo = dataz.proNow.TorqueTwo;
//            Dt_TorqueOp Addop = new Dt_TorqueOp()
//            {
//                DeviceCode = devicecode,
//                TakeId = takeid,
//                GroupOp = group,
//                ProcessSte = setpNum,
//                TorqueSize = float.TryParse(torqueValue, out float torque) ? torque : 0.0f, // è¿™é‡Œè¿›è¡Œå­—符串到float的转换
//                CreateDate = DateTime.Now,
//            };
//            _orqueOpRepository.AddData(Addop);
//        }
//    }
//    item.DeviceProParamName = CommandType.None.ToString();
//}
#endregion