Otomasyon Bloğumuza Hoşgeldiniz

Bloğumuzun Amacı Nedir ?

  • Otomasyon Teknolojileri Hakkında Bilgi Sunmak,
  • Otomasyon Dünyasına Ait Programları Paylaşmak
  • PLC, Pic, Pnömatik, Scada Sistemleri ve Otomasyonun Her Alanından Değişik Teknolojiler Hakkında Teknik Bilgi ve Dökümanlar Sunmak
  • Bilgi için: y.inceduygu@gmail.com adresine e-mail atınız.

18 Kasım 2007 Pazar

Pid Bloğu Yazma

PID elimizdeki kontrol edeceğimiz sitemin davranışına manule modda bakarak bu davranışa uygun parametreleri ( P,I,D) belirleyerek otomatik modda sistemin vereceği çıkışı (PV) değerini bizim istediğimiz set (SP) değeriyle karşılaştırarak Maniplated Value değeri üreterek bu değeri sisteme uygulayarak SV yakalayabilmemize yarar ve kapalı çevrim kontroldür.
PID parametreleri belirlemek ilk önce sistemi manuel olarak örneğin %50 set değeri verip PV değerinin %0 dan kararlılığa oturduğu seviyeye geliş hareketini izlememiz gerekiyor. Manule modda gelen PV değerlerini kayıt altına alıp davranışın grafiğini olşturduğumuzda (data blokta kaydedip STL source çıkarılarak actuel değerleri excell e alınılabilir veya Simatic altındaki PID param. Control Assig. izlenilebilir) kontrol edeceğimiz sistemin hangi türe girdiğine karar veririrz. 1. mertebe,1. mertebe ölü zamanlı,2. mertebe az sönümlü,2. mertebe ölü zamanlı az sönümlü sistemler. Sistemin davranışına göre P,I,D katsayılarını bulma yöntemleri farklıdır.

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 ÝSE INTEGRAL ÇALIÞ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Þ DEÐERÝ 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Þ DEÐERÝ 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
S7300-400 PID algoritma paremetre açıklama ingilizce döküman:

http://www.dosya.cc/download.php?file=7b3e3f27b7df30b2acb54355cf64f3fe

Hiç yorum yok: