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 内部变量
///
/// counter对象
///
private BeckhoffCounter _counter;
///
/// 数值
///
private double _value;
///
/// 启动时间
///
private DateTime _startTime = DateTime.Now;
///
/// 时长
///
private TimeSpan _elapsedTime = TimeSpan.Zero;
///
/// 上一次计数
///
private int _previousCounts { get; set; }
///
/// 首次
///
private bool first = true;
private bool _resetCounter = false;
///
/// 上一次数值
///
private DateTime _lastTime= DateTime.Now;
///
/// 定时器
///
private System.Timers.Timer _timer;
///
/// 定时器记录的数值
///
private int _timerCounter = 0;
#endregion
#region 事件
public event BeckhoffDelegate.OnUpdateVariableCounterValue OnUpdateVariableCounterValue;
#endregion
///
/// 构造函数
///
///
public BeckhoffCounterValue(BeckhoffCounter counter)
{
_counter = counter;
if (counter.Mode != 0)
{
_timer = new System.Timers.Timer();
_timer.Interval = 5000;
_timer.Elapsed += Timer_Elapsed;
_timer.Start();
}
}
///
/// 定时器
///
///
///
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;
}
}
///
/// 启动
///
public void Start()
{
}
///
/// 停止
///
public void Stop()
{
}
///
/// 重置
///
public void Reset()
{
_resetCounter = true;
_value = 0;
_previousCounts = 0;
BeckhoffCounterManager.Instance.SetCounterValue($"{_counter.Name}.{COUNTER_VALUE}", 0);
}
///
/// 设置数值
///
///
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);
}
}
///
/// 设置常规数值
///
///
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;
}
}
///
/// 设置比例数值
///
///
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;
}
///
/// 设置统计数值
///
///
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;
}
///
/// 获取数值
///
///
public double GetValue()
{
if(_counter.Mode==1)
{
if (DateTime.Now.Subtract(_lastTime).TotalMilliseconds > _counter.Period)
{
_value = 0;
}
}
return _value;
}
///
/// 启动计时
///
private void StartTimer()
{
_startTime = DateTime.Now;
_elapsedTime = TimeSpan.Zero;
}
///
/// 计算时长
///
///
private double ElapsedTime()
{
_elapsedTime = DateTime.Now - _startTime;
return _elapsedTime.TotalSeconds;
}
}
}