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.

171 lines
6.0 KiB
C#

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
* CLR4.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($"定点巡检结束");
}
/// <summary>
/// 下发轨道电机位置编号
/// </summary>
/// <param name="item"></param>
/// <exception cref="ArgumentException"></exception>
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);
}
/// <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.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 delegate void GimbaRotationControl(string wPanPos, string wTiltPos, string wZoomPos);
public event GimbaRotationControl GimbaRotationControlEvent;
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);
}
}
}
}