Sei sulla pagina 1di 4

FUNCTION_BLOCK FB120

TITLE =" pulse generator"


AUTHOR : AUT_1
FAMILY : MODCONT
NAME : PULSEGEN
VERSION : " 1.1"

VAR_INPUT
INV : REAL ; //input variable
PER_TM : TIME := T#1S; //period time
P_B_TM : TIME := T#50MS; //minimum pulse/break time
RATIOFAC : REAL := 1.000000e+000; //ratio factor
STEP3_ON : BOOL := TRUE; //three step signal on
ST2BI_ON : BOOL ; //two step signal for bipolar manipulated
value on
MAN_ON : BOOL ; //manual mode on
POS_P_ON : BOOL ; //positiv pulse on
NEG_P_ON : BOOL ; //negativ pulse on
SYN_ON : BOOL := TRUE; //impuls output synchronisation on
COM_RST : BOOL ; //complete restart
CYCLE : TIME := T#10MS; //sample time
END_VAR
VAR_OUTPUT
QPOS_P : BOOL ; //positiv pulse on
QNEG_P : BOOL ; //negativ pulse on
END_VAR
VAR
sInvAlt : REAL ; // Last input value
siZaehlPer : INT ; // total pulse counter
siZaehlPTm : INT ; // pulse On counter
sbPosP : BOOL := TRUE; // positve pulse
END_VAR
VAR_TEMP
rCycle : REAL ; //Abtastzeit in real
rPerTm : REAL ; //Periodendauer in real
rMinPTm : REAL ; //Mindestimpulsdauer in real
rRatioFac : REAL ; //Verhдltnisfaktor
Offset : REAL ; //Offset
PTm : REAL ; //Impulsdauer
PTmHlm : REAL ; //Obere Begrenzung der Impulsdauer
PTmLlm : REAL ; //Untere Begrenzung der Impulsdauer
END_VAR
BEGIN
IF COM_RST
THEN
QPOS_P:=0;
QNEG_P:=0;
siZaehlPer:=0;
siZaehlPTm:=0;
sbPosP:=1;
ELSE
IF MAN_ON
THEN
IF STEP3_ON
THEN
IF POS_P_ON XOR NEG_P_ON
THEN
IF POS_P_ON
THEN
QPOS_P:=1;
QNEG_P:=0;
ELSE
QPOS_P:=0;
QNEG_P:=1;
END_IF;
ELSE
QPOS_P:=0;
QNEG_P:=0;
END_IF;
ELSE
IF POS_P_ON
THEN
QPOS_P:=1;
QNEG_P:=0;
ELSE
QPOS_P:=0;
QNEG_P:=1;
END_IF;
END_IF;
siZaehlPer:=0;
siZaehlPTm:=0;
sbPosP:=1;
ELSE
IF siZaehlPer <= 0
THEN
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
rPerTm:=DINT_TO_REAL(TIME_TO_DINT(PER_TM));
rMinPTm:=DINT_TO_REAL(TIME_TO_DINT(P_B_TM));
siZaehlPer:=DINT_TO_INT(REAL_TO_DINT(rPerTm/rCycle));
IF siZaehlPer < 0
THEN
siZaehlPer:=0;
END_IF;
IF STEP3_ON
THEN
IF INV > 0.0
THEN
IF RATIOFAC > 1.0
THEN
rRatioFac:=1.0/RATIOFAC;
ELSE
rRatioFac:=1.0;
END_IF;
sbPosP:=1;
ELSE
IF RATIOFAC > 1.0
THEN
rRatioFac:=1.0;
ELSE
rRatioFac:=RATIOFAC;
END_IF;
sbPosP:=0;
END_IF;
Offset:=0.0;
ELSE
IF ST2BI_ON
THEN
IF INV<-100.0
THEN
Offset:=0.0;
rRatioFac:=0.0;
ELSE
Offset:=0.5*rPerTm;
rRatioFac:=0.5;
END_IF;
ELSE
Offset:=0.0;
IF INV < 0.0
THEN
rRatioFac:=0.0;
ELSE
rRatioFac:=1.0;
END_IF;
END_IF;
sbPosP:=1;
END_IF;
PTm:=ABS(INV*rRatioFac*rPerTm*0.01+Offset);
IF (NOT STEP3_ON) AND ST2BI_ON
THEN
rRatioFac:=1.0;
END_IF;
PTmHlm:=(rPerTm-rMinPTm)*rRatioFac;
PTmLlm:=rMinPTm*rRatioFac;
IF PTm > PTmHlm
THEN
PTm:=rPerTm*rRatioFac;
END_IF;
siZaehlPTm:=DINT_TO_INT(REAL_TO_DINT(PTm/rCycle));
IF PTm < PTmLlm
THEN
siZaehlPTm:=0;
END_IF;
END_IF;
IF ((INV <> sInvAlt) AND SYN_ON) AND (siZaehlPer > 2)
THEN
siZaehlPer:=1;
siZaehlPTm:=0;
END_IF;
IF STEP3_ON
THEN
IF siZaehlPTm = 0
THEN
QPOS_P:=0;
QNEG_P:=0;
ELSE
IF sbPosP
THEN
QPOS_P:=1;
QNEG_P:=0;
ELSE
QPOS_P:=0;
QNEG_P:=1;
END_IF;
END_IF;
ELSE
IF siZaehlPTm = 0
THEN
QPOS_P:=0;
ELSE
QPOS_P:=1;
END_IF;
QNEG_P:= NOT QPOS_P;
END_IF;
siZaehlPer:=siZaehlPer-1;
IF siZaehlPTm>0
THEN
siZaehlPTm:=siZaehlPTm-1;
ELSE
siZaehlPTm:=0;
END_IF;
END_IF;
END_IF;
sInvAlt:=INV;
END_FUNCTION_BLOCK

Potrebbero piacerti anche