终结者2游戏规则:Siemens FB43 SCL源码 PULSEGEN ICONT

来源:百度文库 编辑:中财网 时间:2024/04/29 04:58:12

Очередной исходный текст библиотечной функции семейства ICONT – PULSEGEN (FB43) генератор импульсов.

Блок можно найти в Standard Library -> PID Control Blocks -> FB43 PULSEGEN ICONT

Скомпилированный блок не идентичен оригинальному, из за использования компилятора другой версии. Функции отличающихся участков кода STL - идентичны.

Документация по функции: 
english - download .pdf 0.3Мб 
русская - скачать .pdf 0.3Мб


FUNCTION_BLOCK FB43
TITLE ='pulse generator'
AUTHOR : SIMATIC
FAMILY : ICONT
NAME : PULSEGEN
VERSION : '1.6'
// reversed by komatic
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 ;    
siZaehlPer : INT ;    
siZaehlPTm : INT ;    
sbPosP : BOOL  := TRUE ;    
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 ;    
      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:=REAL_TO_INT(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;
          PTmLlm:=rMinPTm;
          IF PTm>PTmHlm THEN PTm:=rPerTm; END_IF;
          siZaehlPTm:=REAL_TO_INT(PTm/rCycle);
          IF (PTm<>sInvAlt) AND SYN_ON AND (siZaehlPer>2)THEN siZaehlPer:=1; 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;
END_IF;   
sInvAlt:=INV;
END_FUNCTION_BLOCK