You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
10 KiB
C#

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
* CLR4.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
{
/// <summary>
/// 自动模式
/// </summary>
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}");
}
}
/// <summary>
/// 自动巡检
/// </summary>
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<base_cabinet_info> cabinet_Infos = new List<base_cabinet_info>();
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}");
}
}
}
/// <summary>
/// 下发轨道电机位置编号
/// </summary>
/// <param name="item"></param>
/// <exception cref="ArgumentException"></exception>
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);
}
/// <summary>
/// 下发升降电机升降距离
/// </summary>
/// <param name="cabinetCode"></param>
/// <exception cref="ArgumentException"></exception>
private void SendLiftMotorDict(int cabinetCode)
{
List<base_busbar_info> busbar_Infos = new List<base_busbar_info>();
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();
}
}
/// <summary>
/// 等待PLC到位信号
/// </summary>
/// <param name="signal"></param>
/// <exception cref="InvalidOperationException"></exception>
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}");
}
}
/// <summary>
/// 保存母排测温数据
/// </summary>
/// <param name="busbarCode"></param>
/// <param name="cabinetCode"></param>
/// <param name="realTemperatureInfo"></param>
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;
}
}
}