[Common]
BaseDevice对象中新增函数LoadSC(),用于解析并加载指定的系统配置项,并处理加载时的各种异常。 [RT.EqupmentLibrary] IoPSU的LoadConfig()方法调用LoadSC(),简化代码结构。
This commit is contained in:
parent
8a3f83e70f
commit
d425b908c8
|
@ -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>
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue