當前位置:首頁 » 編程軟體 » pid控制與編程

pid控制與編程

發布時間: 2023-05-14 09:34:26

1. C語言編程,怎麼計算PID控制

Step 7寫的PID控制的FC模塊。帶"_IN"與帶"_OUT"的變數,如果前綴是一樣的,要求連接同一個變數。

FUNCTION FC1 : VOID

VAR_INPUT
Run:BOOL; //True-運行,False-停止
Auto:BOOL; //True-自動,False-手動
ISW:BOOL; //True-積分有效,False-積分無效
DSW:BOOL; //True-微分有效,False-微分無效
SetMV:REAL; //手動時的開度設定值
SVSW:REAL; //當設定值低於SVSW時,開度為零
PV:REAL; //測量值
SV:REAL; //設定值
DeadBand:REAL; //死區大小
PBW:REAL; //比例帶大小
IW:REAL; //積分帶大小
DW:REAL; //微分帶大小
dErr_IN:REAL; //誤差累積
LastPV_IN:REAL; //上一控制周期的測量值
END_VAR

VAR_OUTPUT
MV:REAL; //輸出開度
dErr_OUT:REAL; //誤差累積
LastPV_OUT:REAL;//上一控制周期的測量值
END_VAR

VAR
Err:REAL; //誤差
dErr:REAL; //誤差累積
PBH:REAL; //比例帶上限
PBL:REAL; //比例帶下限
PVC:REAL; //測量值在一個控制周期內的變化率,即測量值變化速率
P:REAL; //比例項
I:REAL; //積分項
D:REAL; //微分項
END_VAR

IF Run=1 THEN
IF Auto=1 THEN
IF SV>=SVSW THEN
Err:=SV-PV;
PBH:=SV+PBW;
PBL:=SV-PBW;
IF PV<PBL THEN
MV:=1;
ELSIF PV>PBH THEN
MV:=0;
ELSE
P:=(PBH-PV)/(PBH-PBL); //計算比例項
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下為積分項的計算//////////////////////////////////////////////////////////////
IF ISW=1 THEN
dErr:=dErr_IN;
IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN
IF (dErr+Err)<(0-IW) THEN
dErr:=0-IW;
ELSIF (dErr+Err)>IW THEN
dErr:=IW;
ELSE
dErr:=dErr+Err;
END_IF;
END_IF;
I:=dErr/IW;
dErr_OUT:=dErr;
ELSE
I:=0;
END_IF;
/////////////////////////////////////////////以上為積分項的計算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下為微分項的計算//////////////////////////////////////////////////////////////
IF DSW=1 THEN
PVC:=LastPV_IN-PV;
D:=PVC/DW;
LastPV_OUT:=PV;
ELSE
D:=0;
END_IF;
/////////////////////////////////////////////以上為微分項的計算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IF (P+I+D)>1 THEN
MV:=1;
ELSIF (P+I+D)<0 THEN
MV:=0;
ELSE
MV:=P+I+D;
END_IF;
END_IF;
ELSE
MV:=0;
END_IF;
ELSE
MV:=SetMV;
END_IF;
ELSE
MV:=0;
END_IF;

END_FUNCTION

進行整定時先進行P調節,使I和D作用無效,觀察溫度變化曲線,若變化曲線多次出現波形則應該放大比例(P)參數,若變化曲線非常平緩,則應該縮小比例(P)參數。比例(P)參數設定好後,設定積分(I)參數,積分(I)正好與P參數相反,曲線平緩則需要放大積分(I),出現多次波形則需要縮小積分(I)。比例(P)和積分(I)都設定好以後設定微分(D)參數,微分(D)參數與比例(P)參數的設定方法是一樣的。

當初寫這段程序的就是為了使用調功器來控制爐子的溫度的,已經在我單位的調功器上運行成功了,還有就是我單位的調功器沒有使用微分(D),只是用了比例(P)和積分(I)。

2. pid控制的C語言編程

#include<unistd.h>
#include<stdio.h>
int main(int argc,int **argv)
{
int pid=fork();
if(pid==-1)
{
printf("error");
}
else if(pid==0)
{
printf("This is the child process!\n");
}
else
{
printf("This is the parent process! child process id=%d\n",pid);
}
return 0;
}
首先為什麼這段代碼gcc編譯不了,只能用g++編譯,gcc編譯顯示結果如下
Undefined first referenced
symbol in file
__gxx_personality_v0 /var/tmp//ccuHN8IS.o
ld: fatal: Symbol referencing errors. No output written to t5
collect2: ld returned 1 exit status
其次,g++編譯後運行結果如下
This is the parent process! child process id=27406
This is the child process!

熱點內容
王者榮耀在哪裡顯示賬號密碼 發布:2025-07-12 16:36:42 瀏覽:896
打包sql資料庫 發布:2025-07-12 16:19:27 瀏覽:794
php日誌查看 發布:2025-07-12 16:12:10 瀏覽:212
ftp目錄映射為本地盤符 發布:2025-07-12 16:06:59 瀏覽:645
nas存儲百科 發布:2025-07-12 16:03:17 瀏覽:126
python的sort函數 發布:2025-07-12 15:53:21 瀏覽:50
ensp伺服器怎麼設置web根目錄 發布:2025-07-12 15:47:56 瀏覽:286
安卓怎麼設置二卡發信息 發布:2025-07-12 15:43:50 瀏覽:743
如何看到無線密碼 發布:2025-07-12 15:43:13 瀏覽:677
好網址可緩存 發布:2025-07-12 15:36:07 瀏覽:254