using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OrpaonEMS.Core.Model { /// /// 追踪指令值的模型 /// public class TranceCmdValue { /// /// 实例化函数 /// /// public TranceCmdValue(double changeThreshold) { ChangeThreshold = changeThreshold; } /// /// 变化的阀值 /// public double ChangeThreshold { get; set; } /// /// 事件 /// public event EventHandler CmdValueChanged; private double _CmdValue; /// /// 指令值 /// 可实时赋值 /// public double CmdValue { get { return _CmdValue; } set { //发送0,代表是待机,此时不需要看变化了,防止上一个值在0附近,没有触发变化,还是输出一个靠近0的值出去 if (value == 0 && value != _CmdValue)//value != _CmdValue 防止一直0值导致不停是Invoke事件 { _CmdValue = value; //超过变化的阀值,可以触发动作 BeginInvoke 换 Invoke 可能导致问题 CmdValueChanged.Invoke(this, 0); return; } if (value != _CmdValue && GetChange(value, _CmdValue)) { _CmdValue = value; //超过变化的阀值,可以触发动作 CmdValueChanged.Invoke(this, value); } } } /// /// 判断是否超过某个阀值数据 /// /// /// /// private bool GetChange(double newValue, double oldValue) { if (Math.Abs(newValue - oldValue) >= ChangeThreshold) { return true; } return false; } } }