refactor(IoTC): 优化温度变化过快报警监测逻辑。

新增MonitorTempRaisingTooFastAlarm()方法,每隔1s判断一次温度变化率。
This commit is contained in:
SL 2024-08-12 00:05:14 +08:00
parent 53f7381d76
commit 43153c4337
1 changed files with 131 additions and 54 deletions

View File

@ -1,4 +1,5 @@
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Xml;
using Aitex.Core.RT.DataCenter;
@ -128,7 +129,9 @@ namespace Aitex.Core.RT.Device.Devices
private readonly SCConfigItem _PyroWarmIsAlarm;
private SCConfigItem _AETempRasingFastIsAlarm;
private bool _isAlarmTempRaisingFast;
private double _tempRaisingRateOuter;
private double _tempRaisingRateMiddle;
private string _scOuterTempValue;
public string ScOuterTempValue
@ -234,10 +237,7 @@ namespace Aitex.Core.RT.Device.Devices
_SCRHighLimit = ParseScNode("SCRTempHighLimit", node, ioModule, $"PM.{Module}.Heater.SCRTempHighLimit");
_SCRLowLimit = ParseScNode("SCRTempLowLimit", node, ioModule, $"PM.{Module}.Heater.SCRTempLowLimit");
_PyroWarmIsAlarm = ParseScNode("PyroWarmIsAlarm", node, ioModule, $"PM.{Module}.Heater.PyroWarmIsAlarm");
_AETempRasingFastIsAlarm = ParseScNode("AETempRasingFastIsAlarm", node, ioModule, $"PM.{Module}.Heater.AETempRasingFastIsAlarm");
}
public bool Initialize()
@ -453,6 +453,29 @@ namespace Aitex.Core.RT.Device.Devices
});
#region Temp Rising Too Fast Alarm
_isAlarmTempRaisingFast = SC.SafeGetValue($"PM.{Module}.Heater.AETempRasingFastIsAlarm", true);
_tempRaisingRateMiddle = SC.SafeGetValue($"PM.{Module}.Heater.AETempMiddleRasingRate", 20.0);
_tempRaisingRateOuter = SC.SafeGetValue($"PM.{Module}.Heater.AETempOuterRasingRate", 20.0);
SC.RegisterValueChangedCallback($"PM.{Module}.Heater.AETempRasingFastIsAlarm", val =>
{
_isAlarmTempRaisingFast = (bool)val;
});
SC.RegisterValueChangedCallback($"PM.{Module}.Heater.AETempMiddleRasingRate", val =>
{
_tempRaisingRateMiddle = (double)val;
});
SC.RegisterValueChangedCallback($"PM.{Module}.Heater.AETempOuterRasingRate", val =>
{
_tempRaisingRateOuter = (double)val;
});
#endregion
ScOuterTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.OuterTemp");
ScInnerTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.InnerTemp");
@ -1063,7 +1086,7 @@ namespace Aitex.Core.RT.Device.Devices
MonitorAlarm();
MonitorTemp();
//MonitorAETempRasingFastAlarm();
MonitorTempRaisingTooFastAlarm();
}
catch (Exception ex)
{
@ -1216,60 +1239,114 @@ namespace Aitex.Core.RT.Device.Devices
}
//DateTime dtLastRecordTime = DateTime.Now;
DeviceTimer tempMonitorDT = new DeviceTimer();
private double lastInnerTemp = 0;
private double lastMiddleTemp = 0;
private double lastOuterTemp = 0;
private readonly Stopwatch _swTempRaisingMonitor = new();
private double _lastInnerTemp = 0;
private double _lastMiddleTemp = 0;
private double _lastOuterTemp = 0;
private readonly R_TRIG _rTrigMiddleTempRaisingFast = new();
private readonly R_TRIG _rTrigInnerTempRaisingFast = new();
private readonly R_TRIG _rTrigOuterTempRaisingFast = new();
//private void MonitorAETempRasingFastAlarm()
//{
// string pmStatus = DATA.Poll($"{Module}.Status") == null ? "" : DATA.Poll($"{Module}.Status").ToString();
private bool MonitorTempRaisingTooFastAlarm()
{
var objPmStatus = DATA.Poll($"{Module}.Status");
var pmStatus = objPmStatus == null ? "" : objPmStatus.ToString();
// if (pmStatus == "Process")
// {
// if (Math.Abs(InnerTemp - lastInnerTemp) * 1000 > _AETempInnerRasingRate.DoubleValue * tempMonitorDT.GetElapseTime())
// {
// if (_AETempRasingFastIsAlarm.BoolValue)
// {
// EV.PostAlarmLog(Module, $"AETemp Inner rasing fast");
// }
// else
// {
// EV.PostWarningLog(Module, $"AETemp Inner rasing fast");
// }
// }
if (pmStatus != "Process")
{
// PM没有Process时强制停止计时器
// 否则由于上一次工艺结束时定时器处于运行状态再次进入工艺时IsRunning == true定时器记录时间会很大导致判断错误。
_swTempRaisingMonitor.Reset();
}
else
{
// if (Math.Abs(MiddleTemp - lastMiddleTemp) * 1000 > _AETempMiddleRasingRate.DoubleValue * tempMonitorDT.GetElapseTime())
// {
// if (_AETempRasingFastIsAlarm.BoolValue)
// {
// EV.PostAlarmLog(Module, $"AETemp Middle rasing fast");
// }
// else
// {
// EV.PostWarningLog(Module, $"AETemp Middle rasing fast");
// }
// }
if (!_swTempRaisingMonitor.IsRunning)
{
// 首次进入Process启动1s定时并保存当前当前温度。
// 后续整个Process过程中定制器始终处于工作状态除非发生异常。
_swTempRaisingMonitor.Start();
_lastInnerTemp = InnerTemp;
_lastMiddleTemp = MiddleTemp;
_lastOuterTemp = OuterTemp;
}
else if (_swTempRaisingMonitor.Elapsed.TotalSeconds > 1)
{
// if (Math.Abs(OuterTemp - lastOuterTemp) * 1000 > _AETempOuterRasingRate.DoubleValue * tempMonitorDT.GetElapseTime())
// {
// if (_AETempRasingFastIsAlarm.BoolValue)
// {
// EV.PostAlarmLog(Module, $"AETemp Outer rasing fast");
// }
// else
// {
// EV.PostWarningLog(Module, $"AETemp Outer rasing fast");
// }
_swTempRaisingMonitor.Stop();
// lastInnerTemp = InnerTemp;
// lastMiddleTemp = MiddleTemp;
// lastOuterTemp = OuterTemp;
// }
// }
var interval = _swTempRaisingMonitor.Elapsed.TotalSeconds;
if (interval <= 0)
return true;
// tempMonitorDT.Start(0);
//}
Debug.WriteLine($"IoTC {Name} Temp Raising Fast monitor interval: {interval:F1}", Module);
Debug.WriteLine($"Is Alarm: {_isAlarmTempRaisingFast}; " +
$"Middle Rate SP: {_tempRaisingRateMiddle}℃/s; " +
$"Outer Rate SP: {_tempRaisingRateOuter}℃/s; ",
Module);
var raisingRatePerSec = 0.0;
#region Inner
/* raisingRatePerSec = Math.Abs(InnerTemp - _lastInnerTemp) / interval;
Debug.WriteLine($"Inner Temp Raising Rate: {raisingRatePerSec:F1}", Module);
_rTrigInnerTempRaisingFast.CLK = raisingPerSec > _tempRaisingRateInner;
if (_rTrigInnerTempRaisingFast.Q)
{
var msg = $"Inner Temp raising too fast at a rate of {raisingPerSec:F1}℃/s";
if (_isAlarmTempRaisingFast)
EV.PostAlarmLog(Module, msg);
else
EV.PostWarningLog(Module, msg);
}*/
#endregion
#region Middle
raisingRatePerSec = Math.Abs(MiddleTemp - _lastMiddleTemp) / interval;
Debug.WriteLine($"Middle Temp Raising Rate: {raisingRatePerSec:F1}", Module);
_rTrigMiddleTempRaisingFast.CLK = raisingRatePerSec > _tempRaisingRateMiddle;
if (_rTrigMiddleTempRaisingFast.Q)
{
var msg = $"Middle Temp raising too fast at a rate of {raisingRatePerSec:F1}℃/s";
if (_isAlarmTempRaisingFast)
EV.PostAlarmLog(Module, msg);
else
EV.PostWarningLog(Module, msg);
}
#endregion
#region Outer
raisingRatePerSec = Math.Abs(OuterTemp - _lastOuterTemp) / interval;
Debug.WriteLine($"Outer Temp Raising Rate: {raisingRatePerSec:F1}", Module);
_rTrigOuterTempRaisingFast.CLK = raisingRatePerSec > _tempRaisingRateOuter;
if (_rTrigOuterTempRaisingFast.Q)
{
var msg = $"Outer Temp raising too fast at a rate of {raisingRatePerSec:F1}℃/s";
if (_isAlarmTempRaisingFast)
EV.PostAlarmLog(Module, msg);
else
EV.PostWarningLog(Module, msg);
}
#endregion
// 保存当前当前温度并重启1s定时器
_lastInnerTemp = InnerTemp;
_lastMiddleTemp = MiddleTemp;
_lastOuterTemp = OuterTemp;
_swTempRaisingMonitor.Restart();
}
}
return true;
}
public void MonitorTemp()