refactor(IoTC): 优化温度变化过快报警监测逻辑。
新增MonitorTempRaisingTooFastAlarm()方法,每隔1s判断一次温度变化率。
This commit is contained in:
parent
53f7381d76
commit
43153c4337
|
@ -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,8 +453,31 @@ namespace Aitex.Core.RT.Device.Devices
|
|||
});
|
||||
|
||||
|
||||
#region Temp Rising Too Fast Alarm
|
||||
|
||||
ScOuterTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.OuterTemp");
|
||||
_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");
|
||||
ScMiddleTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.MiddleTemp");
|
||||
|
||||
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue