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

MonitorTempRaisingTooFastAlarm()方法增加计时器,确保每隔1s判断一次温度变化率。
This commit is contained in:
SL 2024-07-12 14:37:37 +08:00
parent 7d815fc0d1
commit c6f16187a9
1 changed files with 90 additions and 52 deletions

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Diagnostics;
using System.Xml; using System.Xml;
using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event; using Aitex.Core.RT.Event;
@ -1239,7 +1240,7 @@ namespace Aitex.Core.RT.Device.Devices
} }
//DateTime dtLastRecordTime = DateTime.Now; //DateTime dtLastRecordTime = DateTime.Now;
readonly DeviceTimer _timTempRaisingMonitor = new (); private readonly Stopwatch _swTempRaisingMonitor = new();
private double _lastInnerTemp = 0; private double _lastInnerTemp = 0;
private double _lastMiddleTemp = 0; private double _lastMiddleTemp = 0;
private double _lastOuterTemp = 0; private double _lastOuterTemp = 0;
@ -1247,67 +1248,104 @@ namespace Aitex.Core.RT.Device.Devices
private readonly R_TRIG _rTrigInnerTempRaisingFast = new(); private readonly R_TRIG _rTrigInnerTempRaisingFast = new();
private readonly R_TRIG _rTrigOuterTempRaisingFast = new(); private readonly R_TRIG _rTrigOuterTempRaisingFast = new();
private void MonitorTempRaisingTooFastAlarm() private bool MonitorTempRaisingTooFastAlarm()
{ {
string pmStatus = DATA.Poll($"{Module}.Status") == null ? "" : DATA.Poll($"{Module}.Status").ToString(); var objPmStatus = DATA.Poll($"{Module}.Status");
var pmStatus = objPmStatus == null ? "" : objPmStatus.ToString();
if (pmStatus == "Process") if (pmStatus != "Process")
{
// PM没有Process时强制停止计时器
// 否则由于上一次工艺结束时定时器处于运行状态再次进入工艺时IsRunning == true定时器记录时间会很大导致判断错误。
_swTempRaisingMonitor.Reset();
}
else
{ {
// 时间间隔单位从ms转换为sec
var interval = _timTempRaisingMonitor.GetElapseTime() / 1000;
var raisingPerSec = 0.0;
#region Inner if (!_swTempRaisingMonitor.IsRunning)
/* raisingPerSec = Math.Abs(InnerTemp - _lastInnerTemp) / interval;
_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
raisingPerSec = Math.Abs(MiddleTemp - _lastMiddleTemp) / interval;
_rTrigMiddleTempRaisingFast.CLK = raisingPerSec > _tempRaisingRateMiddle;
if (_rTrigMiddleTempRaisingFast.Q)
{ {
var msg = $"Middle Temp raising too fast at a rate of {raisingPerSec:F1}℃/s"; // 首次进入Process启动1s定时并保存当前当前温度。
if (_isAlarmTempRaisingFast) // 后续整个Process过程中定制器始终处于工作状态除非发生异常。
EV.PostAlarmLog(Module, msg); _swTempRaisingMonitor.Start();
else _lastInnerTemp = InnerTemp;
EV.PostWarningLog(Module, msg); _lastMiddleTemp = MiddleTemp;
_lastOuterTemp = OuterTemp;
} }
else if (_swTempRaisingMonitor.Elapsed.TotalSeconds > 1)
#endregion
#region Outer
raisingPerSec = Math.Abs(OuterTemp - _lastOuterTemp) / interval;
_rTrigOuterTempRaisingFast.CLK = raisingPerSec > _tempRaisingRateOuter;
if (_rTrigOuterTempRaisingFast.Q)
{ {
var msg = $"Outer Temp raising too fast at a rate of {raisingPerSec:F1}℃/s";
if (_isAlarmTempRaisingFast)
EV.PostAlarmLog(Module, msg);
else
EV.PostWarningLog(Module, msg);
}
#endregion _swTempRaisingMonitor.Stop();
var interval = _swTempRaisingMonitor.Elapsed.TotalSeconds;
if (interval <= 0)
return true;
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();
}
} }
_lastInnerTemp = InnerTemp; return true;
_lastMiddleTemp = MiddleTemp;
_lastOuterTemp = OuterTemp;
_timTempRaisingMonitor.Start(0);
} }