BeckhoffCounterValue.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using DocumentFormat.OpenXml.Bibliography;
  2. using MECF.Framework.Common.Beckhoff.IOAxis;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace MECF.Framework.Common.TwinCat
  9. {
  10. public class BeckhoffCounterValue
  11. {
  12. #region 常量
  13. private const string COUNTER_VALUE = "CounterValue";
  14. private const double MAX_COUNTS = 4294967296.0;
  15. #endregion
  16. #region 内部变量
  17. /// <summary>
  18. /// counter对象
  19. /// </summary>
  20. private BeckhoffCounter _counter;
  21. /// <summary>
  22. /// 数值
  23. /// </summary>
  24. private double _value;
  25. /// <summary>
  26. /// 启动时间
  27. /// </summary>
  28. private DateTime _startTime = DateTime.Now;
  29. /// <summary>
  30. /// 时长
  31. /// </summary>
  32. private TimeSpan _elapsedTime = TimeSpan.Zero;
  33. /// <summary>
  34. /// 上一次计数
  35. /// </summary>
  36. private int _previousCounts { get; set; }
  37. /// <summary>
  38. /// 首次
  39. /// </summary>
  40. private bool first = true;
  41. private bool _resetCounter = false;
  42. /// <summary>
  43. /// 上一次数值
  44. /// </summary>
  45. private DateTime _lastTime= DateTime.Now;
  46. /// <summary>
  47. /// 定时器
  48. /// </summary>
  49. private System.Timers.Timer _timer;
  50. /// <summary>
  51. /// 定时器记录的数值
  52. /// </summary>
  53. private int _timerCounter = 0;
  54. #endregion
  55. #region 事件
  56. public event BeckhoffDelegate.OnUpdateVariableCounterValue OnUpdateVariableCounterValue;
  57. #endregion
  58. /// <summary>
  59. /// 构造函数
  60. /// </summary>
  61. /// <param name="counter"></param>
  62. public BeckhoffCounterValue(BeckhoffCounter counter)
  63. {
  64. _counter = counter;
  65. if (counter.Mode != 0)
  66. {
  67. _timer = new System.Timers.Timer();
  68. _timer.Interval = 5000;
  69. _timer.Elapsed += Timer_Elapsed;
  70. _timer.Start();
  71. }
  72. }
  73. /// <summary>
  74. /// 定时器
  75. /// </summary>
  76. /// <param name="sender"></param>
  77. /// <param name="e"></param>
  78. private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  79. {
  80. if (_timerCounter == _previousCounts)
  81. {
  82. if (OnUpdateVariableCounterValue != null)
  83. {
  84. string key = _counter.Name;
  85. string inputName = $"{key}.{COUNTER_VALUE}";
  86. OnUpdateVariableCounterValue(inputName, 0);
  87. }
  88. }
  89. else
  90. {
  91. _timerCounter = _previousCounts;
  92. }
  93. }
  94. /// <summary>
  95. /// 启动
  96. /// </summary>
  97. public void Start()
  98. {
  99. }
  100. /// <summary>
  101. /// 停止
  102. /// </summary>
  103. public void Stop()
  104. {
  105. }
  106. /// <summary>
  107. /// 重置
  108. /// </summary>
  109. public void Reset()
  110. {
  111. _resetCounter = true;
  112. _value = 0;
  113. _previousCounts = 0;
  114. BeckhoffCounterManager.Instance.SetCounterValue($"{_counter.Name}.{COUNTER_VALUE}", 0);
  115. }
  116. /// <summary>
  117. /// 设置数值
  118. /// </summary>
  119. /// <param name="value"></param>
  120. public void SetValue(int value)
  121. {
  122. if (_counter.Mode == 0)
  123. {
  124. SetNormalValue(value);
  125. }
  126. else if (_counter.Mode == 1)
  127. {
  128. SetRateValue(value);
  129. }
  130. else if(_counter.Mode==2)
  131. {
  132. SetTotalValue(value);
  133. }
  134. }
  135. /// <summary>
  136. /// 设置常规数值
  137. /// </summary>
  138. /// <param name="value"></param>
  139. private void SetNormalValue(int value)
  140. {
  141. if (!string.IsNullOrEmpty(_counter.Scaling))
  142. {
  143. var result = ScalingManager.Instance.CalculateValueByTwincatVariable($"{_counter.Name}.{COUNTER_VALUE}", value);
  144. if (result.Item1)
  145. {
  146. _value = result.Item2;
  147. }
  148. else
  149. {
  150. _value = value;
  151. }
  152. }
  153. else
  154. {
  155. _value = value;
  156. }
  157. }
  158. /// <summary>
  159. /// 设置比例数值
  160. /// </summary>
  161. /// <param name="value"></param>
  162. private void SetRateValue(int value)
  163. {
  164. _lastTime = DateTime.Now;
  165. double scaledValue = 0.0;
  166. double currentCounts = 0.0;
  167. double tDelta = ElapsedTime();
  168. double currentCounter = _value;
  169. if(value==0)
  170. {
  171. _value = 0;
  172. _previousCounts = 0;
  173. return;
  174. }
  175. if (_previousCounts == 0)
  176. {
  177. _previousCounts = value;
  178. _value = 0;
  179. StartTimer();
  180. return;
  181. }
  182. if (tDelta*1000>_counter.Period)
  183. {
  184. if (value < _previousCounts)
  185. currentCounts = (MAX_COUNTS - _previousCounts) + value;
  186. else
  187. currentCounts = value - _previousCounts;
  188. if (!string.IsNullOrEmpty(_counter.Scaling))
  189. {
  190. var result = ScalingManager.Instance.CalculateValueByTwincatVariable($"{_counter.Name}.{COUNTER_VALUE}", (currentCounts / tDelta));
  191. if (result.Item1)
  192. {
  193. double rate = result.Item2;
  194. if(first||rate!=scaledValue)
  195. {
  196. first = false;
  197. scaledValue = rate;
  198. }
  199. }
  200. else
  201. {
  202. scaledValue=currentCounter/tDelta;
  203. }
  204. }
  205. else
  206. {
  207. scaledValue = currentCounter / tDelta;
  208. }
  209. _previousCounts = value;
  210. StartTimer();
  211. }
  212. else
  213. {
  214. scaledValue = currentCounter;
  215. }
  216. _value = scaledValue;
  217. }
  218. /// <summary>
  219. /// 设置统计数值
  220. /// </summary>
  221. /// <param name="value"></param>
  222. private void SetTotalValue(int value)
  223. {
  224. double scaledValue = this._value;
  225. double deltaValue;
  226. if (!_resetCounter && !first)
  227. {
  228. int deltaCount = unchecked(value - _previousCounts);
  229. var result = ScalingManager.Instance.CalculateValueByTwincatVariable($"{_counter.Name}.{COUNTER_VALUE}", deltaCount);
  230. if (result.Item1)
  231. {
  232. deltaValue= result.Item2;
  233. }
  234. else
  235. {
  236. deltaValue = deltaCount;
  237. }
  238. }
  239. else
  240. {
  241. _resetCounter = false;
  242. first = false;
  243. deltaValue = 0.0;
  244. }
  245. _previousCounts = value;
  246. scaledValue += deltaValue;
  247. _value = scaledValue;
  248. }
  249. /// <summary>
  250. /// 获取数值
  251. /// </summary>
  252. /// <returns></returns>
  253. public double GetValue()
  254. {
  255. if(_counter.Mode==1)
  256. {
  257. if (DateTime.Now.Subtract(_lastTime).TotalMilliseconds > _counter.Period)
  258. {
  259. _value = 0;
  260. }
  261. }
  262. return _value;
  263. }
  264. /// <summary>
  265. /// 启动计时
  266. /// </summary>
  267. private void StartTimer()
  268. {
  269. _startTime = DateTime.Now;
  270. _elapsedTime = TimeSpan.Zero;
  271. }
  272. /// <summary>
  273. /// 计算时长
  274. /// </summary>
  275. /// <returns></returns>
  276. private double ElapsedTime()
  277. {
  278. _elapsedTime = DateTime.Now - _startTime;
  279. return _elapsedTime.TotalSeconds;
  280. }
  281. }
  282. }