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(Irecord_busbar_tempServices record_busbar_TempServices, IServiceProvider serviceProvider) : base(serviceProvider)
{
_record_busbar_TempServices = record_busbar_TempServices;
}
public void StartFixedPoint(base_busbar_info busbarInfo)
{
try
{
Task.Run(() =>
{
isFlag = true;
Task.Delay(1000).Wait();
base.InitEquip(3); //判断PLC状态,下发工作模式
if (!isFlag)
{
_log.Info($"定点巡检取消");
return;
}
SendTrackMotorAddress(busbarInfo);
isFlag = false;
_log.Info($"定点巡检结束");
});
}
catch (Exception ex)
{
throw new InvalidOperationException($"自动巡检逻辑处理异常:{ex.Message}");
}
}
public void EndFixedPoint(base_busbar_info busbarInfo,bool isClose = false)
{
if (isClose)
{
_log.Info($"定点巡检取消");
isFlag = false;
return;
}
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"); //等待轨道相机到位信号
if (!isFlag)
{
return;
}
this.SendLiftMotorDict(busbarInfo);
}
///
/// 等待PLC到位信号
///
///
///
private void AwaitArriveSignal(string signal)
{
try
{
bool is_arrive = true;
while (is_arrive)
{
if (!isFlag)
{
break;
}
int rewrite = _plc.readInt32ByAddress("VD1554");
if (rewrite == 1)
{
_plc.writeInt32ByAddress("VD1554", 0);
if (!_plc.writeInt32ByAddress("VD1536", 3)) //工作模式:1-自动;2-巡检;3-手动
{
throw new ArgumentException($"VD1554为1重新写入工作模式:自动模式;写入PLC失败;VD1536写3");
}
_log.Info($"VD1554为1重新写入工作模式:自动模式;写入PLC成功;VD1536写3");
}
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 (!isFlag)
{
return;
}
//控制云台旋转
if (busbar.isRotate == 1)
{
GimbaRotationControlEvent?.Invoke(busbar.wPanPos, busbar.wTiltPos, busbar.wZoomPos);
}
_log.Info($"2S后开始测温");
Task.Delay(2000).Wait();
_log.Info($"温度测量完成,最高温度:{_realTemperatureInfo.fMaxTemperature};最低温度:{_realTemperatureInfo.fMinTemperature};平均温度:{_realTemperatureInfo.fAverageTemperature};温差:{_realTemperatureInfo.fTemperatureDiff}");
this.SaveBusbarTemp(busbar.busbarCode, busbar.cabinetCode, _realTemperatureInfo, busbar.isPictures);
}
///
/// 保存母排测温数据
///
///
///
///
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);
// }
//}
string sJpegPicFileName = $"{cabinetCode}_{busbarCode}_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.jpg";
record.filePath = sJpegPicFileName;
CaptureAlarmPictureEvent?.Invoke(sJpegPicFileName);
base.JudgBusbarIsAlarm((int)busbarCode, ref record);
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}");
}
}
}
}