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

80 lines
1.9 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;
namespace Aitex.Core.RT.IOCore
{
internal class InterlockAction
{
private readonly List<IInterlockLimit> _limits;
private readonly DOAccessor _do;
private readonly bool _actionValue;
private readonly string _tip;
private Dictionary<string, string> _cultureTip;
public string ActionName => (_do != null) ? _do.Name : "";
public InterlockAction(DOAccessor doItem, bool value, string tip, Dictionary<string, string> cultureTip,
List<IInterlockLimit> limits)
{
_do = doItem;
_actionValue = value;
_tip = tip;
_cultureTip = cultureTip;
_limits = limits;
}
public bool IsSame(string doName, bool value)
{
return doName == _do.Name && _actionValue == value;
}
/// <summary>
/// 如果命中某个互锁限制条件则将DO电平恢复到Action定义的反向电平。
/// </summary>
/// <param name="reason">执行恢复电平动作的信息。</param>
/// <returns>
/// True执行了电平恢复操作False未操作电平
/// </returns>
public bool TryReverse(out string reason)
{
reason = string.Empty;
// 如果DO当前电平不等于Action定义的电平则啥也不干
if (_do.Value != _actionValue)
return false;
// 如果DO已经输出Action定义的电平则反向
if (_do.SetValue(!_actionValue, out reason))
reason = $"Force setting DO-{_do.IoTableIndex}({_do.Name}) = [{((!_actionValue) ? "ON" : "OFF")}]";
return true;
}
public bool CanDo(out string reason)
{
reason = string.Empty;
bool result = true;
foreach (var limit in _limits)
{
if (!limit.CanDo(out var reason2))
{
if (reason.Length > 0)
{
reason += "\n";
}
else
{
reason =
$"Interlock triggered, DO-{_do.IoTableIndex}({_do.Name}) can not be [{(_actionValue ? "ON" : "OFF")}], {_tip} \n";
}
reason += reason2;
result = false;
}
}
return result;
}
}
}