refactor(IoTC): 优化温度变化过快报警监测逻辑。
MonitorTempRaisingTooFastAlarm()方法增加计时器,确保每隔1s判断一次温度变化率。
This commit is contained in:
parent
7d815fc0d1
commit
c6f16187a9
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Xml;
|
||||
using Aitex.Core.RT.DataCenter;
|
||||
using Aitex.Core.RT.Event;
|
||||
|
@ -1239,7 +1240,7 @@ namespace Aitex.Core.RT.Device.Devices
|
|||
}
|
||||
|
||||
//DateTime dtLastRecordTime = DateTime.Now;
|
||||
readonly DeviceTimer _timTempRaisingMonitor = new ();
|
||||
private readonly Stopwatch _swTempRaisingMonitor = new();
|
||||
private double _lastInnerTemp = 0;
|
||||
private double _lastMiddleTemp = 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 _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
|
||||
|
||||
/* 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)
|
||||
if (!_swTempRaisingMonitor.IsRunning)
|
||||
{
|
||||
var msg = $"Middle Temp raising too fast at a rate of {raisingPerSec:F1}℃/s";
|
||||
if (_isAlarmTempRaisingFast)
|
||||
EV.PostAlarmLog(Module, msg);
|
||||
else
|
||||
EV.PostWarningLog(Module, msg);
|
||||
// 首次进入Process,启动1s定时,并保存当前当前温度。
|
||||
// 后续整个Process过程中,定制器始终处于工作状态,除非发生异常。
|
||||
_swTempRaisingMonitor.Start();
|
||||
_lastInnerTemp = InnerTemp;
|
||||
_lastMiddleTemp = MiddleTemp;
|
||||
_lastOuterTemp = OuterTemp;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Outer
|
||||
|
||||
raisingPerSec = Math.Abs(OuterTemp - _lastOuterTemp) / interval;
|
||||
_rTrigOuterTempRaisingFast.CLK = raisingPerSec > _tempRaisingRateOuter;
|
||||
if (_rTrigOuterTempRaisingFast.Q)
|
||||
else if (_swTempRaisingMonitor.Elapsed.TotalSeconds > 1)
|
||||
{
|
||||
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;
|
||||
_lastMiddleTemp = MiddleTemp;
|
||||
_lastOuterTemp = OuterTemp;
|
||||
_timTempRaisingMonitor.Start(0);
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue