using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.Common.Algorithm { public class PdiAlgorithm : Singleton { #region 内部变量 /// /// 差额系数 /// private double _kp; /// /// 积分系数 /// private double _ki; /// /// 微分系数 /// private double _kd; /// /// 上一次偏差 /// private double _lastBias; /// /// 积分值 /// private double _integral; /// /// 目标压力 /// private double _targetPressure; /// /// 最大偏差 /// private double _maxBias = 0; #endregion /// /// 计算速度 /// /// /// /// public short CalculateSpeed(double kp,double ki,double kd,double targetPressure,double pressure,short speed,double targetLimit) { _kp = kp; _ki = ki; _kd = kd; _targetPressure = targetPressure; _maxBias = 0.5 * targetPressure; double index = 0; double bias=_targetPressure - pressure; if(Math.Abs(bias)<=targetLimit) { return speed; } _integral += bias; if(Math.Abs(bias)>_maxBias) { index = 0; } else if(Math.Abs(bias)<0.9*_maxBias) { index = 1; _integral += bias; } else { index=(_maxBias-Math.Abs(bias))/(0.9*_maxBias); _integral += bias; } double pressureBias=_kp*bias+index*_ki*_integral+_kd*(bias-_lastBias); //根据伯努利一般形态P+1/2V^2=C double speedBias =Math.Round(Math.Sqrt(2 * pressureBias),2); _lastBias=bias; short finalSpeed= (short)Math.Round(speed+pressureBias,0); int maxPumpSpeed = SC.GetValue("Prewet.MaxPumpSpeed"); int minPumpSpeed = SC.GetValue("Prewet.MinPumpSpeed"); if (finalSpeed >= maxPumpSpeed) { finalSpeed = (short)maxPumpSpeed; } else if(finalSpeed<=minPumpSpeed) { finalSpeed = (short)minPumpSpeed; } return finalSpeed; } } }