| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 | using DocumentFormat.OpenXml.Bibliography;using MECF.Framework.Common.Beckhoff.IOAxis;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MECF.Framework.Common.TwinCat{    public class BeckhoffCounterValue    {        #region 常量        private const string COUNTER_VALUE = "CounterValue";        private const double MAX_COUNTS = 4294967296.0;        #endregion        #region 内部变量        /// <summary>        /// counter对象        /// </summary>        private BeckhoffCounter _counter;        /// <summary>        /// 数值        /// </summary>        private double _value;        /// <summary>        /// 启动时间        /// </summary>        private DateTime _startTime = DateTime.Now;        /// <summary>        /// 时长        /// </summary>        private TimeSpan _elapsedTime = TimeSpan.Zero;        /// <summary>        /// 上一次计数        /// </summary>        private int _previousCounts { get; set; }         /// <summary>        /// 首次        /// </summary>        private bool first = true;        private bool _resetCounter = false;        /// <summary>        /// 上一次数值        /// </summary>        private DateTime _lastTime= DateTime.Now;        /// <summary>        /// 定时器        /// </summary>        private System.Timers.Timer _timer;        /// <summary>        /// 定时器记录的数值        /// </summary>        private int _timerCounter = 0;        #endregion        #region 事件        public event BeckhoffDelegate.OnUpdateVariableCounterValue OnUpdateVariableCounterValue;        #endregion        /// <summary>        /// 构造函数        /// </summary>        /// <param name="counter"></param>        public BeckhoffCounterValue(BeckhoffCounter counter)        {            _counter = counter;            if (counter.Mode != 0)            {                _timer = new System.Timers.Timer();                _timer.Interval = 5000;                _timer.Elapsed += Timer_Elapsed;                _timer.Start();            }        }        /// <summary>        /// 定时器        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)        {            if (_timerCounter == _previousCounts)            {                if (OnUpdateVariableCounterValue != null)                {                    string key = _counter.Name;                    string inputName = $"{key}.{COUNTER_VALUE}";                    OnUpdateVariableCounterValue(inputName, 0);                }            }            else            {                _timerCounter = _previousCounts;            }        }        /// <summary>        /// 启动        /// </summary>        public void Start()        {        }        /// <summary>        /// 停止        /// </summary>        public void Stop()        {        }        /// <summary>        /// 重置        /// </summary>        public void Reset()        {            _resetCounter = true;            _value = 0;            _previousCounts = 0;            BeckhoffCounterManager.Instance.SetCounterValue($"{_counter.Name}.{COUNTER_VALUE}", 0);        }        /// <summary>        /// 设置数值        /// </summary>        /// <param name="value"></param>        public void SetValue(int value)        {            if (_counter.Mode == 0)            {                SetNormalValue(value);            }            else if (_counter.Mode == 1)            {                SetRateValue(value);            }            else if(_counter.Mode==2)            {                SetTotalValue(value);            }        }        /// <summary>        /// 设置常规数值        /// </summary>        /// <param name="value"></param>        private void SetNormalValue(int value)        {            if (!string.IsNullOrEmpty(_counter.Scaling))            {                var result = ScalingManager.Instance.CalculateValueByTwincatVariable($"{_counter.Name}.{COUNTER_VALUE}", value);                if (result.Item1)                {                    _value = result.Item2;                }                else                {                    _value = value;                }            }            else            {                _value = value;            }        }        /// <summary>        /// 设置比例数值        /// </summary>        /// <param name="value"></param>        private void SetRateValue(int value)        {            _lastTime = DateTime.Now;            double scaledValue = 0.0;            double currentCounts = 0.0;            double tDelta = ElapsedTime();            double currentCounter = _value;            if(value==0)            {                _value = 0;                _previousCounts = 0;                return;            }            if (_previousCounts == 0)            {                _previousCounts = value;                _value = 0;                StartTimer();                return;            }            if (tDelta*1000>_counter.Period)            {                if (value < _previousCounts)                    currentCounts = (MAX_COUNTS - _previousCounts) + value;                else                    currentCounts = value - _previousCounts;                if (!string.IsNullOrEmpty(_counter.Scaling))                {                    var result = ScalingManager.Instance.CalculateValueByTwincatVariable($"{_counter.Name}.{COUNTER_VALUE}", (currentCounts / tDelta));                    if (result.Item1)                    {                        double rate = result.Item2;                        if(first||rate!=scaledValue)                        {                            first = false;                            scaledValue = rate;                        }                    }                    else                    {                        scaledValue=currentCounter/tDelta;                    }                }                else                {                    scaledValue = currentCounter / tDelta;                }                _previousCounts = value;                StartTimer();            }            else            {                scaledValue = currentCounter;            }            _value = scaledValue;        }        /// <summary>        /// 设置统计数值        /// </summary>        /// <param name="value"></param>        private void SetTotalValue(int value)        {            double scaledValue = this._value;            double deltaValue;            if (!_resetCounter && !first)            {                int deltaCount = unchecked(value - _previousCounts);                var result = ScalingManager.Instance.CalculateValueByTwincatVariable($"{_counter.Name}.{COUNTER_VALUE}", deltaCount);                if (result.Item1)                {                    deltaValue= result.Item2;                }                else                {                    deltaValue = deltaCount;                }            }            else            {                _resetCounter = false;                first = false;                deltaValue = 0.0;            }            _previousCounts = value;            scaledValue += deltaValue;            _value = scaledValue;        }        /// <summary>        /// 获取数值        /// </summary>        /// <returns></returns>        public double GetValue()        {            if(_counter.Mode==1)            {                if (DateTime.Now.Subtract(_lastTime).TotalMilliseconds > _counter.Period)                {                    _value = 0;                }            }            return _value;        }        /// <summary>        /// 启动计时        /// </summary>        private void StartTimer()        {            _startTime = DateTime.Now;            _elapsedTime = TimeSpan.Zero;        }        /// <summary>        /// 计算时长        /// </summary>        /// <returns></returns>        private double ElapsedTime()        {            _elapsedTime = DateTime.Now - _startTime;            return _elapsedTime.TotalSeconds;        }    }}
 |