CONT_C (FB41) Siemens

: 2009-04-28

: komatic

: PIDcontrol

Siemens (CONT_C)
- .

.

:
english - download .pdf 0.3
- .pdf 0.3

pid

FUNCTION_BLOCK FB41
TITLE =" PID "
AUTHOR : SIMATIC
FAMILY : ICONT
NAME : CONT_C
VERSION : " 1.5"
//reversed by komatic
VAR_INPUT
COM_RST : BOOL ; //
MAN_ON : BOOL := TRUE; //
PVPER_ON : BOOL ; //
P_SEL : BOOL := TRUE; //
I_SEL : BOOL := TRUE; //
INT_HOLD : BOOL ; //
I_ITL_ON : BOOL ; //
D_SEL : BOOL ; //
CYCLE : TIME := T#1S; //
SP_INT : REAL ; //
PV_IN : REAL ; //
PV_PER : WORD ; // ()
MAN : REAL ; //
GAIN : REAL := 2.000000e+000; //
TI : TIME := T#20S; //
TD : TIME := T#10S; //
TM_LAG : TIME := T#2S; //
DEADB_W : REAL ; //
LMN_HLM : REAL := 1.000000e+002; //
LMN_LLM : REAL ; //
PV_FAC : REAL := 1.000000e+000; // ()
PV_OFF : REAL ; // ()
LMN_FAC : REAL := 1.000000e+000; // ()
LMN_OFF : REAL ; // ()
I_ITLVAL : REAL ; //
DISV : REAL ; //
END_VAR
VAR_OUTPUT
LMN : REAL ; //
LMN_PER : WORD ; // ()
QLMN_HLM : BOOL ; //
QLMN_LLM : BOOL ; //
LMN_P : REAL ; //
LMN_I : REAL ; //
LMN_D : REAL ; //
PV : REAL ; //
ER : REAL ; //
END_VAR
VAR
sInvAlt : REAL ;
sIanteilAlt : REAL ;
sRestInt : REAL ;
sRestDif : REAL ;
sRueck : REAL ;
sLmn : REAL ;
sbArwHLmOn : BOOL ; //
sbArwLLmOn : BOOL ; //
sbILimOn : BOOL := TRUE;
END_VAR
VAR_TEMP
Hvar : REAL ; //Hilfsvariable
rCycle : REAL ; //Abtastzeit in real
Diff : REAL ; //nderungswert
Istwert : REAL ; //Istwert
ErKp : REAL ; //
rTi : REAL ; //Integrationszeit in real
rTd : REAL ; //Differentiationszeit in real
rTmLag : REAL ; //Verzgerungszeit in real
Panteil : REAL ; //P-Anteil
Ianteil : REAL ; //I-Anteil
Danteil : REAL ; //D-Anteil
Verstaerk : REAL ; //Verstrkung
RueckDiff : REAL ; //Differenz des Rckkopplungswertes
RueckAlt : REAL ; //Alter Rckkopplungswert
dLmn : REAL ; //Stellwert
gf : REAL ; //Hilfwert
rVal : REAL ; //Real Hilfsvariable
END_VAR
BEGIN
IF COM_RST //
THEN
//
sIanteilAlt:=I_ITLVAL;
LMN:=0.0; //
QLMN_HLM:=0; //
QLMN_LLM:=0; //
LMN_P:=0.0; //
LMN_I:=0.0; //
LMN_D:=0.0; //
LMN_PER:=0; // ()
PV:=0.0; //
ER:=0.0; //
sInvAlt:=0.0;
sRestInt:=0.0;
sRestDif:=0.0;
sRueck:=0.0;
sLmn:=0.0;
sbArwHLmOn:=0;
sbArwLLmOn:=0;
ELSE
rCycle:= DINT_TO_REAL(TIME_TO_DINT(CYCLE)) / 1000.0; //
Istwert:=INT_TO_REAL(WORD_TO_INT(PV_PER)) * 100.0 / 27648.0; // (0-2768 0-100)
Istwert:=Istwert * PV_FAC + PV_OFF; //
IF NOT PVPER_ON THEN Istwert:=PV_IN; END_IF; // PV_IN
PV:= Istwert; //
ErKp:=SP_INT - PV; //
IF ErKp < (-DEADB_W) THEN ER:=ErKp+DEADB_W; //
ELSIF ErKp > DEADB_W THEN ER:=ErKp-DEADB_W; // .
ELSE ER:=0.0; // .
END_IF;
ErKp:=ER * GAIN; // ,
rTi:=DINT_TO_REAL(TIME_TO_DINT(TI)) / 1000.0; //
rTd:=DINT_TO_REAL(TIME_TO_DINT(TD)) / 1000.0; //
rTmLag:=DINT_TO_REAL(TIME_TO_DINT(TM_LAG)) / 1000.0; // .
//
IF rTi < (rCycle * 0.5) THEN rTi:=rCycle * 0.5; END_IF; // - Cycle / 2
IF rTd < rCycle THEN rTd:=rCycle; END_IF; // - Cycle
IF rTmLag < rCycle * 0.5 THEN rTmLag:=rCycle * 0.5; END_IF; // ..- Cycle / 2
//
IF P_SEL
THEN
Panteil:=ErKp; //
ELSE
Panteil:=0.0;
END_IF;
//---------------------------------------------------------------------------------------------
//
//---------------------------------------------------------------------------------------------
IF I_SEL //
THEN
IF I_ITL_ON //
THEN
Ianteil:=I_ITLVAL;
sRestInt:=0.0;
ELSE
IF MAN_ON //
THEN
Ianteil:=sLmn - Panteil - DISV;
sRestInt:=0.0;
ELSE //
Diff:=rCycle / rTi *(ErKp + sInvAlt) * 0.5 + sRestInt;
IF ((Diff>0.0) AND sbArwHLmOn OR INT_HOLD)OR ((Diff<0.0) AND sbArwLLmOn) THEN Diff:=0.0; END_IF;
Ianteil:=sIanteilAlt + Diff;
sRestInt:=sIanteilAlt - Ianteil + Diff;
END_IF;
END_IF;
ELSE
Ianteil:=0.0;
sRestInt:=0.0;
END_IF;
//---------------------------------------------------------------------------------------------
//
//---------------------------------------------------------------------------------------------
Diff:=ErKp;
IF (NOT MAN_ON) AND D_SEL
THEN
Verstaerk:= rTd / (rCycle * 0.5 + rTmLag);
Danteil:= (Diff - sRueck) * Verstaerk;
RueckAlt:= sRueck;
RueckDiff:= rCycle / rTd * Danteil + sRestDif;
sRueck:= RueckDiff + RueckAlt;
sRestDif:=RueckAlt - sRueck + RueckDiff;
ELSE
Danteil:=0.0;
sRestDif:=0.0;
sRueck:=Diff;
END_IF;
//---------------------------------------------------------------------------------------------
//
//---------------------------------------------------------------------------------------------
dLmn:=Panteil + Ianteil + Danteil + DISV;
IF MAN_ON //
THEN
dLmn:=MAN; //
ELSE
IF (NOT I_ITL_ON) AND I_SEL
THEN
IF (Ianteil > (LMN_HLM - DISV)) AND (dLmn > LMN_HLM) AND ((dLmn - LMN_D)> LMN_HLM)
THEN
rVal:=LMN_HLM - DISV;
gf:= dLmn - LMN_HLM;
rVal:=Ianteil - rVal;
IF rVal > gf THEN rVal:=gf; END_IF;
Ianteil:=Ianteil - rVal;
ELSE
IF (Ianteil < (LMN_LLM - DISV)) AND (dLmn < LMN_LLM) AND ((dLmn - LMN_D) < LMN_LLM)
THEN
rVal:=LMN_LLM - DISV;
gf:=dLmn - LMN_LLM;
rVal:=Ianteil - rVal;
IF rVal < gf THEN rVal:=gf; END_IF;
Ianteil:=Ianteil - rVal;
END_IF;
END_IF;
END_IF;
END_IF;
LMN_P:=Panteil;
LMN_I:=Ianteil;
LMN_D:=Danteil;
sInvAlt:=ErKp;
sIanteilAlt:=Ianteil;
sbArwHLmOn:=0;
sbArwLLmOn:=0;
IF (dLmn >= LMN_HLM)
THEN
QLMN_HLM:=1;
QLMN_LLM:=0;
dLmn:=LMN_HLM;
sbArwHLmOn:=1;
ELSE
QLMN_HLM:=0;
IF (dLmn <= LMN_LLM)
THEN
QLMN_LLM:=1;
dLmn:=LMN_LLM;
sbArwLLmOn:=1;
ELSE
QLMN_LLM:=0;
END_IF;
END_IF;
sLmn:=dLmn;
dLmn:=sLmn * LMN_FAC + LMN_OFF;
LMN:=dLmn;
dLmn:=LMN * 2.764800e+002;
IF dLmn >= 3.251100e+004
THEN
dLmn:=3.251100e+004;
ELSE
IF dLmn <= -3.251200e+004
THEN
dLmn:=-3.251200e+004;
END_IF;
END_IF;
LMN_PER:= INT_TO_WORD(REAL_TO_INT(dLmn));
END_IF;
END_FUNCTION_BLOCK





