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()