using Aitex.Core.RT.IOCore;
using Aitex.Core.RT.SCCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temps
{
///
/// 会根据PM安装与否,执行合适的Log输出,DO输出,温度在规定次数内是否改变方法
/// 此类作为一个测温类的对象使用,
/// 初始化时传入的名称和温度下限,
/// 1:名称会在Log中打印出来,2:传入温度<=最低温度时,认为温度发生变化
///
public class TempBasFunction
{
private bool IsPM1Installed { get; set; }
private bool IsPM2Installed { get; set; }
private string DeviceName { get; set; }
private double[] tempChangeCache = new double[4];
///
/// 统计温度相同次数
///
private int noChangeCount;
///
/// 记录温度不变时数据,最多记录10次
///
private StringBuilder strNoChangeMeg = new();
///
/// 测温硬件最低测试温度,传入温度为此数值,不进行温度数据变化对比
///
private readonly double TempMin;
///
/// 初始化
///
/// 测温硬件名称
/// 最低温度显示,AE和昂坤都是600
public TempBasFunction(string deviceName = "", double tempMin = 600)
{
DeviceName = deviceName;
TempMin = tempMin;
IsPM1Installed = SC.GetValue($"System.SetUp.IsPM1Installed");
IsPM2Installed = SC.GetValue($"System.SetUp.IsPM2Installed");
}
public void PMPostLog(string str, Action action)
{
if (IsPM1Installed)
action("PM1", $"{DeviceName} {str}", 2);
if (IsPM2Installed)
action("PM2", $"{DeviceName} {str}", 2);
}
///
/// 操作DO_PyroCommunicationError信号为InterLock提供输出,DO输出为true时设备报警宕机
///
///
public void SetPmDoForInterlock(bool isReset)
{
if (IsPM1Installed)
IO.DO[$"PM1.DO_PyroCommunicationError"].SetValue(isReset, out _);
if (IsPM2Installed)
IO.DO[$"PM2.DO_PyroCommunicationError"].SetValue(isReset, out _);
}
///
/// 温度是否发生改变,返回数据不发生改变次数
///
///
///
public int NoChangeCount(double[] outputTemp, out string errorInf)
{
errorInf = "";
if (noChangeCount > 999999)//防止数据溢出
noChangeCount = 0;
for (int i = 0; i < outputTemp.Length; i++)
{
if (outputTemp[i] <= TempMin)//低于温度下限,数据不做对比
continue;
if (outputTemp[i] == tempChangeCache[i])
{
if (noChangeCount < 10)//记录前10次的数据
strNoChangeMeg.Append($"#{i + 1}:{outputTemp[i]:0.00} ");
errorInf = strNoChangeMeg.ToString();
return noChangeCount++;
}
tempChangeCache[i] = outputTemp[i];
}
//只要四路数据不同,就可以复位计数和缓存
strNoChangeMeg.Clear();
noChangeCount = 0;
return 0;
}
}
}