From c6f16187a98b10bf1beb372211fa9659d03ea54d Mon Sep 17 00:00:00 2001 From: SL <123@123.com> Date: Fri, 12 Jul 2024 14:37:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(IoTC):=20=E4=BC=98=E5=8C=96=E6=B8=A9?= =?UTF-8?q?=E5=BA=A6=E5=8F=98=E5=8C=96=E8=BF=87=E5=BF=AB=E6=8A=A5=E8=AD=A6?= =?UTF-8?q?=E7=9B=91=E6=B5=8B=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MonitorTempRaisingTooFastAlarm()方法增加计时器,确保每隔1s判断一次温度变化率。 --- .../Devices/IoTC.cs | 142 +++++++++++------- 1 file changed, 90 insertions(+), 52 deletions(-) diff --git a/MECF.Framework.RT.EquipmentLibrary/Devices/IoTC.cs b/MECF.Framework.RT.EquipmentLibrary/Devices/IoTC.cs index 0dc7d46..b96fb98 100644 --- a/MECF.Framework.RT.EquipmentLibrary/Devices/IoTC.cs +++ b/MECF.Framework.RT.EquipmentLibrary/Devices/IoTC.cs @@ -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; }