using Microsoft.IdentityModel.Logging; using SlnMesnac.Business.@base; using SlnMesnac.Config; 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.Linq; using System.Text; using System.Threading.Tasks; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:T14-GEN3-7895 * 命名空间:SlnMesnac.Business * 唯一标识:0934e594-ba15-4ccb-b791-ce32ea724a93 * * 创建者:WenJY * 电子邮箱: * 创建时间:2024-11-01 11:16:29 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace SlnMesnac.Business { /// /// 自动模式 /// public class AutoModeBusiness : BaseBusiness { public readonly RealTemperatureInfo _realTemperatureInfo = new RealTemperatureInfo(); private readonly Irecord_busbar_tempServices _record_busbar_TempServices; private readonly AppConfig _appConfig; private System.Timers.Timer timer = null; public delegate void CaptureAlarmPicture(string sJpegPicFileName); public event CaptureAlarmPicture CaptureAlarmPictureEvent; public AutoModeBusiness(SerilogHelper log, PlcAbsractFactory plc, Ibase_cabinet_infoServices base_Cabinet_InfoServices, Ibase_busbar_infoServices base_Busbar_InfoServices, Irecord_busbar_tempServices record_busbar_TempServices, AppConfig appConfig) : base(log, plc, base_Cabinet_InfoServices, base_Busbar_InfoServices) { _record_busbar_TempServices = record_busbar_TempServices; _appConfig = appConfig; } public void Start() { try { timer = new System.Timers.Timer(1000 * 60 * _appConfig.checkCycle); timer.Elapsed += new System.Timers.ElapsedEventHandler(AutoModelEvent); timer.AutoReset = true; timer.Enabled = false; timer.Start(); _log.Info($"自动模式初始化成功"); this.AutoModelEvent(null, null); } catch (Exception ex) { _log.Info($"自动模式初始化异常:{ex.Message}"); } } public void Stop() { try { if (timer.Enabled) { timer.Stop(); timer.Close(); timer.Dispose(); _log.Info($"自动模式关闭成功"); } } catch (Exception ex) { _log.Info($"自动模式停止异常:{ex.Message}"); } } /// /// 自动巡检 /// private void AutoModelEvent(object source, System.Timers.ElapsedEventArgs e) { lock(string.Empty) { try { Task.Run(() => { Task.Delay(1000).Wait(); base.InitEquip(1); //判断PLC状态,下发工作模式 int address = _plc.readInt16ByAddress("VD2005"); //读取轨道电机当前位置,判断原点及起始位置 //获取电柜信息 List cabinet_Infos = new List(); base.GetCabinetInfos(address, out cabinet_Infos); if (!_plc.writeInt16ByAddress("VD1517", 1)) //下发轨道电机启动信号 { throw new ArgumentException($"启动信号写入PLC失败;VD1517写1"); } _log.Info($"启动信号写入PLC成功;VD1517写1"); foreach (var item in cabinet_Infos) { this.SendTrackMotorAddress(item); if (!_plc.writeInt16ByAddress("VD1513", 1)) //母排检测完成下发检测完成信号,升降电机可以回到原位等待 { throw new ArgumentException($"下发母排检测完成下发检测完成信号写入失败;VD1513写1"); } Task.Delay(1000).Wait(); } _log.Info($"巡检结束"); }); }catch (Exception ex) { throw new InvalidOperationException($"自动巡检逻辑处理异常:{ex.Message}"); } } } /// /// 下发轨道电机位置编号 /// /// /// private void SendTrackMotorAddress(base_cabinet_info item) { if (!_plc.writeInt16ByAddress("VD1521", item.cabinetCode)) //下发电柜编号,通知轨道电机前往指定电柜位置 { throw new ArgumentException($"下发轨道电机前往指定位置编号写入失败;VD1521写{item.cabinetCode}"); } _log.Info($"下发轨道电机前往指定位置成功;VD1521写{item.cabinetCode}"); this.AwaitArriveSignal("VD1529"); //等待轨道相机到位信号 this.SendLiftMotorDict(item.cabinetCode); } /// /// 下发升降电机升降距离 /// /// /// private void SendLiftMotorDict(int cabinetCode) { List busbar_Infos = new List(); base.GetBusbarInfos(cabinetCode, out busbar_Infos); foreach (var busbar in busbar_Infos) { if (!_plc.writeDoubleByAddress("VD1525", Convert.ToDouble(busbar.busbarDist))) //下发母排距离,升降电机升降的距离 { throw new ArgumentException($"下发母排升降距离写入失败;VD1525写{busbar.cabinetCode}"); } _log.Info($"下发母排升降距离成功;VD1525写{busbar.busbarDist}"); this.AwaitArriveSignal("VD1505"); //等待升降电机到位信号 //这里采集数据 _log.Info($"5S后开始测温"); Task.Delay(5000).Wait(); _log.Info($"温度测量完成,最高温度:{_realTemperatureInfo.fMaxTemperature};最低温度:{_realTemperatureInfo.fMinTemperature};平均温度:{_realTemperatureInfo.fAverageTemperature};温差:{_realTemperatureInfo.fTemperatureDiff}"); this.SaveBusbarTemp(busbar.busbarCode, busbar.cabinetCode, _realTemperatureInfo); Task.Delay(1000).Wait(); } } /// /// 等待PLC到位信号 /// /// /// private void AwaitArriveSignal(string signal) { try { bool is_arrive = true; while (is_arrive) { int is_arrive_flag = _plc.readInt16ByAddress(signal); //读取PLC轨道电机到位信号 if (is_arrive_flag == 1) { _log.Info($"PLC已到达指定位置;{signal}值为{is_arrive_flag}"); if (!_plc.writeInt16ByAddress(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}"); } } /// /// 保存母排测温数据 /// /// /// /// private void SaveBusbarTemp(int? busbarCode, int? cabinetCode,RealTemperatureInfo realTemperatureInfo) { 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, 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); } 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}"); } } public int GetTrackMotorAddress() { int is_arrive_flag = _plc.readInt16ByAddress("VD2005"); return is_arrive_flag; } } }