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; } } }