using SlnMesnac.Business.@base; using SlnMesnac.Model.dto; using SlnMesnac.Plc; using SlnMesnac.Repository; using SlnMesnac.Repository.service; using SlnMesnac.Serilog; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:T14-GEN3-7895 * 命名空间:SlnMesnac.Business * 唯一标识:2202e7a9-f41e-4b59-b139-05f10987e114 * * 创建者:WenJY * 电子邮箱: * 创建时间:2024-11-29 10:58:14 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace SlnMesnac.Business { public class FixedPointBusiness : BaseBusiness { private readonly Irecord_busbar_tempServices _record_busbar_TempServices; public FixedPointBusiness(SerilogHelper log, PlcAbsractFactory plc, Ibase_cabinet_infoServices base_Cabinet_InfoServices, Ibase_busbar_infoServices base_Busbar_InfoServices, Irecord_busbar_tempServices record_busbar_TempServices) : base(log, plc, base_Cabinet_InfoServices, base_Busbar_InfoServices) { _record_busbar_TempServices = record_busbar_TempServices; } public void StartFixedPoint(base_busbar_info busbarInfo) { try { Task.Run(() => { Task.Delay(1000).Wait(); base.InitEquip(2); //判断PLC状态,下发工作模式 if (!_plc.writeInt32ByAddress("VD1516", 1)) //下发轨道电机启动信号 { throw new ArgumentException($"定点巡检模式启动信号写入PLC失败;VD1516写1"); } _log.Info($"定点巡检模式启动信号写入PLC成功;VD1516写1"); SendTrackMotorAddress(busbarInfo); }); } catch (Exception ex) { throw new InvalidOperationException($"自动巡检逻辑处理异常:{ex.Message}"); } } public void EndFixedPoint(base_busbar_info busbarInfo) { if (busbarInfo.isRotate == 1) { GimbaRotationControlEvent?.Invoke("20", "4", "10"); } if (!_plc.writeInt32ByAddress("VD1512", 1)) //母排检测完成下发检测完成信号,升降电机可以回到原位等待 { throw new ArgumentException($"定点巡检模式下发检测完成信号写入失败;VD1512写1"); } _log.Info($"定点巡检模式下发检测完成信号写入PLC成功;VD1512写1"); _log.Info($"定点巡检结束"); } /// /// 下发轨道电机位置编号 /// /// /// private void SendTrackMotorAddress(base_busbar_info busbarInfo) { if (!_plc.writeInt32ByAddress("VD1520", (int)busbarInfo.cabinetCode)) //下发电柜编号,通知轨道电机前往指定电柜位置 { throw new ArgumentException($"定点巡检模式下发轨道电机前往指定位置编号写入失败;VD1520写{(int)busbarInfo.cabinetCode}"); } _log.Info($"定点巡检模式下发轨道电机前往指定位置成功;VD1520写{(int)busbarInfo.cabinetCode}"); this.AwaitArriveSignal("VD1528"); //等待轨道相机到位信号 this.SendLiftMotorDict(busbarInfo); } /// /// 等待PLC到位信号 /// /// /// private void AwaitArriveSignal(string signal) { try { bool is_arrive = true; while (is_arrive) { int is_arrive_flag = _plc.readInt32ByAddress(signal); //读取PLC轨道电机到位信号 if (is_arrive_flag == 1) { _log.Info($"PLC已到达指定位置;{signal}值为{is_arrive_flag}"); if (!_plc.writeInt32ByAddress(signal, 0)) { throw new ArgumentException($"PLC到位信号复位失败;{signal}写0"); } is_arrive = false; continue; } _log.Info($"等待PLC前往指定位置;{signal}值为{is_arrive_flag}"); Task.Delay(1000).Wait(); } } catch (Exception e) { throw new InvalidOperationException($"等待到位信号处理异常:{e.Message}"); } } public readonly RealTemperatureInfo _realTemperatureInfo = new RealTemperatureInfo(); public delegate void GimbaRotationControl(string wPanPos, string wTiltPos, string wZoomPos); public event GimbaRotationControl GimbaRotationControlEvent; public delegate void CaptureAlarmPicture(string sJpegPicFileName); public event CaptureAlarmPicture CaptureAlarmPictureEvent; private void SendLiftMotorDict(base_busbar_info busbar) { if (!_plc.writeFloatByAddress("VD1524", ((float)busbar.busbarDist))) //下发母排距离,升降电机升降的距离 { throw new ArgumentException($"下发母排升降距离写入失败;VD1524写{busbar.cabinetCode}"); } _log.Info($"下发母排升降距离成功;VD1524写{busbar.busbarDist}"); this.AwaitArriveSignal("VD1504"); //等待升降电机到位信号 //控制云台旋转 if (busbar.isRotate == 1) { GimbaRotationControlEvent?.Invoke(busbar.wPanPos, busbar.wTiltPos, busbar.wZoomPos); } _log.Info($"5S后开始测温"); Task.Delay(5000).Wait(); _log.Info($"温度测量完成,最高温度:{_realTemperatureInfo.fMaxTemperature};最低温度:{_realTemperatureInfo.fMinTemperature};平均温度:{_realTemperatureInfo.fAverageTemperature};温差:{_realTemperatureInfo.fTemperatureDiff}"); this.SaveBusbarTemp(busbar.busbarCode, busbar.cabinetCode, _realTemperatureInfo, busbar.isPictures); Task.Delay(1000).Wait(); } /// /// 保存母排测温数据 /// /// /// /// private void SaveBusbarTemp(int? busbarCode, int? cabinetCode, RealTemperatureInfo realTemperatureInfo, int isPictures) { try { var record = new record_busbar_temp() { busbarCode = busbarCode, cabinetCode = cabinetCode, tempMax = (decimal)realTemperatureInfo.fMaxTemperature, tempMin = (decimal)realTemperatureInfo.fMinTemperature, tempAvg = (decimal)realTemperatureInfo.fAverageTemperature, tempDiff = (decimal)realTemperatureInfo.fTemperatureDiff, routModel = 3, recordTime = DateTime.Now, }; if (realTemperatureInfo.fMaxTemperature > 65) { record.isAlarm = 1; string sJpegPicFileName = $"{cabinetCode}_{busbarCode}_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.jpg"; record.filePath = sJpegPicFileName; CaptureAlarmPictureEvent?.Invoke(sJpegPicFileName); } else { if (isPictures == 1) { string sJpegPicFileName = $"{cabinetCode}_{busbarCode}_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.jpg"; record.filePath = sJpegPicFileName; CaptureAlarmPictureEvent?.Invoke(sJpegPicFileName); } } var res = _record_busbar_TempServices.Insert(record); if (res) { _log.Info($"{cabinetCode}号电柜{busbarCode}排数据保存成功"); } else { _log.Info($"{cabinetCode}号电柜{busbarCode}排数据保存失败"); } } catch (Exception e) { _log.Info($"{cabinetCode}号电柜{busbarCode}排数据保存异常:{e.Message}"); } } } }