導航:首頁 > 源碼編譯 > pid演算法軟體

pid演算法軟體

發布時間:2023-06-19 13:58:03

1. 西門子plc300如何調用pid演算法

轉個-----------
西門子網站有文檔專門說明pid軟體模塊的使用,可是真正要用起來還是有點混亂,參數太多,不知道取捨了,呵呵。其實用plcsim簡單測試下還是可以做到心中有數,到了現場調試不用慌了。

一、在ob35裡面插入FB41,方框頂上會有紅字,輸入一個類似「DB120」的,系統會問你要不要生成這個Db,yes就可以
二、大部分參數不要填,默認就行,下面是常用參數,用變數連接:

1、MAN_ON:用一個bool量,如m0.0,為true則手動,為false則自動;
2、cycle:T#100MS,這個值與ob35默認的100ms一致;
3、SP_INT:MD2,是hmi發下來的設定值,0-100.0的范圍,real型;
4、PV_IN:md6,實際測量值,比如壓力,要從piw×××轉換為0-100.0的量程;
5、MAN:MD10,op值,也就是手動狀態下的閥門輸出,real型,0-100.0的范圍;
6、GAIN:md14,Pid的P啊,默認寫1-2吧(系統默認是2),調試的時候再改
7、TI:MW20,pid的i啊.默認寫T#30S吧,調試的時候改;
8、DEAD_W:md22,死區,就是sp和pv的偏差死區,0-100.0的范圍,默認0,調試的時候改;
輸出:
9、LMN:MD26,0-100。0,最終再用fc106轉換為word型move到pqw×××,如果pid運算結果不再有工藝條件其他限制可以用LMN_PER更簡單就不用fc106了。
三、用plcsim模擬
1、手動
man_on=true,看輸出是否等於man;
2、自動
man_on=false,調整pv或者sp,使得有偏差大於死區,看輸出變化,這里的模擬只能說明pid工作了,不能測試實際調節效果啊。
3、如果需要反作用,有三種方法:
a、pv和sp顛倒輸入
b、p值用負的
c、輸出用100減

2. 普通PID控制性能指標不好時,如何改善PID演算法

1.可以直接套用PID公式,無論增量還是絕對的。PID演算法是根據誤差來控制的演算法,不依賴系統的模型,故不用算系統的傳遞函數。有的書提到傳遞函數,一般是用於理論建模模擬,從而直接用Matlab一類的模擬軟體進行PID參數調試。得到的參數可以為實際應用提供一定參考價值。
2.PID參數整定有一套原則。首先要了解各個參數的作用。具體的整定方法,隨便找本自控原理的書都會提到,我不太記得了,大致是有一個倍數關系。但實際操作,一般不會是用這個數,是需要根據系統的反應,改變各個參數來試的。盡信書不如無書啊~
另外,不同系統的參數肯定不一樣。就算同一個系統,稍微有一些改變,可能最好的那組參數就會變化。因此衍生了很多先進PID演算法,如神經PID、專家PID、模糊PID等等。

3. 求基於單片機溫控的PID演算法程序,謝謝啊!!!!