: 41260

: KruFFT    : 2009-11-23

! . , S7-412H SFB41. :(

:     : 2013-03-10

! ! :)

:     : 2014-04-02

, 1200 :)

:     : 2014-04-02

2- :
Ianteil:=sIanteilAlt + Diff;
sRestInt:=sIanteilAlt - Ianteil + Diff;
sRestInt ?

:     : 2014-04-03

sRestInt:=sIanteilAlt-sIanteilAlt- Diff+ Diff=0

: komatic    : 2014-04-03

> sRestInt ?
- , . .

: komatic    : 2014-04-04

0?
- real
http://plc4good.org.ua/view_post.php?id=165

: sergio green    : 2014-04-21

. . ?
?

:     : 2014-08-22

, - - ?

:     : 2014-08-22

ErKp:=ER * GAIN; -> ErKp:=ER * 1.0;

Panteil:=ErKp; ->
Panteil:=ErKp*GAIN;

:     : 2014-12-10

!
\ PLC ( Siemens S7-200..S7-400), () AVR.. (DS18B20 + ATTiny85) PID. Atmel (AVR221) . . PID Control, , .
, FB41 SCL . ATTiny85 (!) . , . 8 FB41 0.8-1.2 . , , \, D ...
, QIP, .

:     : 2014-12-10

