diff --git a/MECF.Framework.Common/Aitex/Core/RT/Device/BaseDevice.cs b/MECF.Framework.Common/Aitex/Core/RT/Device/BaseDevice.cs index 744f58b..a407a18 100644 --- a/MECF.Framework.Common/Aitex/Core/RT/Device/BaseDevice.cs +++ b/MECF.Framework.Common/Aitex/Core/RT/Device/BaseDevice.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Xml; using Aitex.Core.RT.Event; @@ -162,6 +163,66 @@ namespace Aitex.Core.RT.Device #region Methods + /// + /// 加载指定的系统配置。 + /// + /// 指定的系统配置路径 + /// 当指定的系统配置路径不存在时,使用默认路径 + /// 当指定的系统配置值数据类型错误时,使用此默认值 + /// 存放系统配置的变量 + /// 监测系统配置是否发生变化,当发生变化时,执行此回调函数 + /// + protected void LoadSC(string scPath, string scPathFallback, T valueFallback, ref T valueHolder, Action scValueChangedCallback = null) + { + if (scPath == null) throw new ArgumentNullException(nameof(scPath)); + if (scPathFallback == null) throw new ArgumentNullException(nameof(scPathFallback)); + if (valueFallback == null) throw new ArgumentNullException(nameof(valueFallback)); + if (valueHolder == null) throw new ArgumentNullException(nameof(valueHolder)); + + // 读取系统配置 + var path = scPath; + var scItem = SC.GetConfigItem(path); + if (scItem == null) + { + // 没找到配置,用默认路径找 + path = scPathFallback; + scItem = SC.GetConfigItem(path); + } + + if (scItem != null) + { + // 找到系统配置,尝试转换并赋值到指定的字段 + try + { + var converter = TypeDescriptor.GetConverter(typeof(T)); + valueHolder = (T)converter.ConvertFromString(scItem.Value.ToString()); + + // 如果指定了该回调,则表明需要监测当前系统配置值 + if (scValueChangedCallback != null) + { + SC.RegisterValueChangedCallback(path, v => + { + var val = (T)converter.ConvertFromString(scItem.Value.ToString()); + scValueChangedCallback(val); + }); + } + } + catch (Exception) + { + EV.PostWarningLog(Module, + $"System config {path} type mismatched, set to default value"); + valueHolder = valueFallback; + } + } + else + { + // 指定路径和默认路径均找不到配置,使用默认配置 + EV.PostWarningLog(Module, + $"System config {path} type mismatched, set to default value"); + valueHolder = valueFallback; + } + } + /// /// 订阅报警事件。 /// diff --git a/MECF.Framework.RT.EquipmentLibrary/Devices/IoPSU.cs b/MECF.Framework.RT.EquipmentLibrary/Devices/IoPSU.cs index e9a3009..b387f07 100644 --- a/MECF.Framework.RT.EquipmentLibrary/Devices/IoPSU.cs +++ b/MECF.Framework.RT.EquipmentLibrary/Devices/IoPSU.cs @@ -167,32 +167,10 @@ namespace Aitex.Core.RT.Device.Devices /// private void LoadConfig() { - // 读取系统配置中电阻最大值定义; - // 如果DeviceModel配置中指定的系统配置节点找不到,则用默认的路径找配置; - // 如果还找不到,则默认为3欧姆。 - var scResLimitMax = $"{ScBasePath}.{_scResLimitMax}"; - var sc = SC.GetConfigItem(scResLimitMax); - if (sc != null) - _resLimitMax = (float)sc.Value; - else - { - scResLimitMax = $"PM.{Module}.Heater.{Name}ResistanceLimitMax"; - sc = SC.GetConfigItem(scResLimitMax); - if (sc != null) - _resLimitMax = (float)sc.Value; - else - { - _resLimitMax = 3; - EV.PostWarningLog(Module, - $"Unable to find {Name} ResistanceMax config, set to {_resLimitMax} as the default value"); - } - } + const float DEF_RES_LIMIT_MAX_OHM = 3; - // 监测系统配置变化。 - SC.RegisterValueChangedCallback(scResLimitMax, v => - { - _resLimitMax = (float)v; - }); + LoadSC($"{ScBasePath}.{_scResLimitMax}", $"PM.{Module}.Heater.{Name}ResistanceLimitMax", + DEF_RES_LIMIT_MAX_OHM, ref _resLimitMax, f => { _resLimitMax = f; }); } public bool Initialize()