//溫控PID程序
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#include<string.h>
struct PID {
unsigned int SetPoint; // 設定目標 Desired Value
unsigned int Proportion; // 比例常數 Proportional Const
unsigned int Integral; // 積分常數 Integral Const
unsigned int Derivative; // 微分常數 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
};
struct PID spid; // PID Control Structure
unsigned int rout; // PID Response (Output)
unsigned int rin; // PID Feedback (Input)
sbit data1=P1^0;
sbit clk=P1^1;
sbit plus=P2^0;
sbit subs=P2^1;
sbit stop=P2^2;
sbit output=P3^4;
sbit DQ=P3^3;
unsigned char flag,flag_1=0;
unsigned char high_time,low_time,count=0;//占空比調節參數
unsigned char set_temper=35;
unsigned char temper;
unsigned char i;
unsigned char j=0;
unsigned int s;
/***********************************************************
延時子程序,延時時間以12M晶振為准,延時時間為30us×time
***********************************************************/
void delay(unsigned char time)
{
unsigned char m,n;
for(n=0;n<time;n++)
for(m=0;m<2;m++){}
}
/***********************************************************
寫一位數據子程序
***********************************************************/
void write_bit(unsigned char bitval)
{
EA=0;
DQ=0; /*拉低DQ以開始一個寫時序*/
if(bitval==1)
{
_nop_();
DQ=1; /*如要寫1,則將匯流排置高*/
}
delay(5); /*延時90us供DA18B20采樣*/
DQ=1; /*釋放DQ匯流排*/
_nop_();
_nop_();
EA=1;
}
/***********************************************************
寫一位元組數據子程序
***********************************************************/
void write_byte(unsigned char val)
{
unsigned char i;
unsigned char temp;
EA=0;
TR0=0;
for(i=0;i<8;i++) /*寫一位元組數據,一次寫一位*/
{
temp=val>>i; /*移位操作,將本次要寫的位移到最低位*/
temp=temp&1;
write_bit(temp); /*向匯流排寫該位*/
}
delay(7); /*延時120us後*/
// TR0=1;
EA=1;
}
/***********************************************************
讀一位數據子程序
***********************************************************/
unsigned char read_bit()
{
unsigned char i,value_bit;
EA=0;
DQ=0; /*拉低DQ,開始讀時序*/
_nop_();
_nop_();
DQ=1; /*釋放匯流排*/
for(i=0;i<2;i++){}
value_bit=DQ;
EA=1;
return(value_bit);
}
/***********************************************************
讀一位元組數據子程序
***********************************************************/
unsigned char read_byte()
{
unsigned char i,value=0;
EA=0;
for(i=0;i<8;i++)
{
if(read_bit()) /*讀一位元組數據,一個時序中讀一次,並作移位處理*/
value|=0x01<<i;
delay(4); /*延時80us以完成此次都時序,之後再讀下一數據*/
}
EA=1;
return(value);
}
/***********************************************************
復位子程序
***********************************************************/
unsigned char reset()
{
unsigned char presence;
EA=0;
DQ=0; /*拉低DQ匯流排開始復位*/
delay(30); /*保持低電平480us*/
DQ=1; /*釋放匯流排*/
delay(3);
presence=DQ; /*獲取應答信號*/
delay(28); /*延時以完成整個時序*/
EA=1;
return(presence); /*返回應答信號,有晶元應答返回0,無晶元則返回1*/
}
/***********************************************************
獲取溫度子程序
***********************************************************/
void get_temper()
{
unsigned char i,j;
do
{
i=reset(); /*復位*/
}while(i!=0); /*1為無反饋信號*/
i=0xcc; /*發送設備定位命令*/
write_byte(i);
i=0x44; /*發送開始轉換命令*/
write_byte(i);
delay(180); /*延時*/
do
{
i=reset(); /*復位*/
}while(i!=0);
i=0xcc; /*設備定位*/
write_byte(i);
i=0xbe; /*讀出緩沖區內容*/
write_byte(i);
j=read_byte();
i=read_byte();
i=(i<<4)&0x7f;
s=(unsigned int)(j&0x0f);
s=(s*100)/16;
j=j>>4;
temper=i|j; /*獲取的溫度放在temper中*/
}
/*====================================================================================================
Initialize PID Structure
=====================================================================================================*/
void PIDInit (struct PID *pp)
{
memset ( pp,0,sizeof(struct PID));
}
/*====================================================================================================
PID計算部分
=====================================================================================================*/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
unsigned int dError,Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 積分
dError = pp->LastError - pp->PrevError; // 當前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例項
+ pp->Integral * pp->SumEror // 積分項
+ pp->Derivative * dError); // 微分項
}
/***********************************************************
溫度比較處理子程序
***********************************************************/
compare_temper()
{
unsigned char i;
if(set_temper>temper)
{
if(set_temper-temper>1)
{
high_time=100;
low_time=0;
}
else
{
for(i=0;i<10;i++)
{ get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<=100)
high_time=(unsigned char)(rout/800);
else
high_time=100;
low_time= (100-high_time);
}
}
else if(set_temper<=temper)
{
if(temper-set_temper>0)
{
high_time=0;
low_time=100;
}
else
{
for(i=0;i<10;i++)
{ get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<100)
high_time=(unsigned char)(rout/10000);
else
high_time=0;
low_time= (100-high_time);
}
}
// else
// {}
}
/*****************************************************
T0中斷服務子程序,用於控制電平的翻轉 ,40us*100=4ms周期
******************************************************/
void serve_T0() interrupt 1 using 1
{
if(++count<=(high_time))
output=1;
else if(count<=100)
{
output=0;
}
else
count=0;
TH0=0x2f;
TL0=0xe0;
}
/*****************************************************
串列口中斷服務程序,用於上位機通訊
******************************************************/
void serve_sio() interrupt 4 using 2
{
/* EA=0;
RI=0;
i=SBUF;
if(i==2)
{
while(RI==0){}
RI=0;
set_temper=SBUF;
SBUF=0x02;
while(TI==0){}
TI=0;
}
else if(i==3)
{
TI=0;
SBUF=temper;
while(TI==0){}
TI=0;
}
EA=1; */
}
void disp_1(unsigned char disp_num1[6])
{
unsigned char n,a,m;
for(n=0;n<6;n++)
{
// k=disp_num1[n];
for(a=0;a<8;a++)
{
clk=0;
m=(disp_num1[n]&1);
disp_num1[n]=disp_num1[n]>>1;
if(m==1)
data1=1;
else
data1=0;
_nop_();
clk=1;
_nop_();
}
}

以前收藏的一個程序,與你分享一下,希望對你有用、

4. 一文搞懂PID控制演算法

PID演算法是工業應用中最廣泛演算法之一,在閉環系統的控制中,可自動對控制系統進行准確且迅速的校正。PID演算法已經有100多年歷史,在四軸飛行器,平衡小車、汽車定速巡航、溫度控制器等場景均有應用。

之前做過循跡車項目,簡單循跡搖擺幅度較大,效果如下所示:

PID演算法優化後,循跡穩定性能較大提升,效果如下所示:

PID演算法:就是「比例(proportional)、積分(integral)、微分(derivative)」,是一種常見的「保持穩定」控制演算法。

常規的模擬PID控制系統原理框圖如下所示:

因此可以得出e(t)和u(t)的關系:

其中:

Kp:比例增益,是調適參數;

Ki:積分增益,也是調適參數;

Kd:微分增益,也是調適參數;

e:誤差=設定值(SP)- 回授值(PV);

t:目前時間。

數學公式可能比較枯燥,通過以下例子,了解PID演算法的應用。

例如,使用控制器使一鍋水的溫度保持在50℃,小於50℃就讓它加熱,大於50度就斷電不就行了?

沒錯,在要求不高的情況下,確實可以這么干,如果換一種說法,你就知道問題出在哪裡了。

如果控制對象是一輛汽車呢?要是希望汽車的車速保持在50km/h不動,這種方法就存在問題了。

設想一下,假如汽車的定速巡航電腦在某一時間測到車速是45km/h,它立刻命令發動機:加速!

結果,發動機那邊突然來了個100%全油門,嗡的一下汽車急加速到了60km/h,這時電腦又發出命令:剎車!結果乘客吐......

所以,在大多數場合中,用「開關量」來控制一個物理量就顯得比較簡單粗暴了,有時候是無法保持穩定的,因為單片機、感測器不是無限快的,採集、控制需要時間。

而且,控制對象具有慣性,比如將熱水控制器拔掉,它的「余熱」即熱慣性可能還會使水溫繼續升高一小會。

此時就需要使用PID控制演算法了。

接著咱再來詳細了解PID控制演算法的三個最基本的參數:Kp比例增益、Ki積分增益、Kd微分增益。

1、Kp比例增益

Kp比例控制考慮當前誤差,誤差值和一個正值的常數Kp(表示比例)相乘。需要控制的量,比如水溫,有它現在的 當前值 ,也有我們期望的 目標值 。

當兩者差距不大時,就讓加熱器「輕輕地」加熱一下。

要是因為某些原因,溫度降低了很多,就讓加熱器「稍稍用力」加熱一下。

要是當前溫度比目標溫度低得多,就讓加熱器「開足馬力」加熱,盡快讓水溫到達目標附近。

這就是P的作用,跟開關控制方法相比,是不是「溫文爾雅」了很多。

實際寫程序時,就讓偏差(目標減去當前)與調節裝置的「調節力度」,建立一個一次函數的關系,就可以實現最基本的「比例」控制了~

Kp越大,調節作用越激進,Kp調小會讓調節作用更保守。

若你正在製作一個平衡車,有了P的作用,你會發現,平衡車在平衡角度附近來回「狂抖」,比較難穩住。

2、Kd微分增益

Kd微分控制考慮將來誤差,計算誤差的一階導,並和一個正值的常數Kd相乘。

有了P的作用,不難發現,只有P好像不能讓平衡車站起來,水溫也控製得晃晃悠悠,好像整個系統不是特別穩定,總是在「抖動」。

設想有一個彈簧:現在在平衡位置上,拉它一下,然後鬆手,這時它會震盪起來,因為阻力很小,它可能會震盪很長時間,才會重新停在平衡位置。

請想像一下:要是把上圖所示的系統浸沒在水裡,同樣拉它一下 :這種情況下,重新停在平衡位置的時間就短得多。

此時需要一個控製作用,讓被控制的物理量的「變化速度」趨於0,即類似於「阻尼」的作用。

因為,當比較接近目標時,P的控製作用就比較小了,越接近目標,P的作用越溫柔,有很多內在的或者外部的因素,使控制量發生小范圍的擺動。

D的作用就是讓物理量的速度趨於0,只要什麼時候,這個量具有了速度,D就向相反的方向用力,盡力剎住這個變化。

Kd參數越大,向速度相反方向剎車的力道就越強,如果是平衡小車,加上P和D兩種控製作用,如果參數調節合適,它應該可以站起來了。

3、Ki積分增益

Ki積分控制考慮過去誤差,將誤差值過去一段時間和(誤差和)乘以一個正值的常數Ki。

還是以熱水為例,假如有個人把加熱裝置帶到了非常冷的地方,開始燒水了,需要燒到50℃。

在P的作用下,水溫慢慢升高,直到升高到45℃時,他發現了一個不好的事情:天氣太冷,水散熱的速度,和P控制的加熱的速度相等了。

這可怎麼辦?

P兄這樣想:我和目標已經很近了,只需要輕輕加熱就可以了。

D兄這樣想:加熱和散熱相等,溫度沒有波動,我好像不用調整什麼。

於是,水溫永遠地停留在45℃,永遠到不了50℃。

根據常識,我們知道,應該進一步增加加熱的功率,可是增加多少該如何計算呢?

前輩科學家們想到的方法是真的巧妙,設置一個積分量,只要偏差存在,就不斷地對偏差進行積分(累加),並反應在調節力度上。

這樣一來,即使45℃和50℃相差不是太大,但是隨著時間的推移,只要沒達到目標溫度,這個積分量就不斷增加,系統就會慢慢意識到:還沒有到達目標溫度,該增加功率啦!

到了目標溫度後,假設溫度沒有波動,積分值就不會再變動,這時,加熱功率仍然等於散熱功率,但是,溫度是穩穩的50℃。

Ki的值越大,積分時乘的系數就越大,積分效果越明顯,所以,I的作用就是,減小靜態情況下的誤差,讓受控物理量盡可能接近目標值。

I在使用時還有個問題:需要設定積分限制,防止在剛開始加熱時,就把積分量積得太大,難以控制。

PID演算法的參數調試是指通過調整控制參數(比例增益、積分增益/時間、微分增益/時間) 讓系統達到最佳的控制效果 。

調試中穩定性(不會有發散性的震盪)是首要條件,此外,不同系統有不同的行為,不同的應用其需求也不同,而且這些需求還可能會互相沖突。

PID演算法只有三個參數,在原理上容易說明,但PID演算法參數調試是一個困難的工作,因為要符合一些特別的判據,而且PID控制有其限制存在。

1、穩定性

若PID演算法控制器的參數未挑選妥當,其控制器輸出可能是不穩定的,也就是其輸出發散,過程中可能有震盪,也可能沒有震盪,且其輸出只受飽和或是機械損壞等原因所限制。不穩定一般是因為過大增益造成,特別是針對延遲時間很長的系統。

2、最佳性能

PID控制器的最佳性能可能和針對過程變化或是設定值變化有關,也會隨應用而不同。

兩個基本的需求是調整能力(regulation,干擾拒絕,使系統維持在設定值)及命令追隨 (設定值變化下,控制器輸出追隨設定值的反應速度)。有關命令追隨的一些判據包括有上升時間及整定時間。有些應用可能因為安全考量,不允許輸出超過設定值,也有些應用要求在到達設定值過程中的能量可以最小化。

3、各調試方法對比

4、調整PID參數對系統的影響

5. 什麼是「PID演算法」

「PID演算法」在過程式控制制中,按偏差的比例(P)、積分(I)和微分(D)進行控制的PID控制器(亦稱PID調節器)是應用最為廣泛的一種自動控制器。

它具有原理簡單,易於實現,適用面廣,控制參數相互獨立,參數的選定比較簡單等優點;而且在理論上可以證明,對於過程式控制制的典型對象──「一階滯後+純滯後」與「二階滯後+純滯後」的控制對象,PID控制器是一種最優控制。

PID調節規律是連續系統動態品質校正的一種有效方法,它的參數整定方式簡便,結構改變靈活(PI、PD、…)。

控制點包含三種比較簡單的PID控制演算法,分別是:增量式演算法,位置式演算法,微分先行。 這三種PID演算法雖然簡單,但各有特點,基本上能滿足一般控制的大多數要求。

PID增量式演算法

離散化公式:

△u(k)= u(k)- u(k-1)

△u(k)=Kp[e(k)-e(k-1)]+Kie(k)+Kd[e(k)-2e(k-1)+e(k-2)]

進一步可以改寫成

△u(k)=Ae(k)-Be(k-1)+Ce(k-2)。

閱讀全文

與pid演算法軟體相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163