feat(IoTC): IoTC中增加工艺过程中升温过快报警功能。

This commit is contained in:
SL 2024-06-18 13:19:05 +08:00
parent b58d3c89f4
commit 9bc880b3f0
1 changed files with 124 additions and 73 deletions

View File

@ -1,5 +1,4 @@
using System;
using System.Runtime.InteropServices;
using System.Xml;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
@ -9,7 +8,6 @@ using Aitex.Core.RT.OperationCenter;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.MECF.Framework.Common.Utilities;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temps;
using static Aitex.Core.RT.Device.PmDevices.DicMode;
namespace Aitex.Core.RT.Device.Devices
@ -128,7 +126,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 +234,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()
@ -303,6 +300,15 @@ namespace Aitex.Core.RT.Device.Devices
DATA.Subscribe($"{Module}.{Name}.PSU1Power", () => PSU1Power);
DATA.Subscribe($"{Module}.{Name}.PSU2Power", () => PSU2Power);
DATA.Subscribe($"{Module}.{Name}.PSU3Power", () => PSU3Power);
if (Name == "TC1")
{
DATA.Subscribe($"{Module}.Temp.Outer", () => OuterTemp);
DATA.Subscribe($"{Module}.Temp.Inner", () => InnerTemp);
DATA.Subscribe($"{Module}.Temp.Middle", () => MiddleTemp);
}
//
GetPCPSUPower();
@ -452,33 +458,61 @@ namespace Aitex.Core.RT.Device.Devices
return true;
});
SCInit();
return true;
}
private void SCInit()
{
ScOuterTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.OuterTemp");
ScInnerTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.InnerTemp");
ScMiddleTempValue = SC.GetStringValue($"PM.{Module}.TempSensor.MiddleTemp");
SC.RegisterValueChangedCallback($"PM.{Module}.TempSensor.OuterTemp",
(obj) => { ScOuterTempValue = obj.ToString(); });
(obj) =>
{
ScOuterTempValue = obj.ToString();
});
SC.RegisterValueChangedCallback($"PM.{Module}.TempSensor.InnerTemp",
(obj) => { ScInnerTempValue = obj.ToString(); });
(obj) =>
{
ScInnerTempValue = obj.ToString();
});
SC.RegisterValueChangedCallback($"PM.{Module}.TempSensor.MiddleTemp",
(obj) => { ScMiddleTempValue = obj.ToString(); });
(obj) =>
{
ScMiddleTempValue = obj.ToString();
});
var v1 = ScOuterTempValue.Split('.')[1];
var v2 = ScInnerTempValue.Split('.')[1];
var v3 = ScMiddleTempValue.Split('.')[1];
if (Name == "TC1")
#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 =>
{
DATA.Subscribe($"{Module}.Temp.Outer", () => OuterTemp);
DATA.Subscribe($"{Module}.Temp.Inner", () => InnerTemp);
DATA.Subscribe($"{Module}.Temp.Middle", () => MiddleTemp);
}
return true;
}
_isAlarmTempRaisingFast = (bool)val;
});
SC.RegisterValueChangedCallback($"PM.{Module}.Heater.AETempMiddleRasingRate", val =>
{
_tempRaisingRateMiddle = (double)val;
});
SC.RegisterValueChangedCallback($"PM.{Module}.Heater.AETempOuterRasingRate", val =>
{
_tempRaisingRateOuter = (double)val;
});
#endregion
}
#region RatioSetPoint
public bool RecipeSetRatio(string selecetedLoop, float ratio, int time)
@ -1054,7 +1088,7 @@ namespace Aitex.Core.RT.Device.Devices
MonitorAlarm();
MonitorTemp();
//MonitorAETempRasingFastAlarm();
MonitorTempRaisingTooFastAlarm();
}
catch (Exception ex)
{
@ -1090,8 +1124,6 @@ namespace Aitex.Core.RT.Device.Devices
}
}
#region
//设置额定功率
private bool SetRatedValue(float Ratio1, float Ratio2, float Ratio3)
@ -1154,8 +1186,8 @@ namespace Aitex.Core.RT.Device.Devices
}
#endregion
#region
/// <summary>
/// 昂坤三个温度相互之间的最大差值
/// </summary>
@ -1207,60 +1239,77 @@ 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;
readonly DeviceTimer _timTempRaisingMonitor = 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 void MonitorTempRaisingTooFastAlarm()
{
string pmStatus = DATA.Poll($"{Module}.Status") == null ? "" : DATA.Poll($"{Module}.Status").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")
{
// 时间间隔单位从ms转换为sec
var interval = _timTempRaisingMonitor.GetElapseTime() / 1000;
var raisingPerSec = 0.0;
// 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");
// }
// }
#region Inner
// 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");
// }
/* 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";
// lastInnerTemp = InnerTemp;
// lastMiddleTemp = MiddleTemp;
// lastOuterTemp = OuterTemp;
// }
// }
if (_isAlarmTempRaisingFast)
EV.PostAlarmLog(Module, msg);
else
EV.PostWarningLog(Module, msg);
}*/
// tempMonitorDT.Start(0);
//}
#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";
if (_isAlarmTempRaisingFast)
EV.PostAlarmLog(Module, msg);
else
EV.PostWarningLog(Module, msg);
}
#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
}
_lastInnerTemp = InnerTemp;
_lastMiddleTemp = MiddleTemp;
_lastOuterTemp = OuterTemp;
_timTempRaisingMonitor.Start(0);
}
public void MonitorTemp()
@ -1346,7 +1395,6 @@ namespace Aitex.Core.RT.Device.Devices
#endregion
public void Terminate()
{
@ -1356,6 +1404,9 @@ namespace Aitex.Core.RT.Device.Devices
{
_trigSetTempLimit.RST = true;
_pyroTempMaxDiffWarm.RST = true;
_rTrigMiddleTempRaisingFast.RST = true;
_rTrigOuterTempRaisingFast.RST = true;
_rTrigInnerTempRaisingFast.RST = true;
}
#region PSU Y Calc