using System.Collections.Generic; using Aitex.Core.Util; using DocumentFormat.OpenXml.Spreadsheet; using ILNumerics.Native; namespace Aitex.Core.RT.IOCore { /* * * */ public abstract class InterlockLimit { public string Name { get { return _name; } } public abstract bool CurrentValue { get; } public abstract string LimitReason { get; } public bool LimitValue { get { return _limitValue; } } public string Tip { get { return _tip; } } private string _name; private bool _limitValue; private string _tip; private Dictionary _cultureTip = new Dictionary(); R_TRIG _trigger = new R_TRIG(); public InterlockLimit(string name, bool value, string tip, Dictionary cultureTip) { _name = name; _limitValue = value; _tip = tip; _cultureTip = cultureTip; } public bool IsSame(string name, bool value) { return (name == _name) && (_limitValue == value); } public bool IsSame(InterlockLimit limit) { return (limit.Name == _name) && (_limitValue == limit.LimitValue); } public bool IsTriggered() { _trigger.CLK = CurrentValue != _limitValue; return _trigger.Q; } public bool CanDo(out string reason) { reason = string.Empty; if (CurrentValue == _limitValue) return true; reason = LimitReason; return false; } } internal class DiLimit:InterlockLimit { private DIAccessor _di; public DiLimit(DIAccessor diItem, bool value, string tip, Dictionary cultureTip) :base(diItem.Name, value, tip, cultureTip) { _di = diItem; } public override bool CurrentValue { get { return _di.Value; } } public override string LimitReason { get { return string.Format("DI-{0}({1}) = [{2}],{3}", _di.IoTableIndex, _di.Name, _di.Value ? "ON" : "OFF", Tip); } } } internal class DoLimit : InterlockLimit { private DOAccessor _do; public DoLimit(DOAccessor doItem, bool value, string tip, Dictionary cultureTip) : base(doItem.Name, value, tip, cultureTip) { _do = doItem; } public override bool CurrentValue { get { return _do.Value; } } public override string LimitReason { get { return string.Format("DO-{0}({1}) = [{2}],{3}", _do.IoTableIndex, _do.Name, _do.Value ? "ON" : "OFF", Tip); } } } public class CustomLimitBase : InterlockLimit { public CustomLimitBase(string name, bool limitValue, string tip, Dictionary cultureTip) : base(name, limitValue, tip, cultureTip) { } public override bool CurrentValue { get; } public override string LimitReason { get; } } }