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

126 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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