| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | using System;using System.Collections.Generic;using System.ComponentModel.Design.Serialization;using System.Globalization;using System.Linq;using System.Text;namespace Aitex.Core.RT.IOCore{    /*     *   <Action do="DO_MFC1_valve__" value="true" tip="" tip.zh-CN="" tip.en-US="">    <Limit di="DI_Chamber_door_sw"  value="true" tip="" tip.zh-CN="" tip.en-US="" />  </Action>     *      */    class InterlockAction    {        private List<InterlockLimit> _limits = new List<InterlockLimit>();        private DOAccessor _do;        private bool _actionValue;        private string _actionstringValue;        private string _tip;        private Dictionary<string, string> _cultureTip = new Dictionary<string, string>();        private string _actionName;        public string ActionName => _do != null ? _do.Name : _actionName;        public string Condition { get; set; }//KEEP,DELAY        public float ConditionTime { get; set; }//和Condition配合使用        public DOAccessor ActionDo => _do;        public bool IsReverse => _isReverse;        private bool _isReverse;        public bool IsAuto => _isAuto;        private bool _isAuto;        public bool ActionValue => _actionValue;        public List<InterlockLimit> Limits => _limits;        public string Tip => _tip;        public InterlockAction(DOAccessor doItem, bool value, string tip, Dictionary<string, string> cultureTip, List<InterlockLimit> limits, bool isReverse)        {            _do = doItem;            _actionValue = value;            _tip = tip;            _cultureTip = cultureTip;            _limits = limits;            _isReverse = isReverse;        }        public InterlockAction(DOAccessor doItem, string value, string tip, Dictionary<string, string> cultureTip, List<InterlockLimit> limits)        {            _do = doItem;            _actionstringValue = value;            _tip = tip;            _cultureTip = cultureTip;            _limits = limits;        }        public InterlockAction(DOAccessor doItem, bool value, string tip, string condition, float conditionTime, List<InterlockLimit> limits, bool auto = true)        {            _do = doItem;            _actionValue = value;            _tip = tip;            _limits = limits;            _isAuto = auto;            Condition = condition;            ConditionTime = conditionTime;        }        public InterlockAction(string actionName, bool value, string tip, string condition, float conditionTime, List<InterlockLimit> limits, bool auto)        {            _actionName = actionName;            _actionValue = value;            _tip = tip;            _limits = limits;            _isAuto = auto;            Condition = condition;            ConditionTime = conditionTime;        }        public bool IsSame(string doName, string value)        {            return (doName == ActionName) && (_actionstringValue == value);        }        public bool IsSame(string doName, bool value)        {            return (doName == ActionName) && (_actionValue == value);        }        public bool Reverse(out string reason)        {            reason = string.Empty;            if (_do.Value != _actionValue)                return false;            if (_do.SetValue(!_actionValue, out reason))            {                reason = string.Format("Force setting DO-{0}({1}) = [{2}]", _do.IoTableIndex, _do.Name, (!_actionValue) ? "ON" : "OFF");            }            return true;        }        public bool CanDo(out string reason)        {            reason = string.Empty;            bool result = true;            bool cando;            foreach (var interlockLimit in _limits)            {                string info;                cando = interlockLimit.CanDo(out info);                if (!cando)                {                    if (reason.Length > 0)                        reason += "\n";                    else                    {                        reason = string.Format("Interlock triggered, DO-{0}({1}) can not be [{2}], {3} \n", _do.IoTableIndex, _do.Name, _actionValue ? "ON" : "OFF",                            _tip);                    }                    reason += info;                }                switch (interlockLimit.Condition.ToUpper())                {                    case "AND":                        result = result && cando;                        break;                    case "OR":                        result = result || cando;                        break;                }            }            return result;        }    }}
 |