
VAR_INPUT
INV: REAL; // input variable
TM_LAG: TIME: = T # 25S; //delay time
DF_OUTV: REAL; // exit by default
TRACK: BOOL; // track enable OUTV = INV
DFOUT_ON: BOOL; // enable default output
COM_RST: BOOL; // complete restart
CYCLE: TIME: = T # 1S; //lead time
END_VAR
VAR_OUTPUT
OUTV: REAL; // output variable
END_VAR
VAR
sRueck: REAL;
sRest: REAL;
END_VAR
VAR_TEMP
rTmLag: REAL; // delay time in real
rCycle: REAL; // runtime in real
OutvNew: REAL; // new exit value
RueckAlt: REAL; // Old feedback value
Hvar: REAL; // auxiliary variable
RueckDiff: REAL; // feedback difference
END_VAR
BEGIN
IF COM_RST
THEN
sRest:=0.0;
IF DFOUT_ON
THEN
OutvNew:=DF_OUTV;
sRueck:=DF_OUTV;
ELSE -
OutvNew:=0.0;
sRueck:=0.0;
END_IF;
ELSE
IF DFOUT_ON
THEN -
OutvNew:=DF_OUTV;
sRueck:=DF_OUTV;
ELSE
IF TRACK
THEN -
OutvNew:=INV;
sRueck:=INV;
sRest:=0.0;
ELSE -
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
-
rTmLag:=DINT_TO_REAL(TIME_TO_DINT(TM_LAG));
-
// -----------------------------------------------
IF rTmLag < rCycle * 0.5 THEN rTmLag:=rCycle * 0.5; END_IF;
RueckAlt:=sRueck;
Hvar:=rCycle /( 2.0 * rTmLag);
Hvar:= (INV - RueckAlt) * Hvar / (1.0 + Hvar);
OutvNew:=Hvar+RueckAlt;
RueckDiff:=2.0 * Hvar + sRest;
sRueck:=RueckDiff + RueckAlt;
sRest:=RueckAlt - sRueck + RueckDiff;
END_IF;
END_IF;
END_IF;
OUTV:=OutvNew;
END_FUNCTION_BLOCK
想请教下大咖们,为什么SCL这段表达图片中那个公式竟然如此复杂:
RueckAlt:=sRueck;
Hvar:=rCycle /( 2.0 * rTmLag);
Hvar:= (INV - RueckAlt) * Hvar / (1.0 + Hvar);
OutvNew:=Hvar+RueckAlt;
RueckDiff:=2.0 * Hvar + sRest;
sRueck:=RueckDiff + RueckAlt;
sRest:=RueckAlt - sRueck + RueckDiff;
特别是这里面的两处“ 2.0 * ”不知道是怎么来的。恳请能看懂的大神能帮忙解释一下。