Pid Bloğu Yazma

torex

Üye
Katılım
22 Eki 2006
Mesajlar
366
Puanları
1
Yaş
46
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 &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
 
twido ile pıd kontrol bloğu konfigirasyon hakkında bilginz var mı
 
Sn erolgke arkadasima
1. yaziyi okudugumda pid ile ilgili anlasilir seyler buldum diye sevinirken 2, yazida sende karmasik
program analizlerine daldin.su konuyu basladigin gibi basit seviyede ve basit grafiklerele devam ettirsen
cok guzel olucakti.Bu sorunu mikroislemci ile halletmek isitiyorum cunki.Sadece toplama ve carpma yapan
bir unitede bu is nasil cozulebilir.Yapanlar da var cunki.
Gene de sana cok tesekkur ederim.
 
SAYIN erolgke arkadaşa teşekkür ederim.emeğiniz için teşekkür ederim.
forumda verilen stl kodlarınıyla ob 35 te bir pid blok gerçekledim. sistemdeki kc, tı,td,t, (oransak değer,integrak değer,türevsal değer, örnekleme zamanını neye göre hesaplıyoruz. bu değerler hesaplamak için hangi formuller kullanılıyor. bu konu hakkında bilgilendirebilirmisiniz. pid konusunun kendi çabalarım ile kavramaya çalışıyorum. bu sitemdeki katsayıları hesaplama yolunu bilsem bir blok oluşturarak bu işi çözmek istiyorum. teşekkür ederim.
 
Belki incelemiş olabilirisniz ama ben yinede vermek istiyorum. Ekteki linkte bu işi öğrenmek isteyenler için PID ile ilgili kendi hazırladığım örnek çalışmam mevcut. PID kontrol ile ilgili eğitime gitmişti. İlkönce sistemin türü tespit edilip daha sonra bu sisteme uygun katsayılar bulunuyor. Fakat fazlasıyla teorik kaçıyor. siz deneme yanılma yöntemiylede yakın bir şeyler bulabilirisniz. Simatic altındaki PID param. Control Assig. menusunden bu katsayıları sırasıyla attığınızda sistem davranışının grafiğini göreceksiniz. Mükemmel katsayı yoktur sisteme uygun optimum katsayılar vardır. Çünkü bazen sistemin çok hızlı set değerine ulaşmasını istersiniz fakat salınım fazla olur. Çok geç oturursa hiç salınım yapmaz.
elimde bu katsayıları tespit etme ile ilgili yazılı dökümanlar var. Bunları scan ederim fakat pek birşey anlaşılacağını sanmıyorum. Kitaplarda yazan şeyler.
https://www.kontrolkalemi.com/forum/pid_kontrol/siemens_ile_pid_kontrol-t2443.0.html
 
sayın erolgke
Simatic altındaki PID param. Control Assig. menusü ,simatiğin altındaki pid control parameter asingment altındaki açılan pid grafiktenmi sözetmek istiyorsunuz. teşekkür ederim.
 
erolgke ' Alıntı:
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.

Bu Salman hocanın dersinde gösterdiği yöntem, gerçekten uygun PID katsayılarını bulabiliyorsunuz ama prosese uygulayınca her zaman işe yaramıyor, deneme yanılmayla bulmak gerek. Örneğin 1. derece için PI yeterli 2 kazancı deneme ve yanılmayla ayarlamak en iyisi
 

Forum istatistikleri

Konular
127,959
Mesajlar
913,914
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Geri
Üst