+ IAR + Proteus h**p://file.qip.ru/arch/6yfGw-Lm/PID_FB41_IAR_project.html
h**p://shot.qip.ru/00CQYB-595nqPfJV
komatic

: komatic    : 2014-12-10

,

:     : 2014-12-10

;) , . , , . 32-bit ARM .
> sRestInt ?
, REAL . , "" - 10-8...10-10. " " AVR "" sRestInt sRestDif, - . ~220uS (~1700 CPU) + . float double float.
STM32, . Siemens .

: Old Bell    : 2015-04-19

LMN_HLM : REAL := 1.000000e+002; //
----------------
100 ?

: komatic    : 2015-04-19

1.000000e+002 100.0

: Old    : 2015-04-19

, 100. , , . . .

PID .
HEX 4000.
, . , .

: komatic    : 2015-04-19

>Old
, , "Generate source" FB.
.

: komatic    : 2015-04-19

, , - 1.5 ( )

: Old Bell    : 2015-04-19

, Komatic, . .

, 100, LMN_PER 27648.
.

, 41 , IT (AWL).
"generiert vom SCL Übersetzer Version: SCL K5.1.5.1 (C5.1.9.17)"

"" SCL .

( ) SCL .
, , , )))
, , ?

: Old Bell    : 2016-12-16


Hilfsvariable -
Abtastzeit in real- REAL
nderungswert -Änderungswert-
Istwert-

Integrationszeit in real- REAL
Differentiationszeit in real- REAL
VerzgerungszeitVerzögerungszeit in real- REAL
P-Anteil- P-
I-Anteil- I-
D-Anteil- D-
Verstrkung-Verstäkung-
Differenz des Rckkopplungswertes-
Alter Rckkopplungswert-
Stellwert-
Hilfwert-
Real Hilfsvariable -

: Old Bell    : 2016-12-16

Stellwert-

: CORSAR    : 2016-12-29

!
: sRestInt:=sIanteilAlt - Ianteil + Diff;
. : http://www.machinelearning.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%87%D0%B8%D1%81%D0%B5%D0%BB%2C_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE_%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B0%D1%8E%D1%89%D0%B8%D1%85%D1%81%D1%8F_%D0%BF%D0%BE_%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B8%D0%BD%D0%B5

: CORSAR    : 2016-12-29

S7-1200/1500 LREAL. , , .

: dmw    : 2017-11-06


IF (Ianteil > (LMN_HLM - DISV)) AND (dLmn > LMN_HLM) AND ((dLmn - LMN_D)> LMN_HLM)

IF (Ianteil < (LMN_LLM - DISV)) AND (dLmn < LMN_LLM) AND ((dLmn - LMN_D) < LMN_LLM)
LMN_D , .

LMN_D:=Danteil;

dLmn:=Panteil + Ianteil + Danteil + DISV;

: dmw    : 2017-11-07

LMN_D - , , LMN_D IN_OUT?

:

(4000 max):

: