Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../HardwareUnits/Temps/TempBasFunction.cs

126 lines
4.3 KiB
C#
Raw Normal View History

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
{
/// <summary>
/// 会根据PM安装与否执行合适的Log输出DO输出温度在规定次数内是否改变方法
/// 此类作为一个测温类的对象使用,
/// 初始化时传入的名称和温度下限,
/// 1名称会在Log中打印出来2传入温度<=最低温度时,认为温度发生变化
/// </summary>
public class TempBasFunction
{
private bool IsPM1Installed { get; set; }
private bool IsPM2Installed { get; set; }
private string DeviceName { get; set; }
private double[] tempChangeCache;
//硬件通道数
private int NumberOfChannels;
/// <summary>
/// 统计温度相同次数
/// </summary>
private int noChangeCount;
/// <summary>
/// 记录温度不变时数据最多记录10次
/// </summary>
private StringBuilder strNoChangeMeg = new();
/// <summary>
/// 测温硬件最低测试温度,传入温度为此数值,不进行温度数据变化对比
/// </summary>
private readonly double TempMin;
/// <summary>
/// 初始化
/// </summary>
/// <param name="deviceName">测温硬件名称</param>
/// <param name="tempMin">最低温度显示AE和昂坤都是600</param>
public TempBasFunction(string deviceName = "", double tempMin = 600,int numberOfChannels=4)
{
DeviceName = deviceName;
TempMin = tempMin;
NumberOfChannels = numberOfChannels;
tempChangeCache = new double[NumberOfChannels];
IsPM1Installed = SC.GetValue<bool>($"System.SetUp.IsPM1Installed");
IsPM2Installed = SC.GetValue<bool>($"System.SetUp.IsPM2Installed");
}
public void PM1PM2PostLog(string str, Action<string, string, int> action)
{
if (IsPM1Installed)
action("PM1", $"{DeviceName} {str}", 2);
if (IsPM2Installed)
action("PM2", $"{DeviceName} {str}", 2);
}
public void PMPostLog(string pm, string str, Action<string, string, int> action)
{
action(pm, $"{DeviceName} {str}", 2);
}
/// <summary>
/// 操作DO_PyroCommunicationError信号为InterLock提供输出,DO输出为true时设备报警宕机
/// </summary>
/// <param name="isReset"></param>
public void SetPm1Pm2DoForInterlock(bool isReset)
{
if (IsPM1Installed)
IO.DO[$"PM1.DO_PyroCommunicationError"].SetValue(isReset, out _);
if (IsPM2Installed)
IO.DO[$"PM2.DO_PyroCommunicationError"].SetValue(isReset, out _);
}
public void SetPmDoForInterlock(string pm, bool isReset)
{
IO.DO[$"PM1.DO_PyroCommunicationError"].SetValue(isReset, out _);
}
/// <summary>
/// 温度是否发生改变,返回数据不发生改变次数
/// </summary>
/// <param name="outputTemp"></param>
/// <returns></returns>
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;
}
}
}