下面是壹個C#版本的PID控制器,我用來控制網絡爬蟲的爬行速度。妳可以很容易地把它翻譯成C語言。
使用分兩步:第壹步,初始化。二、測量控制系統的數值(如速度、溫度等。)並將其代入PID控制器以產生新的控制因子。
初始化:其中SpeedSetting是妳要設置的抓取速度,如果是妳的控制系統,就是妳的系統值。IntervalTime是控制因素,我用它作為讀取壹個網頁後的等待時間來控制爬蟲速度。如果是妳的系統,那就是通過它的變化來控制系統的價值。初始化代碼:
PID _ Con = new PID controller(speed setting,IntervalTime,-0.1f,-0.05f,0.0f);
PID _ Con . LimitLow = 0.2f
PID _ Con . limit high = 100.0 f;
定時測量:其中value是測量值,可以使速度、溫度等。,或由您的控制系統控制的數量。
float value =(float)(URL count-LastUrlCount);//計算當前時間間隔內抓取的網頁數量。
IntervalTime = PID_Con .觀測值(值);//將測量值(或觀測值)帶入PID控制器,獲得新的控制因子值。
LastUrlCount = UrlCount
在妳的系統裏,可以類比實現。
公共類PIDControler
{
公共浮動限制流量;//上限
公共浮動上限高;//下限
私人浮動Kp;//差異系數
私人浮動Ki;//積分系數
私人浮動Kd;//微分系數
私有float ControlParam//控制因素
私有浮點設置值;//設置值
私有浮點LastDiff//最後壹個差異
私有浮點LastSumDiff//最後差值的積分
公共PIDControler(浮點集合、浮點初始化、浮點p、浮點I、浮點d)
{
LimitLow = 0.0flimit high = 1000.0 f;
SettingValue = setsControlParam = init
KP = p;ki = I;KD = d;
LastDiff = 0.0fLastSumDiff = 0.0f
}
公共浮動觀測(浮動值)
{
float diff=(設置值-值);
if(math . ABS(diff/setting value)& lt;0.01)//控制差分積分下限
LastSumDiff = 0.0f
else if(math . ABS(LastSumDiff)& gt;SettingValue*2)//控制差分積分的上限。
LastSumDiff/= 2.0f;
其他
LastSumDiff+= diff;//差分積分
control param+= Kp * diff+Ki * LastSumDiff+Kd *(diff-last diff);//計算控制因子
if(control param & lt;limit low)control param = limit low;//限制控制因子的上限
if(control param & gt;limit high)control param = limit high;//限制控制因子的下限
LastDiff = diff
返回ControlParam//返回控制因子
}
}