Siemens İle PID Kontrol

  • Konbuyu başlatan erenakc
  • Başlangıç tarihi

erenakc

Üye
Katılım
21 Kas 2006
Mesajlar
104
Puanları
0
Yaş
36
merhaba siemens s7-300 veya 400 ile pid controlu ile ilgili elinde program olan gonderirlerse sevinirim
 

torex

Üye
Katılım
22 Eki 2006
Mesajlar
369
Puanları
1
Yaş
43
Aşağıda yazdığım stl source kodları kopyalayıp simatic manager da oluşturduğunuz projede stl source kod. dosyası ekleyip oraya yapıştrın. Daha sonra Compile yaptığınızda Blocks altında FB1 oluşturulur. Bunu ladder diagramına çevirip işlemleri kontrol edebilirisniz. Ayrıca programın daha anlaşılır olabilmesi için Comment kısımlarına açıklama ekledim. Bu bloğu zamana bağlı kesmeli ( Cyclic Interrupt organizasyon bloğunda ) çağırıp parametreleri girebilirisniz. HW config den CPU özelliklerinden kesme frekansını ayarlamanız ferekir. OB1 den çağırmayın çalışmaz.
Bu bloğu çalıştırabilmek için vereceğiniz set değerine karşı sistemden proses değeri alabilmeniz gerekmektedir. veya giriş değerine karşılık bir değer veren filtre kullanılabilir.

PID bloğu yazarken kullanılan formulasyon aşağıda verilmiştir.

U(t)=Kc .( e(t) + 1/T1.ìe(t) + Td .de(t)/dt)



BLOK'A PARAMETRE YAZMA

İnput
SP(Integer) : İstediğimiz set-point
PV(Integer) : Proses değeri
Kc (Real) : Oransal katsayı
TI (Real) : Integral katsayı (zamanı)
TD(Real) : Türev katsayı (zamanı)
T (Real) : Örnekleme Zamanı

Output
U(İnteger) : Maniplatude value
Hata (Real): % hata değeri ( %SP/PV) Memory alanı gösterebilirsiniz örneğin MD10 oradan izleyin.




FUNCTION_BLOCK FB 1
TITLE =

VERSION : 0.1


VAR_INPUT
SP : INT ; //Set Deðeri
PV : INT ; //Proses Deðeri
Kc : REAL ; //Katsayý
TI : REAL ; //Integral Katsayýsý
TD : REAL ; //Türev Katsayýsý
T : REAL ; //Örnekleme Zamaný
END_VAR
VAR_OUTPUT
U : INT ;
HATA : REAL ;
END_VAR
VAR
I_1 : REAL ;
HATA_1 : REAL ;
END_VAR
VAR_TEMP
SP_DI : DINT ;
PV_DI : DINT ;
SP_R : REAL ;
PV_R : REAL ;
HATA_R : REAL ;
P : REAL ;
I : REAL ;
IE : REAL ;
DE : REAL ;
D : REAL ;
U_DI : DINT ;
U_R : REAL ;
TI_TAMAM : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =

A( ;
L #SP;
ITD ;
T #SP_DI;
SET ;
SAVE ;
CLR ;
A BR;
) ;
JNB _001;
L #SP_DI;
DTR ;
T #SP_R;
_001: NOP 0;
NETWORK
TITLE =

A( ;
L #PV;
ITD ;
T #PV_DI;
SET ;
SAVE ;
CLR ;
A BR;
) ;
JNB _002;
L #PV_DI;
DTR ;
T #PV_R;
_002: NOP 0;
NETWORK
TITLE =
//
//HATA=SP-PV
L #SP_R;
L #PV_R;
-R ;
T #HATA_R;
NOP 0;
NETWORK
TITLE =
//P=Kc*HATA
L #HATA_R;
L #Kc;
*R ;
T #P;
NOP 0;
NETWORK
TITLE =
//P>=27648
A( ;
L #P;
L 2.764800e+004;
>=R ;
) ;
JNB _003;
L 2.764800e+004;
T #P;
_003: NOP 0;
NETWORK
TITLE =
//P<=-27648
A( ;
L #P;
L -2.764800e+004;
<=R ;
) ;
JNB _004;
L -2.764800e+004;
T #P;
_004: NOP 0;
NETWORK
TITLE =
//IE=Kc*T TI=<0 &Yacute;SE INTEGRAL ÇALI&THORN;MAYACAK
A( ;
A( ;
L #TI;
L 0.000000e+000;
>R ;
) ;
JNB _005;
L #Kc;
L #T;
*R ;
T #IE;
AN OV;
SAVE ;
CLR ;
_005: A BR;
) ;
JNB _006;
L #IE;
L #HATA_R;
*R ;
T #IE;
AN OV;
SAVE ;
CLR ;
_006: A BR;
= #TI_TAMAM;
NETWORK
TITLE =
//IE=Kc*T/T1
A #TI_TAMAM;
JNB _007;
L #IE;
L #TI;
/R ;
T #IE;
_007: NOP 0;
NETWORK
TITLE =

A( ;
AN #TI_TAMAM;
JNB _008;
L 0.000000e+000;
T #I_1;
SET ;
SAVE ;
CLR ;
_008: A BR;
) ;
JNB _009;
L 0.000000e+000;
T #IE;
_009: NOP 0;
NETWORK
TITLE =
//I=I(k-1)+Kc*T/T1*HATA
L #IE;
L #I_1;
+R ;
T #I;
NOP 0;
NETWORK
TITLE =
//I>=27648
A( ;
L #I;
L 2.764800e+004;
>=R ;
) ;
JNB _00a;
L 2.764800e+004;
T #I;
_00a: NOP 0;
NETWORK
TITLE =
//I<=-27648
A( ;
L #I;
L -2.764800e+004;
<=R ;
) ;
JNB _00b;
L -2.764800e+004;
T #I;
_00b: NOP 0;
NETWORK
TITLE =

L #I;
T #I_1;
NOP 0;
NETWORK
TITLE =
//DE=(HATA-HATA_R)*Td
A( ;
L #HATA_R;
L #HATA_1;
-R ;
T #DE;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _00c;
L #DE;
L #TD;
*R ;
T #DE;
_00c: NOP 0;
NETWORK
TITLE =
//D=DE*Kc/T
A( ;
L #DE;
L #Kc;
*R ;
T #DE;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _00d;
L #DE;
L #T;
/R ;
T #D;
_00d: NOP 0;
NETWORK
TITLE =
//D>=27648
A( ;
L #D;
L 2.764800e+004;
>=R ;
) ;
JNB _00e;
L 2.764800e+004;
T #D;
_00e: NOP 0;
NETWORK
TITLE =
//D<=-27648
A( ;
L #D;
L -2.764800e+004;
<=R ;
) ;
JNB _00f;
L -2.764800e+004;
T #D;
_00f: NOP 0;
NETWORK
TITLE =

L #HATA_R;
T #HATA_1;
NOP 0;
NETWORK
TITLE =

A( ;
L #P;
L #I;
+R ;
T #U_R;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _010;
L #U_R;
L #D;
+R ;
T #U_R;
_010: NOP 0;
NETWORK
TITLE =
//P>=27648 ÇIKI&THORN; DE&ETH;ER&Yacute; REEL
A( ;
L #U_R;
L 2.764800e+004;
>=R ;
) ;
JNB _011;
L 2.764800e+004;
T #U_R;
_011: NOP 0;
NETWORK
TITLE =
//P<=-27648 ÇIKI&THORN; DE&ETH;ER&Yacute; REEL
A( ;
L #U_R;
L -2.764800e+004;
<=R ;
) ;
JNB _012;
L -2.764800e+004;
T #U_R;
_012: NOP 0;
NETWORK
TITLE =
//% HATA/SP
A( ;
L #HATA_R;
L #SP_R;
/R ;
T #HATA_R;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _013;
L #HATA_R;
L 1.000000e+002;
*R ;
T #HATA;
_013: NOP 0;
NETWORK
TITLE =

A( ;
L #U_R;
RND ;
T #U_DI;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _014;
L #U_DI;
T #U;
SET ;
SAVE ;
CLR ;
_014: A BR;
SAVE ;
END_FUNCTION_BLOCK
 
Katılım
12 Nis 2007
Mesajlar
422
Puanları
1
Yukarıdaki source u compile etmedim.ama gereksiz bazı çevrimler var.Bu da anlaşılmasını güç kılabilir.Çok basit bir şekilde LAD editör içinde STANDARD LIBRARY >PID CONTROL BLOCKS >FB41 i kullanabilirsin.Ama bu bloğu ihtiyacına göre OB 30-38 blokları içinde kullanmanı tavsiye ederim .Böylelikle değişken scan cycle time lardan etkilenmeyen bir PID sağlayabilirsiniz.
 

torex

Üye
Katılım
22 Eki 2006
Mesajlar
369
Puanları
1
Yaş
43
PID işlemleri zamana bağlı kesme atan OB lerde yazılmalıdır. Bu Siemenin PId boğu içinde geçerli. Çünkü bu blok inputunda CYCLE değişkeni giriliyor. Bu CYCLE zaman periyotlarında prosesten örnekleme verileri alınarak PID formuluyle kontrol işaretinin İntegral ve türev değerleri hesaplanır.
Siemensin PID bloğnda 34 değişken var.Bunların çogu özel uygulamalar için kullanılıyor. Fakat bu değişkenlerin ne işe yaradığını bilmeden bu bloğu kullanmak zor oluyor. Aşağıda bu bloğuda kullanabilmeniz için değişkenlerin ne için kullanıldığını verdim. Ayrıca Siemens PID bloğu uygulamanızda kullanmasanız bile bu ekstra özellikleri nedeniyle FB ve DB plc hafızanızda fazla yer kaplayacaktır. Buda bir dezavantajdır.

COM_RST : BOOL ; //TÜMÜYLE BASTAN ALMA
MAN_ON : BOOL := TRUE; //ELLE KUMANDA ETME
PVPER_ON : BOOL ; //ANALOG GIRIS BIRIMINDEN SUREC DEGERI OKU
P_SEL : BOOL := TRUE; //ORANSAL SEÇ
I_SEL : BOOL := TRUE; //INTEGRAL SEÇ
INT_HOLD : BOOL ; //INTEGRAL DEGERINI TUT
I_ITL_ON : BOOL ; //INTEGRAL ON DEGERINI YUKLE
D_SEL : BOOL ; //TÜREVI SEÇ
CYCLE : TIME := T#1S; //ÇEVRIM ZAMANI
SP_INT : REAL ; //ISTENEN DEGER
PV_IN : REAL ; //SÜREÇ DEGERI
PV_PER : WORD ; //ANALOG GIRIS BIRIMINDEN SUREC DEGERI
MAN : REAL ; //ELLE KUMANDA DEGERI
GAIN : REAL := 2.000000e+000; //KAZANC
TI : TIME := T#20S; //INTEGRAL ZAMAN SABITI
TD : TIME := T#10S; //TÜREV ZAMAN SABITI
TM_LAG : TIME := T#2S; //GECIKTIRME DEGERI
DEADB_W : REAL ; //ÖLÜ BAND DEGERI
LMN_HLM : REAL := 1.000000e+002; //KONTROL ISARETI UST DEGERI
LMN_LLM : REAL ; //KONTROL ISARETI ALT SINIR DEGERI
PV_FAC : REAL := 1.000000e+000; //SÜREÇ DEGERI ÇARPANI
PV_OFF : REAL ; //SUREC DEGERI ILK DEGERI
LMN_FAC : REAL := 1.000000e+000; //KONTROL ISARETI CARPANI
LMN_OFF : REAL ; //KONTROL ISARETI ILK DEGERI
I_ITLVAL : REAL ; //INTEGRAL ON DEGERI
DISV : REAL ; //ILERI BESLEME GIRIS DEGERI
LMN : REAL ; //KONTROL ISARETI YUZDELIK DEGERI
LMN_PER : WORD ; //ANALOG BIRIM ICIN KONTROL ISARETI DEGERI TAMSAYI
QLMN_HLM : BOOL ; //KONTROL ISARETI UST DEGERI ASTI ISARETI
QLMN_LLM : BOOL ; //KONTROL ISARETI ALT DEGERIN ALTINDA ISARETI
LMN_P : REAL ; //KONTROL ISARETI ORANSAL DEGERI
LMN_I : REAL ; //KONTROL ISARETI INTEGRAL DEGERI
LMN_D : REAL ; //KONTROL ISARETI TUREV DEGERI
PV : REAL ; //SUREC DEGERI
ER : REAL ; //HATA DEGERI
 

torex

Üye
Katılım
22 Eki 2006
Mesajlar
369
Puanları
1
Yaş
43
Bu konuda siemensin eğitimine gitmiştim eğer yardımcı olabileceğim birşey olursa bu beni sevindirir. Herkese işlerinde başarılar diliyorum.
 

muzun

Üye
Katılım
17 Şub 2007
Mesajlar
10
Puanları
1
Yaş
36
arkadaşlar step7 managerda kullanılan FB41 blokunun ne şekilde kullanıldığını bir uygulama örneğiyle anlatabilecek biri olursa çok sevinirim. cevap verecek arkadaşa şimdiden teşekkürler
 

torex

Üye
Katılım
22 Eki 2006
Mesajlar
369
Puanları
1
Yaş
43
PID bloğu programı ve anlatımı hazırlamam uzun sürdü ama değdiğini düşünüyorum. İnşallah işinizi görür.


clip_image002.jpg
 

Ekli dosyalar

  • PID.rar
    856 KB · Görüntüleme: 66
Moderatör tarafında düzenlendi:

general

Üye
Katılım
26 Şub 2007
Mesajlar
80
Puanları
1
Yaş
35
erolgke arkadasım çok teşekkür ediyorum.

merak edi̇yorum kusura bakmazsaniz.. s7_200 i̇le pid s7_300 i̇le olan pid arasinda farklilik varmi yazilim acisindan..?daha önceden de s7 200 i̇le pid kontrol yaptinizmi?
 

torex

Üye
Katılım
22 Eki 2006
Mesajlar
369
Puanları
1
Yaş
43
S7-200 kullanmadım, fakat şunu söyleyebilirim, eğer analog girişiniz ve çıkışınız mevcutsa PID programı kendimizde yapabiliriz. Eklediğim S7 projesinde S7-300 için kendi yaptığımız PID kontrolü yapan FB olması gerekir.
 

kukulete

Üye
Katılım
1 Nis 2007
Mesajlar
5
Puanları
1
Yaş
36
Arkadaşlar bende "Hardware no found"diye bir hata gelip duruyor neden kaynaklanabilir acaba yadım ederseniz sevinirim.
 

Benzer Konular

Forum istatistikleri

Konular
117,192
Mesajlar
825,676
Kullanıcılar
426,699
Son üye
farozcan

Yeni konular

Üst