ABYS
Üye
- Katılım
- 17 Nis 2008
- Mesajlar
- 219
- Puanları
- 1
FB41 kadar iyi olmayabilir ama
REF : referans girişi (int)
C : geri besleme (int)
CLOSED_LOOP : PID / açık çevrim seçeneği. 1-PID
P_SEL , I_SEL , D_SEL : P/I/D enable
RESET : PID değerlerini resetler. 1-Reset
T : Örnekleme zamanı (REAL)
TI, TD, KC : PID parametreleri (REAL)
Umin , Umax : Saturasyon
U : Kontrol işareti (int)
not : alıntı değildir.
Kod:
FUNCTION_BLOCK FB241
VAR_INPUT
REF:INT;
C:INT ;
CLOSED_LOOP:BOOL;
P_SEL:BOOL;
I_SEL:BOOL;
D_SEL:BOOL;
RESET:BOOL;
T:REAL;
TI:REAL;
TD:REAL;
KC:REAL;
Umin:REAL;
Umax:REAL;
END_VAR
VAR
CR_1:REAL;
I_1:REAL;
END_VAR
VAR_TEMP
UminR:REAL;
UmaxR:REAL;
UR:REAL;
D:REAL;
I:REAL;
P:REAL;
REFR:REAL;
ER:REAL;
CR:REAL;
END_VAR
VAR_OUTPUT
U:INT;
END_VAR
UR:=INT_TO_REAL(U);
REFR:=INT_TO_REAL(REF);
CR:=INT_TO_REAL(C);
IF T>0.0 THEN
IF CLOSED_LOOP THEN
ER:=REFR-CR;
UminR:=Umin;
UmaxR:=Umax;
IF UmaxR>=32767.0 THEN
UmaxR:=32767.0;
END_IF;
IF UminR<=-32767.0 THEN
UminR:=-32767.0;
END_IF;
IF P_SEL THEN
P:=KC*ER;
ELSE
P:=0.0;
END_IF;
IF TI>0 THEN
IF I_SEL THEN
I:=I_1 + KC *(T/TI) * ER;
IF UR>=UmaxR THEN
I:=I_1;
END_IF;
IF UR<=UminR THEN
I:=I_1;
END_IF;
I_1:=I;
ELSE
I:=0.0;
I_1:=0.0;
END_IF;
ELSE
I:=0.0;
I_1:=0.0;
END_IF;
IF D_SEL THEN
D:=KC * (TD/T) * (CR_1 - CR);
IF D>=UmaxR THEN
D:=UmaxR;
END_IF;
IF D<=UminR THEN
D:=UminR;
END_IF;
CR_1:=CR;
ELSE
D:=0.0;
END_IF;
UR:=P + I + D;
IF UR>=UmaxR THEN
UR:=UmaxR;
END_IF;
IF UR<=UminR THEN
UR:=UminR;
END_IF;
U:=REAL_TO_INT(UR);
END_IF;
END_IF;
IF CLOSED_LOOP=0 THEN
UR:=REFR;
U:=REAL_TO_INT(UR);
END_IF;
IF RESET THEN
D:=0.0;
I:=0.0;
I_1:=0.0;
P:=0.0;
UR:=0.0;
REFR:=0.0;
ER:=0.0;
CR:=0.0;
CR_1:=0.0;
END_IF;
END_FUNCTION_BLOCK
REF : referans girişi (int)
C : geri besleme (int)
CLOSED_LOOP : PID / açık çevrim seçeneği. 1-PID
P_SEL , I_SEL , D_SEL : P/I/D enable
RESET : PID değerlerini resetler. 1-Reset
T : Örnekleme zamanı (REAL)
TI, TD, KC : PID parametreleri (REAL)
Umin , Umax : Saturasyon
U : Kontrol işareti (int)
not : alıntı değildir.