using System; using System.Collections.Generic; using System.Drawing.Imaging; using System.IO.Ports; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; using HslCommunication.WebSocket; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using Quartz; using SqlSugar; using StackExchange.Profiling.Internal; using WIDESEA_ISerialPortRepository; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DTO; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class SerialPortJob : JobBase, IJob,IDisposable { public void Dispose() { GC.SuppressFinalize(this); } public enum CommandType { None = 0, Get = 1,//发信号 Set = 2,//设值 } public enum CommandResult { SetOK = 0,//parseok GetOK = 1,//03 GetError = 2,//04 } private readonly IPutakeRepository _putakeRepository; private readonly IProcessRepository _processRepository; private readonly ITorqueOpRepository _orqueOpRepository; private WebSocketServer _webSocketContext; public SerialPortJob(IPutakeRepository putakeRepository, IProcessRepository processRepository, ITorqueOpRepository torqueOpRepository, WebSocketServer webSocketContext) { _putakeRepository = putakeRepository; _processRepository = processRepository; _orqueOpRepository = torqueOpRepository; _webSocketContext = webSocketContext; } public Task Execute(IJobExecutionContext context) { try { SerialPortDevice serialPortDevice = (SerialPortDevice)context.JobDetail.JobDataMap.Get("JobParams"); if (serialPortDevice != null) { List deviceProDTOs = serialPortDevice.DeviceProDTOs; foreach (var item in deviceProDTOs) { if (item.DeviceProParamName != CommandType.Get.ToString() && item.DeviceProParamName != CommandType.Set.ToString()) { DeviceProtocolDetailDTO? deviceProtocolDetail = serialPortDevice.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CommandType) && x.ProtocolDetailType == nameof(CommandType.Set)); if (deviceProtocolDetail != null) { # region Setvalue string group = item.DeviceProDataBlock; if (group == "电气") { //查看步骤 var com = item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue.Replace("[setNum]", (5 * 1000).ToString().PadLeft(7, '0'))+"\r"; serialPortDevice.Communicator.Write(com+"\r"); //打开串口时先设值 } #endregion item.DeviceProParamName = CommandType.Set.ToString(); //原代码 //serialPortDevice.Communicator.Write(item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue.Replace("[setNum]", (4.5 * 1000).ToString().PadLeft(7, '0')) + "\r");//打开串口时先设值 //item.DeviceProParamName = CommandType.Set.ToString(); } } if (CommandType.Get.ToString() == item.DeviceProParamName) { DeviceProtocolDetailDTO? deviceProtocolDetail = serialPortDevice.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CommandType) && x.ProtocolDetailType == nameof(CommandType.Get)); //发送设备号 if (deviceProtocolDetail != null) { serialPortDevice.Communicator.Write(item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue, "\r");//打开串口时先设值 } } else if (CommandType.Set.ToString() == item.DeviceProParamName) { DeviceProtocolDetailDTO? deviceProtocolDetail = serialPortDevice.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CommandType) && x.ProtocolDetailType == nameof(CommandType.Set)); //设值 if (deviceProtocolDetail != null) { serialPortDevice.Communicator.Write(item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue, "\r");//打开串口时先设值 } } if (serialPortDevice.Communicator.Buffers.Count > 0) { string? receiveData = serialPortDevice.Communicator.ToString(Encoding.Default); if (!string.IsNullOrEmpty(receiveData)) { Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + receiveData); if (item.DeviceProParamName == CommandType.Set.ToString()) { DeviceProtocolDetailDTO? deviceProtocolDetail = serialPortDevice.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CommandResult) && x.ProtocolDetailType == nameof(CommandResult.SetOK)); //parseok if (deviceProtocolDetail != null && receiveData.Contains(item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue)) { item.DeviceProParamName = CommandType.Get.ToString(); } } else if (item.DeviceProParamName == CommandType.Get.ToString()) { DeviceProtocolDetailDTO? deviceProtocolDetail = serialPortDevice.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CommandResult) && x.ProtocolDetailType == nameof(CommandResult.GetOK)); //03成功 if (deviceProtocolDetail != null && receiveData.Contains(item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue)) { string group = item.DeviceProDataBlock; // 设备所属组别 if (group == "电气") { item.DeviceProParamName = CommandType.Set.ToString(); } //原代码 //item.DeviceProParamName = CommandType.Set.ToString(); } } else if (item.DeviceProParamName == CommandType.Get.ToString()) { DeviceProtocolDetailDTO? deviceProtocolDetail = serialPortDevice.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CommandResult) && x.ProtocolDetailType == nameof(CommandResult.GetError)); if (deviceProtocolDetail != null && receiveData.Contains(item.DeviceChildCode + deviceProtocolDetail.ProtocalDetailValue)) { item.DeviceProParamName = CommandType.Set.ToString(); } } //建一个对象将其传给前端 string data = JsonConvert.SerializeObject(serialPortDevice);//这里serialPortDevice是假设有这个对象 _webSocketContext.PublishAllClientPayload(data); } } } } } catch (Exception ex) { WriteError("CommonConveyorLineJob", "test", ex); } WriteDebug("CommonConveyorLineJob", "test"); return Task.CompletedTask; } } }