Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Aitex/Core/RT/IOCore/Interlock/InterlockLimit.cs

165 lines
4.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Diagnostics;
using Aitex.Core.Util;
namespace Aitex.Core.RT.IOCore
{
/// <summary>
/// 互锁限制条件。
/// </summary>
public abstract class InterlockLimit<TAccessor, TValue> : IInterlockLimit
where TAccessor: IIOAccessor where TValue : struct
{
#region Variables
private Dictionary<string, string> _cultureTip;
private readonly R_TRIG _trigger;
#endregion
#region Constructor
/// <summary>
/// 互锁限制条件的构造函数。
/// </summary>
/// <param name="io">IO对象实例。</param>
/// <param name="value">当前限制条件中的IO状态。</param>
/// <param name="tip">默认语言提示信息。</param>
/// <param name="cultureTip">多国语言提示信息。</param>
/// <exception cref="InvalidIoNameException">IO名称错误前缀不是“DI_”、”DO_“、”AI_“或"AO_".</exception>
protected InterlockLimit(TAccessor io, string value, string tip, Dictionary<string, string> cultureTip)
{
Debug.Assert(io != null, "The IO Accessor object can not be null.");
_trigger = new R_TRIG();
Io = io;
Name = io.Name;
Tip = tip;
_cultureTip = cultureTip;
UniqueId = $"{io.Name}.{value}";
}
#endregion
#region Properties
protected TAccessor Io { get; }
/// <summary>
/// 返回互锁限制条件的唯一识别码。
/// <remarks>
/// 该唯一识别码用于创建字典时作为字典的Key值使用。
/// <br/>
/// 该值由Name+LimitValue组成。
/// </remarks>
/// </summary>
public string UniqueId { get; }
/// <summary>
/// 返回互锁限制条件名称。
/// </summary>
public string Name { get; }
/// <summary>
/// 返回
/// </summary>
public abstract TValue CurrentValue { get; }
/// <summary>
/// 返回当前互锁限制条件触发的原因。
/// </summary>
public abstract string LimitReason { get; }
/// <summary>
/// 返回当前互锁条件的信号约束值。
/// </summary>
public TValue LimitValue { get; protected set; }
/// <summary>
/// 返回当前互锁条件提示信息。
/// </summary>
public string Tip { get; }
#endregion
#region Methods
/*
/// <summary>
/// 判断两个互锁限制条件是否相等。
/// </summary>
/// <param name="interlockLimit">待比较的互锁限制条件。</param>
/// <returns>
/// <para>True: 相同False不同。</para>
/// </returns>
public bool IsSame(object interlockLimit)
{
if (interlockLimit is not InterlockLimit<TAccessor, TValue> li)
return false;
return Name == li.Name && li.LimitValue == LimitValue;
}*/
/// <summary>
/// 返回互锁限制监测的信号当前值和期望值不相等的条件是否触发。
/// <remarks>
/// 捕获当前值和期望值不相等信号的上升沿当上升沿到达时触发输出Q。
/// </remarks>
/// </summary>
/// <returns></returns>
public bool IsTriggered()
{
_trigger.CLK = !CheckInRange();
return _trigger.Q;
}
/// <summary>
/// 根据互锁条件判断是否允许DO输出。
/// </summary>
/// <param name="reason">如果禁止DO输出返回互锁原因。</param>
/// <returns></returns>
public bool CanDo(out string reason)
{
reason = string.Empty;
if (CheckInRange())
return true;
reason = LimitReason;
return false;
}
/// <summary>
/// 获取指定互锁限制条件中限制条件的内容。
/// </summary>
/// <returns></returns>
public virtual string GetLimitValue()
{
return LimitValue.ToString();
}
/// <summary>
/// 获取指定互锁限制条件中当前IO状态。
/// </summary>
/// <returns></returns>
public virtual string GetCurrentValue()
{
return CurrentValue.ToString();
}
/// <summary>
/// 检查当前值和是否超出限制值范围。
/// </summary>
/// <returns>True: 在范围内; False超出范围。</returns>
protected abstract bool CheckInRange();
/// <summary>
/// <inheritdoc />
/// </summary>
/// <returns></returns>
public override string ToString()
{
return $"{Name}, Limit={LimitValue}";
}
#endregion
}
}