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 float[] tempChangeCache; //硬件通道数 private int NumberOfChannels; /// /// 统计温度相同次数 /// private int noChangeNum; /// /// 记录温度不变时数据,最多记录10次 /// private StringBuilder strNoChangeMeg = new(); /// /// 测温硬件最低测试温度,传入温度为此数值,不进行温度数据变化对比 /// private readonly double TempMin; /// /// 初始化 /// /// 测温硬件名称 /// 最低温度显示,AE和昂坤都是600 public TempBasFunction(string deviceName , double tempMin,int numberOfChannels) { DeviceName = deviceName; TempMin = tempMin; NumberOfChannels = numberOfChannels; tempChangeCache = new float[NumberOfChannels]; IsPM1Installed = SC.GetValue($"System.SetUp.IsPM1Installed"); IsPM2Installed = SC.GetValue($"System.SetUp.IsPM2Installed"); } public void PM1PM2PostLog(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 SetPm1Pm2IoForInterlock(bool isReset) { if (IsPM1Installed) IO.DO[$"PM1.DO_PyroCommunicationError"].SetValue(isReset, out _); if (IsPM2Installed) IO.DO[$"PM2.DO_PyroCommunicationError"].SetValue(isReset, out _); } /// /// 复位单个PM的DO信号 /// /// /// public void SetPmIoForInterlock(string pm, bool isReset) { string PM = pm.ToUpper(); if (IsMP(PM)) IO.DO[$"PM1.DO_PyroCommunicationError"].SetValue(isReset, out _); } /// /// 控制单个PM报警输出 /// /// /// /// public void PMPostLog(string pm, string str, Action action) { string PM = pm.ToUpper(); if (IsMP(PM)) action(PM, $"{DeviceName} {str}", 2); } private bool IsMP(string pm) { return (pm == "PM1" || pm == "PM2")? true : false; } /// /// 温度是否发生改变,返回数据不发生改变次数 /// /// /// public int TempInvariantCount(float[] outputTemp, out string errorInf) { errorInf = ""; if (noChangeNum > 999999)//防止数据溢出 noChangeNum = 0; for (int i = 0; i < outputTemp.Length; i++) { if (outputTemp[i] <= TempMin)//低于温度下限,数据不做对比 continue; if (outputTemp[i] == tempChangeCache[i]) { if (noChangeNum < 10)//记录前10次的数据 strNoChangeMeg.Append($"#{i + 1}:{outputTemp[i]:0.00} "); errorInf = strNoChangeMeg.ToString(); return noChangeNum++; } tempChangeCache[i] = outputTemp[i]; } //只要数据不同,就可以复位计数和缓存 strNoChangeMeg.Clear(); noChangeNum = 0; return 0; } } }