| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 | using System;using System.Collections.Generic;using Aitex.Core.RT.DataCenter;using Aitex.Core.RT.SCCore;using Aitex.Core.Util;using DocumentFormat.OpenXml.Spreadsheet;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>     *      */    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;            }        }        public string Condition { get; set; }//AND,OR,EXOR,BLANK        public bool IsFloatType { get; set; }        private string _name;        private bool _limitValue;        private string _tip;        private Dictionary<string, string> _cultureTip = new Dictionary<string, string>();        R_TRIG _trigger = new R_TRIG();        public InterlockLimit(string name, bool value, string tip, Dictionary<string, string> 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<string, string> cultureTip, string condition = "AND")        : base(diItem.Name, value, tip, cultureTip)        {            _di = diItem;            Condition = condition;        }        public DiLimit(DIAccessor diItem, bool value, string condition)        : base(diItem.Name, value, "", null)        {            _di = diItem;            Condition = condition;        }        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<string, string> cultureTip, string condition = "AND")            : base(doItem.Name, value, tip, cultureTip)        {            _do = doItem;            Condition = condition;        }        public DoLimit(DOAccessor doItem, bool value, string condition)        : base(doItem.Name, value, "", null)        {            _do = doItem;            Condition = condition;        }        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);            }        }    }    internal class AoLimit : InterlockLimit    {        /// <summary>        //LT(less than)               小于        //LE(less than or equal to)   小于等于        //EQ(equal to)                等于        //NE(not equal to)            不等于        //GE(greater than or equal to)大于等于        //GT(greater than)            大于        //B(bool)         /// </summary>        private AOAccessor _ao;        private float _limitFloatValue;        private string _operator;        private string _module = "";        public AoLimit(AOAccessor aoItem, string value, string condition, bool isFloatType = true)        : base(aoItem.Name, true, "", null)        {            _ao = aoItem;            Condition = condition;            IsFloatType = isFloatType;            //if (value.StartsWith(">="))            //{            //    _operator = ">=";            //}            //else if (value.StartsWith("<="))            //{            //    _operator = "<=";            //}            //else if (value.StartsWith(">"))            //{            //    _operator = ">";            //}            //else if (value.StartsWith("<"))            //{            //    _operator = "<";            //}            //else            //{            //    _operator = "=";            //}            if (value.Contains("GT"))            {                _operator = "GT";            }            else if (value.Contains("GE"))            {                _operator = "GE";            }            else if (value.Contains("NE"))            {                _operator = "NE";            }            else if (value.Contains("EQ"))            {                _operator = "EQ";            }            else if (value.Contains("LE"))            {                _operator = "LE";            }            else if (value.Contains("LT"))            {                _operator = "LT";            }            float.TryParse(value.Replace(_operator, ""), out _limitFloatValue);            var paras = aoItem.Name.Split('.');            if (paras != null && paras.Length > 1)                _module = paras[0];        }        public override string LimitReason        {            get            {                return string.Format("AO-{0}({1}) = [{2}],{3}", _ao.IoTableIndex, _ao.Name, (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value), Tip);            }        }        public override bool CurrentValue        {            get            {                switch (_operator)                {                    case "GT":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value) > _limitFloatValue;                    case "GE":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value) >= _limitFloatValue;                    case "NE":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value) != _limitFloatValue;                    case "EQ":                        return Math.Abs((SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value) - _limitFloatValue) < 0.000001;                    case "LE":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value) <= _limitFloatValue;                    case "LT":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ao.FloatValue : _ao.Value) < _limitFloatValue;                    default:                        return false;                }            }        }    }    internal class AiLimit : InterlockLimit    {        /// <summary>        //LT(less than)               小于        //LE(less than or equal to)   小于等于        //EQ(equal to)                等于        //NE(not equal to)            不等于        //GE(greater than or equal to)大于等于        //GT(greater than)            大于        //B(bool)         /// </summary>        private AIAccessor _ai;        private float _limitFloatValue;        private string _operator;        private string _module = "";        public AiLimit(AIAccessor aiItem, string value, string condition, bool isFloatType = true)        : base(aiItem.Name, true, "", null)        {            _ai = aiItem;            Condition = condition;            IsFloatType = isFloatType;            //if (value.StartsWith(">="))            //{            //    _operator = ">=";            //}            //else if (value.StartsWith("<="))            //{            //    _operator = "<=";            //}            //else if (value.StartsWith(">"))            //{            //    _operator = ">";            //}            //else if (value.StartsWith("<"))            //{            //    _operator = "<";            //}            //else            //{            //    _operator = "=";            //}            if (value.Contains("GT"))            {                _operator = "GT";            }            else if (value.Contains("GE"))            {                _operator = "GE";            }            else if (value.Contains("NE"))            {                _operator = "NE";            }            else if (value.Contains("EQ"))            {                _operator = "EQ";            }            else if (value.Contains("LE"))            {                _operator = "LE";            }            else if (value.Contains("LT"))            {                _operator = "LT";            }            float.TryParse(value.Replace(_operator, ""), out _limitFloatValue);            var paras = aiItem.Name.Split('.');            if (paras != null && paras.Length > 1)                _module = paras[0];        }        public override string LimitReason        {            get            {                return string.Format("AO-{0}({1}) = [{2}],{3}", _ai.IoTableIndex, _ai.Name, (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value), Tip);            }        }        public override bool CurrentValue        {            get            {                switch (_operator)                {                    case "GT":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value) > _limitFloatValue;                    case "GE":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value) >= _limitFloatValue;                    case "NE":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value) != _limitFloatValue;                    case "EQ":                        return Math.Abs((SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value) - _limitFloatValue) < 0.000001;                    case "LE":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value) <= _limitFloatValue;                    case "LT":                        return (SC.ContainsItem($"{_module}.IsAIAOFloatType") && SC.GetValue<bool>($"{_module}.IsAIAOFloatType") ? _ai.FloatValue : _ai.Value) < _limitFloatValue;                    default:                        return false;                }            }        }    }    internal class UserDefineLimit : InterlockLimit    {        public UserDefineLimit(string name, bool limitValue, string condition)            : base(name, limitValue, "", null)        {            Condition = condition;        }        public override bool CurrentValue { get; }        public override string LimitReason { get; }    }    internal class DataPollLimit : InterlockLimit    {        /// <summary>        //LT(less than)               小于        //LE(less than or equal to)   小于等于        //EQ(equal to)                等于        //NE(not equal to)            不等于        //GE(greater than or equal to)大于等于        //GT(greater than)            大于        //B(bool)         /// </summary>        private string _operator;        private string _operatorTip;        private float _limitFloatValue;        private bool _limitBoolValue;        public DataPollLimit(string name, string limitValue, string condition)            : base(name, true, "", null)        {            Condition = condition;            if (limitValue.Contains("GT"))            {                _operator = "GT";                _operatorTip = ">";                float.TryParse(limitValue.Replace(_operator, ""), out _limitFloatValue);            }            else if (limitValue.Contains("GE"))            {                _operator = "GE";                _operatorTip = ">=";                float.TryParse(limitValue.Replace(_operator, ""), out _limitFloatValue);            }            else if (limitValue.Contains("NE"))            {                _operator = "NE";                _operatorTip = "!=";                float.TryParse(limitValue.Replace(_operator, ""), out _limitFloatValue);            }            else if (limitValue.Contains("EQ"))            {                _operator = "EQ";                _operatorTip = "==";                float.TryParse(limitValue.Replace(_operator, ""), out _limitFloatValue);            }            else if (limitValue.Contains("LE"))            {                _operator = "LE";                _operatorTip = "<=";                float.TryParse(limitValue.Replace(_operator, ""), out _limitFloatValue);            }            else if (limitValue.Contains("LT"))            {                _operator = "LT";                _operatorTip = "<";                float.TryParse(limitValue.Replace(_operator, ""), out _limitFloatValue);            }            else            {                _operator = "B";                _operatorTip = "true";                _limitBoolValue = limitValue.ToUpper().Contains("ON") ? true : false;            }        }        public override bool CurrentValue        {            get            {                switch (_operator)                {                    case "GT":                        float.TryParse(DATA.Poll(Name).ToString(), out float valueGT);                        return valueGT > _limitFloatValue;                    case "GE":                        float.TryParse(DATA.Poll(Name).ToString(), out float valueGE);                        return valueGE >= _limitFloatValue;                    case "NE":                        float.TryParse(DATA.Poll(Name).ToString(), out float valueNE);                        return valueNE != _limitFloatValue;                    case "EQ":                        float.TryParse(DATA.Poll(Name).ToString(), out float valueEQ);                        return valueEQ == _limitFloatValue;                    case "LE":                        float.TryParse(DATA.Poll(Name).ToString(), out float valueLE);                        return valueLE <= _limitFloatValue;                    case "LT":                        float.TryParse(DATA.Poll(Name).ToString(), out float valueLT);                        return valueLT < _limitFloatValue;                    case "B":                        bool.TryParse(DATA.Poll(Name).ToString(), out bool valueB);                        return !(valueB ^ _limitBoolValue);                    default:                        return false;                }            }        }        public override string LimitReason        {            get            {                return $"DATA.Poll-{Name} = [{DATA.Poll(Name)}] not {_operatorTip} {(_operator == "B" ? _limitBoolValue.ToString() : _limitFloatValue.ToString())}";            }        }    }    public class CustomLimitBase : InterlockLimit    {        public CustomLimitBase(string name, bool limitValue, string tip, Dictionary<string, string> cultureTip) : base(name, limitValue, tip, cultureTip)        {        }        public override bool CurrentValue { get; }        public override string LimitReason { get; }    }}
 |