BaseDevice对象中新增函数LoadSC(),用于解析并加载指定的系统配置项,并处理加载时的各种异常。

[RT.EqupmentLibrary]
IoPSU的LoadConfig()方法调用LoadSC(),简化代码结构。
This commit is contained in:
SL 2023-07-19 17:46:42 +08:00
parent 8a3f83e70f
commit d425b908c8
2 changed files with 64 additions and 25 deletions

View File

@ -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
/// <summary>
/// 加载指定的系统配置。
/// </summary>
/// <param name="scPath">指定的系统配置路径</param>
/// <param name="scPathFallback">当指定的系统配置路径不存在时,使用默认路径</param>
/// <param name="valueFallback">当指定的系统配置值数据类型错误时,使用此默认值</param>
/// <param name="valueHolder">存放系统配置的变量</param>
/// <param name="scValueChangedCallback">监测系统配置是否发生变化,当发生变化时,执行此回调函数</param>
/// <typeparam name="T"></typeparam>
protected void LoadSC<T>(string scPath, string scPathFallback, T valueFallback, ref T valueHolder, Action<T> 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;
}
}
/// <summary>
/// 订阅报警事件。
/// </summary>

View File

@ -167,32 +167,10 @@ namespace Aitex.Core.RT.Device.Devices
/// </summary>
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()