Âåðñèÿ äëÿ ïå÷àòè

Áèáëèîòåêà: EMC - Easy Motion Control (sources 26 from 26)

Äàòà: 2015-04-07

Äîáàâëåíî: komatic

Òåìà: SCL




emc


Íåìíîãî ñòàðàÿ, íî âñå åùå ÷àñòî èñïîëüçóåìàÿ áèáëèîòåêà.
Easy Motion Control ïîçâîëÿåò óïðàâëÿòü ïîçèöèîíèðîâàíèåì ïðèâîäîâ.
Áèáëèîòåêà ðàçðàáîòàíà ñîãëàñíî "Technical Specification V1.0" PLCopen.



emc



Äîêóìåíòàöèÿ (Easy Motion Control, 02/2003) (pdf, 2Mb)

Íà÷àëî ðàáîòû (Getting Started, 02/2003) (pdf, 0.7Mb)

EMC library v2.0 (zip, 150Kb)

EMC library v2.1 (zip, 60Kb)

Example of use (zip, 500Kb)




Ñîäåðæàíèå:

Îïèñàíèå

UDT1 AXIS_REF - Data type for axis data

FB1 MC_MoveAbsolute - Move to absolute position

FB2 MC_MoveRelative - Move a relative distance

FB3 MC_MoveJog - Move the axis using directional inputs (jogging)

FB4 MC_Home - Reference search / setting

FB5 MC_StopMotion - Stop any motion

FB11 MC_Control - Position control

FB12 MC_Simulation - Simulate axis

FB21 EncoderIM178 - Input driver for IM178-4

FB22 EncoderFM450 - Input driver for FM450

FB23 EncoderET200S1SSI - Input driver for ET200S 1SSI

FB24 EncoderAbsSensorDP - Input driver for DP-sensor

FB25 EncoderSM338 - Input driver for SM338

FB26 EncoderET200S1Count - Input driver for ET200S 1Count

FB27 EncoderFM350 - Input driver for FM350

FB28 EncoderCPU314C - Input driver for CPU 314C counter

FB29 EncoderUniversal - Universal input driver

FB31 OutputIM178 - Output driver for IM178-4

FB32 OutputSM432 - Output driver for SM432

FB33 OutputET200S2AO - Output driver for ET200S 2AO

FB34 OutputCPU314C - Output driver for CPU 314C

FB35 OutputSM332 - Output driver for SM332

FB36 OutputUniversal - Universal output driver

FB37 OutputMM4_DP - Output driver for Micromaster 4 DP

FB41 MC_GearIn - Electronic gear (2 axes)

FC0 MC_Init - Initialize axis DB



Îïèñàíèå


Áèáëèîòåêà âûïîëíÿåò ñëåäóþùèå ôóíêöèè:



emc



UDT1 AXIS_REF - Data type for axis data



Name: UDT1
Symbolic Name: AXIS_REF
Symbol Comment: Data type for axis data
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use:
Size in work memory:
Object name: emc2
Signature:



TYPE UDT1 // AXIS_REF - Data type for axis data
STRUCT
    Sample_T : REAL  := 1.000000e-002;    //Axis processing sample time [s]
    AxisType : BOOL ;    //0=Linear; 1=Rotary
    EncoderType : BOOL ;    //0=Incremental; 1=Absolute
    Sim : BOOL ;    //1=Simulation on
    AxisLimitMax : REAL  := 1.000000e+006;    //Maximum axis coordinate [u]
    AxisLimitMin : REAL  := -1.000000e+006;    //Minimum axis coordinate [u]
    MaxVelocity : REAL  := 1.000000e-001;    //Maximum velocity [u/s]
    MaxAcceleration : REAL  := 1.000000e-001;    //Maximum acceleration [u/s²]
    MaxDeceleration : REAL  := 1.000000e-001;    //Maximum deceleration [u/s²]
    MonTimeTargetAppr : REAL  := 1.000000e+000;    //Monitoring time for target approach [s]
    TargetRange : REAL  := 1.000000e+000;    //Target range [u]
    StandstillRange : REAL  := 1.500000e+000;    //Standstill range [u]
    MaxFollowingDist : REAL  := 5.000000e+000;    //Max. following distance [u]
    MonitorTargetAppr : BOOL  := TRUE;    //1=Monitor target approach
    SWLimitEnable : BOOL  := TRUE;    //1=Enable software limit switches
    FactorP : REAL  := 1.000000e+000;    //P-Factor of position loop [1/s]
    ManVelocity : REAL ;    //Manual velocity [u/s]
    ManEnable : BOOL ;    //1=Enable manual mode
    EmergencyDec : REAL  := 1.000000e+003;    //Deceleration for emergency stop [u/s²]
    InputModuleInAddr : INT ;    //Input address for input module (encoder connection)
    InputModuleOutAddr : INT ;    //Output address for input module (encoder connection)
    InputChannelNo : INT ;    //Channel no. for input module (0..n)
    StepsPerRev : DINT  := L#1;    //Steps per encoder revolution [steps/rev]
    DisplacementPerRev : REAL  := 1.000000e+000;    //Displacement of the axis per encoder revolution [u/rev]
    NumberRevs : INT  := 1;    //Number of revolutions (1:Singleturn, >1:Multiturn)
    PolarityEncoder : INT  := 1;    //Polarity of encoder (-1 or 1)
    PositionOffset : DINT ;    //Position offset / Absolute encoder adjustment [step]
    OutputModuleOutAddr : INT ;    //Output address for output module (drive connection)
    OutputModuleInAddr : INT ;    //Input address for output module (drive connection)
    OutputChannelNo : INT ;    //Channel no. for output module (0..n)
    PolarityDrive : INT  := 1;    //Polarity of drive (-1 or 1)
    DriveInputAtMaxVel : REAL  := 9.000000e+000;    //Reference value for max. axis velocity (>0)
    OffsetCompensation : REAL ;    //Offset compensation [V]
    DriveInputAt100 : REAL  := 1.000000e+001;    //Reference value for 100% rpm
    Override : REAL  := 1.000000e+002;    //Velocity override (0..100%)   
    ActPosition : REAL ;    //Actual position [u]
    FollowingDistance : REAL ;    //Following distance [u]
    RemainingDistance : REAL ;    //Remaining distance [u]
    NomVelocity : REAL ;    //Nominal velocity of axis [u/s]
    ActVelocity : REAL ;    //Actual velocity of axis [u/s]
    Sync : BOOL ;    //1=Axis synchronized
    Error : BOOL  := TRUE;    //1=Group error
    ErrorAck : BOOL ;    //1=Group acknowledgment for errors
    AxisState : INT  := 1;    //internal use
    Err : STRUCT    
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL  := TRUE;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
    END_STRUCT ;   
    Config : STRUCT    
     Err_AxisLimit : BOOL ;    //1=Incorrect axis limits
     Err_MaxVelocity : BOOL ;    //1=Incorrect max. velocity
     Err_MaxAcceleration : BOOL ;    //1=Incorrect max. acceleration
     Err_MaxDeceleration : BOOL ;    //1=Incorrect max. deceleration
     Err_MonTimeTargetAppr : BOOL ;    //1=Incorrect monitoring time for target approach
     Err_TargetRange : BOOL ;    //1=Incorrect target range
     Err_StandstillRange : BOOL ;    //1=Incorrect standstill range
     Err_MaxFollowingDist : BOOL ;    //1=Incorrect max. follwing distance
     Err_EmergencyDec : BOOL ;    //1=Incorrect emergency deceleration
     Err_StepsPerRev : BOOL ;    //1=Incorrect steps per encoder revolution
     Err_DisplacementPerRev : BOOL ;    //1=Incorrect displacement per encoder revolution
     Err_NumberRevs : BOOL ;    //1=Incorrect number of encoder revolutions
     Err_PolarityEncoder : BOOL ;    //1=Incorrect encoder polarity
     Err_PolarityDrive : BOOL ;    //1=Incorrect drive polarity
     Err_DriveInputAtMaxVel : BOOL ;    //1=Incorrect reference value for max. velocity
     Err_AxisLength : BOOL ;    //1=Incorrect axis length
     Err_EncoderRange : BOOL ;    //1=Encoder range is not correct for axis length
     Err_MaxVelRotaryAxis : BOOL ;    //1=Max. velocity and sample time are not correct for rotary axis length
     Err_DriveInputAt100 : BOOL ;    //1=Incorrect reference value for 100% rpm
    END_STRUCT ;   
    EncoderValue : DINT ;    //Current encoder value [step]
    RefPoint : REAL ;    //internal use
    OutVelocity : REAL ;    //internal use
    LastNomPosition : REAL ;    //internal use
    LastNomVelocity : REAL ;    //internal use
    LastNomDeceleration : REAL ;    //internal use
    InternalNomPosition : REAL ;    //internal use
    InternalActPos : REAL ;    //internal use
    InternalPosOffset : REAL ;    //internal use
    aufl : REAL ;    //internal use
    AchsLaenge : REAL ;    //internal use
    AchsLaenge_DI : DINT ;    //internal use
    AbsGeberLaenge_DI : DINT ;    //internal use
    LageIstwert_DI : DINT ;    //internal use
    Coord : DINT ;    //internal use
    DoneRef : BOOL ;    //internal use
    EinInitLaeuft : BOOL ;    //internal use
    AusInitLaeuft : BOOL ;    //internal use
    EinQuittungLaeuft : BOOL ;    //internal use
    AusQuittungLaeuft : BOOL ;    //internal use
    EintreiberFahrbereit : BOOL ;    //internal use
    ExecRef : INT ;    //internal use
    VLastNomPosition : REAL ;    //internal use
    VLastNomVelocity : REAL ;    //internal use
    LastInternalPosOffset : REAL ;    //internal use
    RundKorrektur : REAL ;    //internal use
    LastRundKorrektur : REAL ;    //internal use
    LengthUnit : STRING  [4 ] := 'mm';    //internal use
    InputModuleType : STRING  [24 ] := 'IM 178-4';    //internal use
    OutputModuleType : STRING  [24 ] := 'IM 178-4';    //internal use
    Init : STRUCT     //Init bits for 32 FBs
     I0 : BOOL  := TRUE;    //Init bit 0
     I1 : BOOL  := TRUE;    //Init bit 1
     I2 : BOOL  := TRUE;    //Init bit 2
     I3 : BOOL  := TRUE;    //Init bit 3
     I4 : BOOL  := TRUE;    //Init bit 4
     I5 : BOOL  := TRUE;    //Init bit 5
     I6 : BOOL  := TRUE;    //Init bit 6
     I7 : BOOL  := TRUE;    //Init bit 7
     I8 : BOOL  := TRUE;    //Init bit 8
     I9 : BOOL  := TRUE;    //Init bit 9
     I10 : BOOL  := TRUE;    //Init bit 10
     I11 : BOOL  := TRUE;    //Init bit 11
     I12 : BOOL  := TRUE;    //Init bit 12
     I13 : BOOL  := TRUE;    //Init bit 13
     I14 : BOOL  := TRUE;    //Init bit 14
     I15 : BOOL  := TRUE;    //Init bit 15
     I16 : BOOL  := TRUE;    //Init bit 16
     I17 : BOOL  := TRUE;    //Init bit 17
     I18 : BOOL  := TRUE;    //Init bit 18
     I19 : BOOL  := TRUE;    //Init bit 19
     I20 : BOOL  := TRUE;    //Init bit 20
     I21 : BOOL  := TRUE;    //Init bit 21
     I22 : BOOL  := TRUE;    //Init bit 22
     I23 : BOOL  := TRUE;    //Init bit 23
     I24 : BOOL  := TRUE;    //Init bit 24
     I25 : BOOL  := TRUE;    //Init bit 25
     I26 : BOOL  := TRUE;    //Init bit 26
     I27 : BOOL  := TRUE;    //Init bit 27
     I28 : BOOL  := TRUE;    //Init bit 28
     I29 : BOOL  := TRUE;    //Init bit 29
     I30 : BOOL  := TRUE;    //Init bit 30
     I31 : BOOL  := TRUE;    //Init bit 31
    END_STRUCT ;   
END_STRUCT ;
END_TYPE
 





FB1 MC_MoveAbsolute - Move to absolute position



Name: MC_Abs
Symbolic Name: MC_MoveAbsolute
Symbol Comment: Move to absolute position
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 3924
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB1
TITLE ='Move to absolute position'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Abs
VERSION : '2.0'
 
 
VAR_INPUT
  Execute : BOOL ;    //Start the motion at rising edge
  Position : REAL ;    //Target position for the motion [u]
  Velocity : REAL  := 1.000000e-001;    //Maximum velocity [u/s]
  Acceleration : REAL  := 1.000000e-001;    //Acceleration [u/s²]
  Deceleration : REAL  := 1.000000e-001;    //Deceleration [u/s²]
  Direction : INT ;    //Direction (rotary axis only: -1=negative, 0=shortest, 1=positive)
END_VAR
VAR_OUTPUT
  Busy : BOOL ;    //1=Moving
  Done : BOOL ;    //1=Position reached
  CommandAborted : BOOL ;    //1=Command was aborted by another command
  Error : BOOL ;    //1=Error has occurred within FB
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  ziel : REAL ;    //internal use
  v_max : REAL ;    //internal use
  v_max_B AT v_max : ARRAY[0..31] OF BOOL;
  a_1 : REAL ;    //internal use
  a_1_B AT a_1 : ARRAY[0..31] OF BOOL;
  b : REAL ;    //internal use
  b_B AT b : ARRAY[0..31] OF BOOL;
  b0 : REAL ;    //internal use
  bk1 : REAL ;    //internal use
  Zustand : INT ;    //internal use
  Bereich : INT ;    //internal use
  Coord : DINT ;    //internal use
  ta : REAL ;    //internal use
  taHalbe : REAL ;    //internal use
  aufl : REAL ;    //internal use
  Error_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  over : REAL ;    //internal use
  vk : REAL ;    //internal use
  vk_B AT vk : ARRAY[0..31] OF BOOL ;
  sk : REAL ;    //internal use
  vk1 : REAL ;    //internal use
  sk1 : REAL ;    //internal use
  Bremsweg : REAL ;    //internal use
  Restweg : REAL ;    //internal use
  RB : REAL ;    //internal use
  vv : REAL ;    //internal use
  delta_s : REAL ;    //internal use
  v_over : REAL ;    //internal use
  Hilf_R : REAL ;    //internal use
  Hilf_DI : DINT ;    //internal use
  ZielStrich : REAL ;    //internal use
  LageIstwert_DI : DINT ;    //internal use
  InternalActPos : REAL ;    //internal use
  RundKorrektur : REAL ;    //internal use
  BremswegRunden : DINT ;    //internal use
  BremswegRest : REAL ;    //internal use
  AchsLaenge : REAL ;    //internal use
  AchsLaengeHalb : REAL ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_w AT Err_DW : STRUCT
   w0 : WORD;
   w1 : WORD;
  END_STRUCT ;  
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
END_VAR
BEGIN
 
IF Init
THEN
    Init:=false;
    Done:=false;
    Busy:=false;
    CommandAborted:=false;
    Error:=false;
    Error_alt:=false;
    Zustand:=1;
    Bereich:=5;
    ta:=Axis.Sample_T;
    taHalbe:=ta*5.000000e-001;
    aufl:=Axis.aufl;
END_IF;     
 
IF Zustand=1
THEN
    IF NOT  Busy AND Execute
    THEN
        Busy:=true;
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Error_alt:=false;
        Coord:=Axis.Coord+1;
        AchsLaenge:=Axis.AchsLaenge;
        AchsLaengeHalb:=AchsLaenge*5.000000e-001;
        a_1:=Axis.MaxAcceleration;
        b:=Axis.MaxDeceleration;
        v_max:=Axis.MaxVelocity;
        IF v_max>Velocity THEN v_max:=Velocity; END_IF;
        IF a_1>Acceleration THEN a_1:=Acceleration; END_IF;
        IF b>Deceleration THEN b:=Deceleration; END_IF;
        ziel:=Position;
        sk:=Axis.LastNomPosition;
        vk:=Axis.LastNomVelocity;
        InternalActPos:=Axis.InternalActPos;
        LageIstwert_DI:=Axis.LageIstwert_DI;
        RundKorrektur:=Axis.RundKorrektur;
        Restweg:=ziel-Axis.InternalPosOffset-sk;
        IF Axis.AxisType
        THEN
            Hilf_DI:=LageIstwert_DI;
            LageIstwert_DI:=(Hilf_DI-Axis.PositionOffset) MOD Axis.AchsLaenge_DI + Axis.PositionOffset;
            Hilf_DI:=Hilf_DI-LageIstwert_DI;
            Hilf_R:=DINT_TO_REAL(Hilf_DI)*aufl;
            sk:=sk-Hilf_R;
            RundKorrektur:=RundKorrektur+Hilf_R;
            InternalActPos:=InternalActPos-Hilf_R;
            Restweg:=ziel-Axis.InternalPosOffset-sk;
            IF Restweg>=AchsLaenge THEN Restweg:=Restweg-AchsLaenge;END_IF;
            IF Restweg<=-AchsLaenge THEN Restweg:=Restweg+AchsLaenge;END_IF;
            IF ABS(Restweg)<aufl THEN Restweg:=0.0; END_IF;
            IF b>0.0
            THEN
                Bremsweg:=ABS(vk)*vk*0.5/b;
                BremswegRunden:=TRUNC(ABS(Bremsweg)/AchsLaenge);
                IF Bremsweg<0.0
                THEN
                    BremswegRunden:=-BremswegRunden;
                END_IF;
                BremswegRest:=Bremsweg-DINT_TO_REAL(BremswegRunden)*AchsLaenge;
                IF Direction>=1
                THEN
                    IF Restweg<0.0 THEN Restweg:=Restweg+AchsLaenge;END_IF;
                    IF BremswegRest<0.0
                    THEN
                        IF BremswegRest<Restweg-AchsLaenge
                        THEN
                            Restweg:=Restweg-AchsLaenge;
                        END_IF;   
                    ELSIF BremswegRest=0.0
                    THEN
                        IF Bremsweg<0.0 AND Restweg=0.0
                        THEN
                            Restweg:=Restweg+AchsLaenge;
                        END_IF;
                    ELSE
                        IF BremswegRest>Restweg
                        THEN
                            Restweg:=Restweg+AchsLaenge;
                        END_IF;
                    END_IF;   
                ELSIF Direction<=-1
                THEN
                    IF Restweg>0.0 THEN Restweg:=Restweg-AchsLaenge;END_IF;
                    IF BremswegRest>0.0
                    THEN
                        IF BremswegRest>Restweg+AchsLaenge
                        THEN
                            Restweg:=Restweg+AchsLaenge;
                        END_IF;
                    ELSIF BremswegRest=0.0 
                    THEN
                        IF Bremsweg>0.0  AND Restweg=0.0
                        THEN
                            Restweg:=Restweg-AchsLaenge;
                        END_IF;
                    ELSE
                        IF BremswegRest<Restweg
                        THEN
                            Restweg:=Restweg-AchsLaenge;
                        END_IF;
                    END_IF;   
                ELSIF Direction=0
                THEN
                    IF Restweg>AchsLaengeHalb
                    THEN
                        Restweg:=Restweg-AchsLaenge;
                    ELSIF Restweg<-AchsLaengeHalb
                    THEN  
                        Restweg:=Restweg+AchsLaenge;
                    END_IF;
                    IF BremswegRest>0.0
                    THEN
                        IF BremswegRest>=Restweg+AchsLaengeHalb
                        THEN
                            Restweg:=Restweg+AchsLaenge;
                        END_IF;
                    ELSIF BremswegRest<0.0
                    THEN
                        IF BremswegRest<=Restweg-AchsLaengeHalb
                        THEN
                            Restweg:=Restweg-AchsLaenge;   
                        END_IF;
                    END_IF;
                END_IF;   
                Restweg:=DINT_TO_REAL(BremswegRunden)*AchsLaenge+Restweg;    
            END_IF;
        END_IF;
        ziel:=Restweg;
        ZielStrich:=ziel/aufl;
        Err_DW_str:=Axis.Err;
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        Axis.Err.StartErr:=Err_DW<>DW#16#0 OR Axis.AxisState=6 OR Axis.AxisState=8 OR Axis.ManEnable;
        IF NOT Axis.Err.StartErr 
        THEN
            Axis.Err.NoSync:=NOT Axis.Sync;
            Axis.Err.DataErr:=  (v_max<=0.0 OR
                                 a_1<=0.0 OR
                                 b<=0.0) OR 
                                (Axis.LastNomDeceleration<>b AND
                                vk<>0.0) OR
                                ABS(Position)>1.6777216e+007;
            Axis.Err.TargetErr:=ABS(ZielStrich)>1.6777216e+007  OR
                                (NOT Axis.AxisType AND Axis.SWLimitEnable) AND   
                                (Position>=Axis.AxisLimitMax OR Position<=Axis.AxisLimitMin)  OR
                                (vk=0.0 AND Axis.AxisType) AND (Position>=Axis.AxisLimitMax OR Position<Axis.AxisLimitMin);
                               
        END_IF
        Err_DW_str:=Axis.Err; 
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        IF Err_DW<>DW#16#0
        THEN
            Axis.Error:=true;
            Error:=true;
            Zustand:=4;
        ELSE  
            Axis.InternalPosOffset:=Axis.InternalPosOffset+sk;
            Axis.LastInternalPosOffset:=Axis.LastInternalPosOffset+sk;
            InternalActPos:=InternalActPos-sk;
            Axis.VLastNomPosition:=Axis.VLastNomPosition-Axis.LastNomPosition;
            Axis.LastNomPosition:=0.0;
            Axis.LastNomDeceleration:=b;
            IF vk=0.0 
            THEN
                IF Restweg<0.0
                THEN
                    a_1:=-a_1;
                    b:=-b;
                    v_max:=-v_max;
                END_IF;
                b0:=0.0;
                bk1:=b;
            ELSE
                a_1_B[7]:=vk_B[7];
                b_B[7]:=vk_B[7];
                v_max_B[7]:=vk_B[7];
                b0:=b;
                bk1:=b;
            END_IF;
            Axis.LageIstwert_DI:=LageIstwert_DI;
            Axis.InternalActPos:=InternalActPos;
            Axis.RundKorrektur:=RundKorrektur;
            Zustand:=2;
            Axis.Coord:=Coord;
            Axis.AxisState:=3;
        END_IF;  
    END_IF;     
END_IF;
 
IF Zustand=2 OR Zustand=3
THEN
    vk:=Axis.LastNomVelocity;
    sk:=Axis.LastNomPosition;
    Bremsweg:=vk*vk*0.5/bk1;
    Restweg:=ziel-sk;
    IF Axis.Error
    THEN
        Err_DW_str:=Axis.Err;
        IF Restweg>0.0 AND Err_DW_str.SWLimitMinExceeded
        THEN
            Err_DW_str.SWLimitMinExceeded:=false;
        END_IF;
        IF Restweg<0.0 AND Err_DW_str.SWLimitMaxExceeded
        THEN
            Err_DW_str.SWLimitMaxExceeded:=false;
        END_IF;
        IF Err_DW=DW#16#0 THEN Error_alt:=true; END_IF;
        IF NOT Error_alt
        THEN
            Error:=true;
            Error_alt:=true;
            IF Err_w.w1<>W#16#0
            THEN
                Zustand:=4;
            ELSE
                IF Zustand=2
                THEN
                    ziel:=sk+Bremsweg;
                    Restweg:=Bremsweg;
                END_IF;
            END_IF;
        END_IF;
    END_IF;
    IF Axis.Coord<>Coord OR Axis.ManEnable
    THEN
        CommandAborted:=true;
        Zustand:=4;
    END_IF;
END_IF;      
 
IF Zustand=2
THEN
    IF Restweg=0.0 AND vk<>0.0
    THEN
        Restweg:=-Bremsweg;
    END_IF;
    over:=ABS(Axis.Override)/100.0;
    IF over>1.0 THEN over:=1.0; END_IF;
    v_over:=v_max*over;
    IF v_over<>0.0
    THEN
        vv:=vk/v_over;
    ELSE
        vv:=2.0;
    END_IF;
    IF Bremsweg<>0.0
    THEN
        RB:=Restweg/Bremsweg;
    ELSE
        RB:=2.0;
    END_IF;
    IF Restweg<>0.0
    THEN
        IF RB>1.0
        THEN
            b0:=0.0;
            IF vv<1.0
            THEN
                Bereich:=1;
                vk1:=a_1*ta+vk;
            ELSIF vv=1.0
            THEN
                Bereich:=2;
                vk1:=vk;
            ELSE 
                Bereich:=6;
                vk1:=vk-(bk1*ta);
                IF vk1*vk<=0.0 OR
                   vk=0.0 AND
                   v_over=0.0
                THEN
                    vk1:=0.0;
                END_IF;
            END_IF;
        ELSE
            IF RB<1.0 AND b0<>0.0
            THEN
                Bereich:=4;
                bk1:=b0;
            ELSE
                Bereich:=3;
                b0:=0.0;
            END_IF;   
        END_IF;
    ELSE
        Bereich:=5;    
    END_IF;  
    IF Bereich=1 OR Bereich=2 OR Bereich=6
    THEN
        IF (vk1-v_over)*
           (vk-v_over)<=0.0 AND
           vk<>v_over
        THEN
            vk1:=v_over;
        END_IF;
        delta_s:=(vk+vk1)*taHalbe;
        Bremsweg:=vk1*vk1*0.5/bk1;
        IF Bremsweg<>0.0 AND
           vk<>0.0
        THEN
            IF ABS((Restweg-delta_s)/Bremsweg)<1.0
            THEN
                bk1:=vk*vk*0.5/Restweg;
                Bereich:=3;
            ELSE      
                bk1:=b;   
            END_IF;
        ELSE 
            bk1:=b;    
        END_IF;     
        sk1:=sk+delta_s;
    END_IF;
    IF Bereich=3
    THEN
        vk1:=vk-bk1*ta;
        IF vk1*vk<=0.0  OR
           (vk=0.0 AND
           v_over=0.0)
        THEN
            vk1:=0.0;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    ELSIF Bereich=4
    THEN
        vk1:=vk-bk1*ta;
        IF vk1*vk<=0.0
        THEN
            vk1:=0.0;
            b0:=0.0;
            a_1:=-a_1;
            b:=-b;
            bk1:=b;
            v_max:=-v_max;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    ELSIF Bereich=5
    THEN
        vk1:=0.0;
        sk1:=ziel;           
        Zustand:=3;
    END_IF;
    IF (sk1-ziel)*(sk-ziel)<=0.0 AND
       Bereich<>4
    THEN
        sk1:=ziel;
        vk1:=0.0;
    END_IF;
    Axis.InternalNomPosition:=sk1;
    Axis.NomVelocity:=vk1;
    Axis.RemainingDistance:=ziel-sk1; 
ELSIF Zustand=3
THEN
    IF Axis.AxisState=2
    THEN 
        IF NOT Axis.Error
        THEN
            Done:=true;
        END_IF;
        Busy:=false;
        Zustand:=5;
    ELSIF Error_alt
    THEN
        Axis.AxisState:=8;
    ELSE 
        Axis.AxisState:=5;      
    END_IF;
ELSIF Zustand=4
THEN
    Busy:=false;
    Zustand:=5;
ELSIF Zustand=5
THEN
    IF NOT Execute
    THEN
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Busy:=false;
        Zustand:=1;
    END_IF;
END_IF;     
     
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB2 MC_MoveRelative - Move a relative distance



Name: MC_Rel
Symbolic Name: MC_MoveRelative
Symbol Comment: Move a relative distance
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 2982
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB102
TITLE ='Move a relative distance'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Rel
VERSION : '2.0'
 
 
VAR_INPUT
  Execute : BOOL ;    //Start the motion at rising edge
  Distance : REAL ;    //Relative distance for the motion [u]
  Velocity : REAL  := 1.000000e-001;    //Maximum velocity [u/s]
  Acceleration : REAL  := 1.000000e-001;    //Acceleration [u/s²]
  Deceleration : REAL  := 1.000000e-001;    //Deceleration [u/s²]
END_VAR
VAR_OUTPUT
  Busy : BOOL ;    //1=Moving
  Done : BOOL ;    //1=Distance reached
  CommandAborted : BOOL ;    //1=Command was aborted by another command
  Error : BOOL ;    //1=Error has occurred within FB
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  ziel : REAL ;    //internal use
  v_max : REAL ;    //internal use
  v_max_B AT v_max : ARRAY[0..31] OF BOOL;
  a_1 : REAL ;    //internal use
  a_1_B AT a_1 : ARRAY[0..31] OF BOOL;
  b : REAL ;    //internal use
  b_B AT b : ARRAY[0..31] OF BOOL;
  ta : REAL ;    //internal use
  taHalbe : REAL ;    //internal use
  b0 : REAL ;    //internal use
  bk1 : REAL ;    //internal use
  Zustand : INT ;    //internal use
  Bereich : INT ;    //internal use
  Coord : DINT ;    //internal use
  aufl : REAL ;    //internal use
  Error_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  over : REAL ;    //internal use
  vk : REAL ;    //internal use
  vk_B AT vk : ARRAY[0..31] OF BOOL ;
 
  sk : REAL ;    //internal use
  vk1 : REAL ;    //internal use
  sk1 : REAL ;    //internal use
  Bremsweg : REAL ;    //internal use
  Restweg : REAL ;    //internal use
  RB : REAL ;    //internal use
  vv : REAL ;    //internal use
  delta_s : REAL ;    //internal use
  v_over : REAL ;    //internal use
  Hilf_R : REAL ;    //internal use
  Hilf_DI : DINT ;    //internal use
  ZielStrich : REAL ;    //internal use
  ziel_AWK : REAL ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_w AT Err_DW : STRUCT
   w0 : WORD;
   w1 : WORD;
  END_STRUCT ;  
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
END_VAR
BEGIN
 
IF Init
THEN
    Init:=false;
    Done:=false;
    Busy:=false;
    CommandAborted:=false;
    Error:=false;
    Error_alt:=false;
    Zustand:=1;
    Bereich:=5;
    ta:=Axis.Sample_T;
    taHalbe:=ta*5.000000e-001;
    aufl:=Axis.aufl;
END_IF;     
   
IF Zustand=1
THEN
    IF NOT  Busy AND Execute
    THEN
        Busy:=true;
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Error_alt:=false;
        Coord:=Axis.Coord+1;
        a_1:=Axis.MaxAcceleration;
        b:=Axis.MaxDeceleration;
        v_max:=Axis.MaxVelocity;
        IF v_max>Velocity THEN v_max:=Velocity; END_IF;
        IF a_1>Acceleration THEN a_1:=Acceleration; END_IF;
        IF b>Deceleration THEN b:=Deceleration; END_IF;
        ziel:=Axis.LastNomPosition+Axis.InternalPosOffset+Distance;
        ziel_AWK:=ziel;
        sk:=Axis.LastNomPosition;
        vk:=Axis.LastNomVelocity;
        Restweg:=Distance;
        ziel:=Restweg;
        ZielStrich:=ziel/aufl;
        Err_DW_str:=Axis.Err;
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        Axis.Err.StartErr:=Err_DW<>DW#16#0 OR Axis.AxisState=6 OR Axis.AxisState=8 OR Axis.ManEnable;
        IF NOT Axis.Err.StartErr 
        THEN
            Axis.Err.DataErr:=  (v_max<=0.0 OR
                                 a_1<=0.0 OR
                                 b<=0.0) OR 
                                (Axis.LastNomDeceleration<>b AND
                                vk<>0.0) OR
                                ABS(ziel_AWK)>1.6777216e+007;
            Axis.Err.TargetErr:=ABS(ZielStrich)>1.6777216e+007  OR
                                (NOT Axis.AxisType AND Axis.SWLimitEnable AND Axis.Sync) AND   
                                (ziel_AWK>=Axis.AxisLimitMax OR ziel_AWK<=Axis.AxisLimitMin);
                              
        END_IF
        Err_DW_str:=Axis.Err; 
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        IF Err_DW<>DW#16#0
        THEN
            Axis.Error:=true;
            Error:=true;
            Zustand:=4;
        ELSE
            IF Axis.AxisType  
            THEN
                Hilf_DI:=Axis.LageIstwert_DI;
                Axis.LageIstwert_DI:=(Axis.LageIstwert_DI-Axis.PositionOffset) MOD
                                      Axis.AchsLaenge_DI + Axis.PositionOffset;
                Hilf_DI:=Hilf_DI-Axis.LageIstwert_DI;
                Hilf_R:=DINT_TO_REAL(Hilf_DI)*aufl;
                sk:=sk-Hilf_R;
                Axis.RundKorrektur:=Axis.RundKorrektur+Hilf_R;
                Axis.InternalActPos:=Axis.InternalActPos-Hilf_R;                     
            END_IF;
            Axis.InternalPosOffset:=Axis.InternalPosOffset+sk;
            Axis.LastInternalPosOffset:=Axis.LastInternalPosOffset+sk;
            Axis.InternalActPos:=Axis.InternalActPos-sk;
            Axis.VLastNomPosition:=Axis.VLastNomPosition-Axis.LastNomPosition;
            Axis.LastNomPosition:=0.0;
            Axis.LastNomDeceleration:=b;
           
            IF vk=0.0 
            THEN
                IF Restweg<0.0
                THEN
                    a_1:=-a_1;
                    b:=-b;
                    v_max:=-v_max;
                END_IF;
                b0:=0.0;
                bk1:=b;
            ELSE
                a_1_B[7]:=vk_B[7];
                b_B[7]:=vk_B[7];
                v_max_B[7]:=vk_B[7];
                b0:=b;
                bk1:=b;
            END_IF;
            Zustand:=2;
            Axis.Coord:=Coord;
            Axis.AxisState:=3;
        END_IF;  
    END_IF;     
END_IF;
IF Zustand=2 OR Zustand=3
THEN
    vk:=Axis.LastNomVelocity;
    sk:=Axis.LastNomPosition;
    Bremsweg:=vk*vk*0.5/bk1;
    Restweg:=ziel-sk;
    IF Axis.Error
    THEN
        Err_DW_str:=Axis.Err;
        IF Restweg>0.0 AND Err_DW_str.SWLimitMinExceeded
        THEN
            Err_DW_str.SWLimitMinExceeded:=false;
        END_IF;
        IF Restweg<0.0 AND Err_DW_str.SWLimitMaxExceeded
        THEN
            Err_DW_str.SWLimitMaxExceeded:=false;
        END_IF;
        IF Err_DW=DW#16#0 THEN Error_alt:=true; END_IF;
        IF NOT Error_alt
        THEN
            Error:=true;
            Error_alt:=true;
            IF Err_w.w1<>W#16#0
            THEN
                Zustand:=4;
            ELSE
                IF Zustand=2
                THEN
                    ziel:=sk+Bremsweg;
                    Restweg:=Bremsweg;
                END_IF;
            END_IF;
        END_IF;
    END_IF;
    IF Axis.Coord<>Coord OR Axis.ManEnable
    THEN
        CommandAborted:=true;
        Zustand:=4;
    END_IF;
END_IF;      
 
IF Zustand=2
THEN
    IF Restweg=0.0 AND vk<>0.0
    THEN
        Restweg:=-Bremsweg;
    END_IF;
    over:=ABS(Axis.Override)/100.0;
    IF over>1.0 THEN over:=1.0; END_IF;
    v_over:=v_max*over;
    IF v_over<>0.0
    THEN
        vv:=vk/v_over;
    ELSE
        vv:=2.0;
    END_IF;
    IF Bremsweg<>0.0
    THEN
        RB:=Restweg/Bremsweg;
    ELSE
        RB:=2.0;
    END_IF;
    IF Restweg<>0.0
    THEN
        IF RB>1.0
        THEN
            b0:=0.0;
            IF vv<1.0
            THEN
                Bereich:=1;
                vk1:=a_1*ta+vk;
            ELSIF vv=1.0
            THEN
                Bereich:=2;
                vk1:=vk;
            ELSE 
                Bereich:=6;
                vk1:=vk-(bk1*ta);
                IF vk1*vk<=0.0 OR
                   vk=0.0 AND
                   v_over=0.0
                THEN
                    vk1:=0.0;
                END_IF;
            END_IF;
        ELSE
            IF RB<1.0 AND b0<>0.0
            THEN
                Bereich:=4;
                bk1:=b0;
            ELSE
                Bereich:=3;
                b0:=0.0;
            END_IF;   
        END_IF;
    ELSE
        Bereich:=5;    
    END_IF;  
    IF Bereich=1 OR Bereich=2 OR Bereich=6
    THEN
        IF (vk1-v_over)*
           (vk-v_over)<=0.0 AND
           vk<>v_over
        THEN
            vk1:=v_over;
        END_IF;
        delta_s:=(vk+vk1)*taHalbe;
        Bremsweg:=vk1*vk1*0.5/bk1;
        IF Bremsweg<>0.0 AND
           vk<>0.0
        THEN
            IF ABS((Restweg-delta_s)/Bremsweg)<1.0
            THEN
                bk1:=vk*vk*0.5/Restweg;
                Bereich:=3;
            ELSE      
                bk1:=b;   
            END_IF;
        ELSE 
            bk1:=b;    
        END_IF;     
        sk1:=sk+delta_s;
    END_IF;
    IF Bereich=3
    THEN
        vk1:=vk-bk1*ta;
        IF vk1*vk<=0.0  OR
           (vk=0.0 AND
           v_over=0.0)
        THEN
            vk1:=0.0;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    ELSIF Bereich=4
    THEN
        vk1:=vk-bk1*ta;
        IF vk1*vk<=0.0
        THEN
            vk1:=0.0;
            b0:=0.0;
            a_1:=-a_1;
            b:=-b;
            bk1:=b;
            v_max:=-v_max;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    ELSIF Bereich=5
    THEN
        vk1:=0.0;
        sk1:=ziel;           
        Zustand:=3;
    END_IF;
    IF (sk1-ziel)*(sk-ziel)<=0.0 AND
       Bereich<>4
    THEN
        sk1:=ziel;
        vk1:=0.0;
    END_IF;
    Axis.InternalNomPosition:=sk1;
    Axis.NomVelocity:=vk1;
    Axis.RemainingDistance:=ziel-sk1; 
ELSIF Zustand=3
THEN
    IF Axis.AxisState=2
    THEN 
        IF NOT Axis.Error
        THEN
            Done:=true;
        END_IF;
        Busy:=false;
        Zustand:=5;
    ELSIF Error_alt
    THEN
        Axis.AxisState:=8;
    ELSE 
        Axis.AxisState:=5;      
    END_IF;
ELSIF Zustand=4
THEN
    Busy:=false;
    Zustand:=5;
ELSIF Zustand=5
THEN
    IF NOT Execute
    THEN
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Busy:=false;
        Zustand:=1;
    END_IF;
END_IF;     
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB3 MC_MoveJog - Move the axis using directional inputs (jogging)



Name: MC_Jog
Symbolic Name: MC_MoveJog
Symbol Comment: Move the axis using directional inputs (jogging)
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 3110
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB103
TITLE ='Move the axis using directional inputs (jogging)'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Jog
VERSION : '2.0'
 
 
VAR_INPUT
  JogPos : BOOL ;    //1=Jog positive
  JogNeg : BOOL ;    //1=Jog negative
  Velocity : REAL  := 1.000000e-001;    //Maximum velocity [u/s]
  Acceleration : REAL  := 1.000000e-001;    //Acceleration [u/s²]
  Deceleration : REAL  := 1.000000e-001;    //Deceleration [u/s²]
END_VAR
VAR_OUTPUT
  Busy : BOOL ;    //1=Moving
  Done : BOOL ;    //1=Motion complete
  CommandAborted : BOOL ;    //1=Command was aborted by another command
  Error : BOOL ;    //1=Error has occurred within FB
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  v_max : REAL ;    //internal use
  v_max_B AT v_max : ARRAY[0..31] OF BOOL;
  a_1 : REAL ;    //internal use
  a_1_B AT a_1 : ARRAY[0..31] OF BOOL;
  b : REAL ;    //internal use
  b_B AT b : ARRAY[0..31] OF BOOL;
  ta : REAL ;    //internal use
  taHalbe : REAL ;    //internal use
  Richtung : INT ;    //internal use
  b0 : REAL ;    //internal use
  bk1 : REAL ;    //internal use
  Grenze : REAL ;    //internal use
  Zustand : INT ;    //internal use
  Bereich : INT ;    //internal use
  Coord : DINT ;    //internal use
  aufl : REAL ;    //internal use
  AchsLaenge : REAL ;    //internal use
END_VAR
VAR_TEMP
  over : REAL ;    //internal use
  vk : REAL ;    //internal use
  vk_B AT vk : ARRAY[0..31] OF BOOL ;
  sk : REAL ;    //internal use
  vk1 : REAL ;    //internal use
  sk1 : REAL ;    //internal use
  Bremspunkt : REAL ;    //internal use
  vv : REAL ;    //internal use
  v_over : REAL ;    //internal use
  Hilf_R : REAL ;    //internal use
  Hilf_DI : DINT ;    //internal use
  RundKorrektur_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_w AT Err_DW : STRUCT
   w0 : WORD;
   w1 : WORD;
  END_STRUCT ;  
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT ;   
END_VAR
BEGIN
IF Init
THEN
    Init:=false;
    Done:=false;
    Busy:=false;
    CommandAborted:=false;
    Error:=false;
    Zustand:=1;
    Bereich:=5;
    Richtung:=0;
    ta:=Axis.Sample_T;
    taHalbe:=ta*5.000000e-001;
    aufl:=Axis.aufl;
    Grenze:=aufl*1.6777216e+007;
    AchsLaenge:=Axis.AchsLaenge;
END_IF;     
 
IF Zustand=1
THEN
    IF NOT  Busy AND (JogPos OR JogNeg)
    THEN
        Busy:=true;
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Richtung:=0;
        Coord:=Axis.Coord+1;
        a_1:=Axis.MaxAcceleration;
        b:=Axis.MaxDeceleration;
        v_max:=Axis.MaxVelocity;
        IF v_max>Velocity THEN v_max:=Velocity; END_IF;
        IF a_1>Acceleration THEN a_1:=Acceleration; END_IF;
        IF b>Deceleration THEN b:=Deceleration; END_IF;
        Err_DW_str:=Axis.Err;
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
 
        Axis.Err.StartErr:=Err_DW<>DW#16#0 OR
                           Axis.AxisState=6 OR
                           Axis.AxisState=8 OR
                           (JogPos AND JogNeg)OR
                           Axis.ManEnable;
        IF NOT Axis.Err.StartErr 
        THEN
            Err_DW_str:=Axis.Err;
            IF Err_DW_str.SWLimitMinExceeded AND JogPos
            THEN
                Err_DW_str.SWLimitMinExceeded:=false;
            END_IF;
            IF Err_DW_str.SWLimitMaxExceeded AND JogNeg
            THEN
                Err_DW_str.SWLimitMaxExceeded:=false;
            END_IF;
           
            Axis.Err.DataErr:=  (v_max<=0.0 OR
                                 a_1<=0.0 OR
                                 b<=0.0) OR 
                                (Axis.LastNomDeceleration<>b AND
                                Axis.LastNomVelocity<>0.0);
            Axis.Err.DirectionErr:=Err_DW_str.SWLimitMinExceeded OR
                                   Err_DW_str.SWLimitMaxExceeded;
                               
        END_IF
       
        Err_DW_str:=Axis.Err; 
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        IF Err_DW<>DW#16#0
        THEN
            Axis.Error:=true;
            Error:=true;
            Zustand:=4;
        ELSE 
            sk:=Axis.LastNomPosition;
            vk:=Axis.LastNomVelocity;
           
            IF Axis.AxisType
            THEN
                Hilf_DI:=Axis.LageIstwert_DI;
                Axis.LageIstwert_DI:=(Axis.LageIstwert_DI-Axis.PositionOffset) MOD
                                      Axis.AchsLaenge_DI + Axis.PositionOffset;
                Hilf_DI:=Hilf_DI-Axis.LageIstwert_DI; 
                Hilf_R:=DINT_TO_REAL(Hilf_DI)*aufl;                   
                sk:=sk-Hilf_R;
                Axis.RundKorrektur:=Axis.RundKorrektur+Hilf_R;
                Axis.InternalActPos:=Axis.InternalActPos-Hilf_R;
            END_IF;
           
            Axis.InternalPosOffset:=Axis.InternalPosOffset+sk;
            Axis.LastInternalPosOffset:=Axis.LastInternalPosOffset+sk;
            Axis.InternalActPos:=Axis.InternalActPos-sk;
            Axis.VLastNomPosition:=Axis.VLastNomPosition-Axis.LastNomPosition;
            Axis.LastNomPosition:=0.0;
            IF JogPos
            THEN
                Richtung:=1;
            END_IF;
            IF JogNeg
            THEN
                Richtung:=-1;
            END_IF;
            Axis.LastNomDeceleration:=b;
            IF vk=0.0 
            THEN
                IF Richtung=-1
                THEN
                    a_1:=-a_1;
                    b:=-b;
                    v_max:=-v_max;
                END_IF;
                b0:=0.0;
                bk1:=b;
            ELSE
                a_1_B[7]:=vk_B[7];
                b_B[7]:=vk_B[7];
                v_max_B[7]:=vk_B[7];
                b0:=b;
                bk1:=b;
                Richtung:=1;
                IF vk<0.0 
                THEN
                    Richtung:=-1;
                END_IF;   
            END_IF;
            Zustand:=2;
            Axis.Coord:=Coord;
            Axis.AxisState:=4;
            Axis.RemainingDistance:=0.0;
        END_IF;  
    END_IF;     
END_IF;
 
IF Zustand=2 OR Zustand=3
THEN
    vk:=Axis.LastNomVelocity;
    sk:=Axis.LastNomPosition;
    IF Richtung<>0
    THEN
        Bremspunkt:=vk*vk*0.5/b+sk;
        IF ABS(Bremspunkt)>=Grenze
        THEN
            Axis.Error:=true;
            Axis.Err.DistanceErr:=true;
        END_IF;
        IF NOT Axis.AxisType AND Axis.Sync AND Axis.SWLimitEnable
        THEN
            Bremspunkt:=Bremspunkt+Axis.InternalPosOffset;
            IF (Bremspunkt>=Axis.AxisLimitMax AND Richtung=1) OR
               (Richtung=-1 AND Bremspunkt<=Axis.AxisLimitMin)
            THEN
                Axis.Error:=true;
                Axis.Err.DistanceErr:=true;
            END_IF;
        END_IF;
    END_IF;
    IF Axis.Error
    THEN
        Err_DW_str:=Axis.Err;
        IF Richtung=1 AND Err_DW_str.SWLimitMinExceeded
        THEN
            Err_DW_str.SWLimitMinExceeded:=false;
        END_IF;
        IF Richtung=-1 AND Err_DW_str.SWLimitMaxExceeded
        THEN
            Err_DW_str.SWLimitMaxExceeded:=false;
        END_IF;
        IF Err_DW<>DW#16#0
        THEN
            Error:=true;
            IF Err_w.w1<>W#16#0
            THEN
                Zustand:=4;
            ELSE
                IF Zustand=2
                THEN
                    Richtung:=0;
                    b0:=0.0;
                END_IF;
            END_IF;
        END_IF;   
    END_IF;
    IF Axis.Coord<>Coord OR Axis.ManEnable
    THEN
        CommandAborted:=true;
        Zustand:=4;
    END_IF;
END_IF;
IF Zustand=2
THEN
    over:=ABS(Axis.Override)/100.0;
    IF over>1.0
    THEN
        over:=1.0;
    END_IF;
    v_over:=v_max*over;
    IF v_over<>0.0
    THEN
        vv:=vk/v_over;
    ELSE
        vv:=2.0;
    END_IF;
   
 
 
    IF (Richtung=1 AND JogPos) OR (Richtung=-1 AND JogNeg)
    THEN
        b0:=0.0;
        IF vv<1.0
        THEN
            Bereich:=1;
            vk1:=a_1*ta+vk;
       
        ELSIF vv=1.0
        THEN
            Bereich:=2;
            vk1:=vk;
        ELSE
            Bereich:=6;
            vk1:=vk-bk1*ta;
            IF vk1*vk<=0.0 OR
               (vk=0.0  AND v_over=0.0)
            THEN
                vk1:=0.0;
            END_IF;
        END_IF;
    ELSE
        IF b0<>0.0
        THEN
            Bereich:=4;
            bk1:=b0;
        ELSE
            Bereich:=3;
        END_IF;
    END_IF;
 
    IF Bereich=1 OR Bereich=2 OR Bereich=6
    THEN
        IF (vk1-v_over)*
           (vk-v_over)<=0.0 AND
           vk<>v_over
        THEN
            vk1:=v_over;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    END_IF;
    IF Bereich=3
    THEN
        vk1:=vk-bk1*ta;
        IF vk1*vk<=0.0 OR
           (vk=0.0 AND v_over=0.0)
        THEN
            vk1:=0.0;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
        IF vk1=0.0 AND v_over<>0.0
        THEN
            Zustand:=3;
            Bereich:=5;
        END_IF;
       
    ELSIF Bereich=4
    THEN
        vk1:=vk-bk1*ta;
        IF vk1*vk<=0.0
        THEN
            vk1:=0.0;
            b0:=vk1;
            a_1:=-a_1;
            b:=-b;
            bk1:=b;
            v_max:=-v_max;
            Richtung:=-Richtung;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    END_IF;
   
    IF Axis.AxisType
    THEN
        IF ABS(sk1)>=AchsLaenge
        THEN
            RundKorrektur_DI:=TRUNC(sk1/AchsLaenge);
            Axis.LageIstwert_DI:=Axis.LageIstwert_DI-RundKorrektur_DI*Axis.AchsLaenge_DI;
            Axis.RundKorrektur:=DINT_TO_REAL(RundKorrektur_DI)*AchsLaenge;
            sk1:=sk1-Axis.RundKorrektur;
            Axis.LastNomPosition:=Axis.LastNomPosition-Axis.RundKorrektur;
            Axis.VLastNomPosition:=Axis.VLastNomPosition-Axis.RundKorrektur;
            Axis.InternalActPos:=Axis.InternalActPos-Axis.RundKorrektur;
        END_IF;
    END_IF;
    Axis.InternalNomPosition:=sk1;
    Axis.NomVelocity:=vk1;
       
ELSIF Zustand=3
THEN
    IF Axis.AxisState=2
    THEN 
        IF NOT Axis.Error
        THEN
            Done:=true;
        END_IF;
        Busy:=false;
        Zustand:=5;
    ELSIF Error
    THEN
        Axis.AxisState:=8;
    ELSE 
        Axis.AxisState:=5;      
    END_IF;
ELSIF Zustand=4
THEN
    Busy:=false;
    Richtung:=0;
    Zustand:=5;
ELSIF Zustand=5
THEN
    IF (NOT JogPos AND Richtung=1) OR
       (NOT JogNeg AND Richtung=-1) OR
       (NOT JogPos AND NOT JogNeg)
    THEN
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Busy:=false;
        Zustand:=1;
    END_IF;
END_IF;     
 
END_FUNCTION_BLOCK
 



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB4 MC_Home - Reference search / setting



Name: MC_Home
Symbolic Name: MC_Home
Symbol Comment: Reference search / setting
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 2886
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB104
TITLE ='Reference search / setting'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Home
VERSION : '2.0'
 
 
VAR_INPUT
  Execute : BOOL ;    //Start the motion / set reference point at rising edge
  Position : REAL ;    //Reference point coordinate [u]
  Velocity : REAL ;    //Maximum velocity [u/s]
  Acceleration : REAL  := 1.000000e-001;    //Acceleration [u/s²]
  Deceleration : REAL  := 1.000000e-001;    //Deceleration [u/s²]
  Direction : INT  := 1;    //Initial direction: 1=positive, -1=negative
END_VAR
VAR_OUTPUT
  Busy : BOOL ;    //1=Referencing
  Done : BOOL ;    //1=Standstill has been reached / Function completed
  CommandAborted : BOOL ;    //1=Command was aborted by another command
  Error : BOOL ;    //1=Error has occurred within FB
END_VAR
VAR_IN_OUT
  Axis : UDT1;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  v_max : REAL ;    //internal use
  a_1 : REAL ;    //internal use
  b : REAL ;    //internal use
  ta : REAL ;    //internal use
  taHalbe : REAL ;    //internal use
  Zustand : INT ;    //internal use
  Bereich : INT ;    //internal use
  Coord : DINT ;    //internal use
  Grenze : REAL ;    //internal use
  aufl : REAL ;    //internal use
  Error_alt : BOOL ;    //internal use
  DoneRef_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  over : REAL ;    //internal use
  vk : REAL ;    //internal use
  sk : REAL ;    //internal use
  vk1 : REAL ;    //internal use
  sk1 : REAL ;    //internal use
  vv : REAL ;    //internal use
  v_over : REAL ;    //internal use
  Bremspunkt : REAL ;    //internal use
  Hilf_R : REAL ;    //internal use
  Hilf_DI : DINT ;    //internal use
  StrichZahl : REAL ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_w AT Err_DW : STRUCT
   w0 : WORD;
   w1 : WORD;
  END_STRUCT ;  
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
END_VAR
BEGIN
 
IF Init
THEN
    Init:=false;
    Done:=false;
    Busy:=false;
    CommandAborted:=false;
    Error:=false;
    Error_alt:=false;
    Zustand:=1;
    Bereich:=5;
    ta:=Axis.Sample_T;
    taHalbe:=ta*5.000000e-001;
    aufl:=Axis.aufl;
    Grenze:=aufl*1.6777216e+007;
END_IF;     
 
IF Zustand=7 OR Zustand=2 OR Zustand=3 OR  Zustand=6
THEN
    vk:=Axis.LastNomVelocity;
    sk:=Axis.LastNomPosition;
    IF Axis.ExecRef<>0
    THEN
        Bremspunkt:=vk*vk*0.5/b+sk;
        IF ABS(Bremspunkt)>=Grenze
        THEN
            Axis.Error:=true;
            Axis.Err.DistanceErr:=true;
        END_IF;
    END_IF;
    IF Axis.Error
    THEN
        Err_DW_str:=Axis.Err;
        IF NOT Error_alt
        THEN
            Error:=true;
            Error_alt:=true;
            IF Err_w.w1<>W#16#0
            THEN
                Zustand:=4;
            ELSE
                IF Zustand=2
                THEN
                    Axis.ExecRef:=0;
                END_IF;
            END_IF;
        END_IF;   
    END_IF;
    IF Axis.Coord<>Coord OR Axis.ManEnable
    THEN
        CommandAborted:=true;
        Zustand:=4;
    END_IF;   
END_IF;
 
IF Zustand=1
THEN
    IF NOT Busy AND Execute
    THEN
        Busy:=true;
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Error_alt:=false;
        DoneRef_alt:=false;
        Coord:=Axis.Coord+1;
        a_1:=Axis.MaxAcceleration;
        b:=Axis.MaxDeceleration;
        v_max:=Axis.MaxVelocity;
        IF v_max>Velocity THEN v_max:=Velocity; END_IF;
        IF a_1>Acceleration THEN a_1:=Acceleration; END_IF;
        IF b>Deceleration THEN b:=Deceleration; END_IF;
        Err_DW_str:=Axis.Err;
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        Axis.Err.StartErr:=Err_DW<>DW#16#0 OR Axis.AxisState<>2 OR Axis.ManEnable;
       
        IF NOT Axis.Err.StartErr
        THEN
            StrichZahl:=Position/aufl;
            IF ABS(StrichZahl)>2.147483648e+009
            THEN
                Axis.Err.DataErr:=true;
            ELSE
                StrichZahl:=DINT_TO_REAL(ROUND(StrichZahl))*aufl;
                Axis.Err.DataErr:=v_max<0.0 OR
                                  v_max>0.0 AND (a_1<=0.0 OR b<=0.0 OR Axis.EncoderType) OR
                                  ABS(StrichZahl)>1.6777216e+007;
                Axis.Err.TargetErr:=(NOT Axis.AxisType AND Axis.SWLimitEnable) AND
                                    (StrichZahl>=Axis.AxisLimitMax OR StrichZahl<=Axis.AxisLimitMin) OR
                                    (StrichZahl>=Axis.AxisLimitMax OR StrichZahl<Axis.AxisLimitMin) AND
                                    Axis.AxisType;
            END_IF;
        END_IF;
   
        Err_DW_str:=Axis.Err;
        Err_DW_str.SWLimitMinExceeded:=false;
        Err_DW_str.SWLimitMaxExceeded:=false;
        IF Err_DW<>DW#16#0
        THEN
            Axis.Error:=true;
            Error:=true;
            Zustand:=4;
        ELSE
            Axis.Sync:=false;
            Axis.RemainingDistance:=0.0;
            Axis.RefPoint:=StrichZahl;
            Axis.AxisState:=9;
            Axis.Coord:=Coord;
            IF v_max=0.0
            THEN
                Zustand:=6;
                Axis.ExecRef:=1;
            ELSE
                Zustand:=7;
                Axis.ExecRef:=2;
                sk:=Axis.LastNomPosition;
                IF Axis.AxisType
                THEN
                    Hilf_DI:=Axis.LageIstwert_DI;
                    Axis.LageIstwert_DI:=(Axis.LageIstwert_DI-Axis.PositionOffset) MOD
                                          Axis.AchsLaenge_DI+Axis.PositionOffset;
                    Hilf_DI:=Hilf_DI-Axis.LageIstwert_DI;
                    Hilf_R:=DINT_TO_REAL(Hilf_DI)*aufl;
                    sk:=sk-Hilf_R;
                    Axis.InternalActPos:=Axis.InternalActPos-Hilf_R;
                END_IF;
                Axis.InternalPosOffset:=Axis.InternalPosOffset+sk;
                Axis.InternalActPos:=Axis.InternalActPos-sk;
                Axis.InternalNomPosition:=0.0;
                Axis.LastNomPosition:=0.0;
                Axis.LastNomDeceleration:=b;
                IF Direction<=-1
                THEN
                    a_1:=-a_1;
                    b:=-b;
                    v_max:=-v_max;
                END_IF;
            END_IF;
        END_IF;
    END_IF;
ELSIF Zustand=6
THEN
    IF Axis.DoneRef
    THEN
        Axis.ExecRef:=0;
        Zustand:=8;
    END_IF;
ELSIF Zustand=8
THEN
    Axis.Sync:=true;
    Done:=true;
    Busy:=false;
    Zustand:=5;
    Axis.AxisState:=2;
ELSIF Zustand=7
THEN
    IF Axis.EintreiberFahrbereit
    THEN
        Zustand:=2;
    END_IF;
    IF Axis.DoneRef
    THEN
        Axis.ExecRef:=0;
        Zustand:=8;
    END_IF;
ELSIF Zustand=2
THEN
    IF Axis.DoneRef
    THEN
        Axis.ExecRef:=0;
    END_IF;
    over:=ABS(Axis.Override)/100.0;
    IF over>1.0
    THEN
        over:=1.0;
    END_IF;
    v_over:=v_max*over;
    IF v_over<>0.0
    THEN
        vv:=vk/v_over;
    ELSE
        vv:=2.0;
    END_IF;
    IF Axis.ExecRef<>0
    THEN
        IF vv<1.0
        THEN
            Bereich:=1;
            vk1:=a_1*ta+vk;
        ELSIF vv=1.0
        THEN
            Bereich:=2;
            vk1:=vk;
        ELSE
            Bereich:=6;
            vk1:=vk-b*ta;
            IF vk1*vk<=0.0 OR
               (vk=0.0 AND v_over=0.0)
            THEN
                vk1:=0.0;
            END_IF;
        END_IF;
    ELSE
        IF NOT DoneRef_alt AND Axis.DoneRef
        THEN
            Bereich:=7;
            DoneRef_alt:=true;
        ELSE
            Bereich:=3;
        END_IF;
    END_IF;
    IF Bereich=1 OR Bereich=2 OR Bereich=6
    THEN
        IF (vk1-v_over)*(vk-v_over)<=0.0 AND vk<>v_over
        THEN
            vk1:=v_over;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
    END_IF;   
   
    IF Bereich=3
    THEN
        vk1:=vk-b*ta;
        IF vk1*vk<=0.0 OR (vk=0.0 AND v_over=0.0)
        THEN
            vk1:=0.0;
        END_IF;
        sk1:=(vk+vk1)*taHalbe+sk;
        IF vk1=0.0 AND v_over<>0.0
        THEN
            Zustand:=3;
            Bereich:=5;
        END_IF;
       
    ELSIF Bereich=7
    THEN
        vk1:=vk;
        sk1:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*aufl+sk;
    END_IF;
    Axis.InternalNomPosition:=sk1;
    Axis.NomVelocity:=vk1;
   
ELSIF Zustand=3
THEN
    IF Axis.AxisState=2
    THEN
        IF NOT Axis.Error
        THEN
            Done:=true;
            Axis.Sync:=true;
        END_IF;
        Busy:=false;
        Zustand:=5;
    ELSIF Error_alt
    THEN
        Axis.AxisState:=8;
    ELSE
        Axis.AxisState:=5;
    END_IF;
 
ELSIF Zustand=4
THEN
    Busy:=false;
    Axis.ExecRef:=0;
    Zustand:=5;
 
ELSIF Zustand=5
THEN
    IF NOT Execute
    THEN
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Busy:=false;
        Zustand:=1;
    END_IF;
END_IF
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB5 MC_StopMotion - Stop any motion

Name: MC_Stop
Symbolic Name: MC_StopMotion
Symbol Comment: Stop any motion
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 1114
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB105
TITLE ='Stop any motion'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Stop
VERSION : '2.0'
 
 
VAR_INPUT
  Execute : BOOL ;    //Start the action at rising edge
  Deceleration : REAL ;    //Deceleration [u/s²]
END_VAR
VAR_OUTPUT
  Busy : BOOL ;    //1=Moving
  Done : BOOL ;    //1=Zero velocity has been reached
  CommandAborted : BOOL ;    //1=Command was aborted by manual mode
  Error : BOOL ;    //1=Error has occurred within FB
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  ziel : REAL ;    //internal use
  b : REAL ;    //internal use
  taHalbe : REAL ;    //internal use
  Zustand : INT ;    //internal use
  Coord : DINT ;    //internal use
END_VAR
VAR_TEMP
  Err_DW : DWORD ;    //internal use
  Err_w AT Err_DW : STRUCT
   w0 : WORD;
   w1 : WORD;
  END_STRUCT ;  
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;    
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
END_VAR
BEGIN
 
IF Init
THEN
    Init:=false;
    Done:=false;
    Busy:=false;
    CommandAborted:=false;
    Error:=false;
    Zustand:=1;
END_IF;
 
IF Zustand=1 THEN
    IF NOT Busy AND Execute THEN
        Busy:=true;
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        taHalbe:=Axis.Sample_T*0.5;
        Coord:=Axis.Coord+1;
        b:=Axis.MaxDeceleration;
        IF Deceleration>0.0 THEN
            b:=Deceleration;
            IF Axis.LastNomDeceleration>b AND Axis.LastNomVelocity<>0.0 THEN
                b:=Axis.LastNomDeceleration;
            END_IF;
        END_IF;
        IF Axis.AxisState=1 OR
          (Axis.AxisState>=6 AND Axis.AxisState<=8) OR
          Axis.ManEnable
        THEN
            Axis.Err.StartErr:=true;
            Axis.Error:=true;
            Error:=true;
            Zustand:=4;
        ELSE
            Zustand:=2;
            Axis.Coord:=Coord;
            Axis.AxisState:=6;
            Axis.LastNomDeceleration:=b;
            IF Axis.LastNomVelocity<0.0 THEN
                b:=-b;
            END_IF;
            ziel:=Axis.LastNomVelocity*Axis.LastNomVelocity*0.5/b+Axis.LastNomPosition;
            IF Axis.RemainingDistance<>0.0 THEN
                Axis.RemainingDistance:=Axis.InternalNomPosition-Axis.LastNomPosition+Axis.RemainingDistance;
            END_IF;
        END_IF
    END_IF;
END_IF;   
 
IF Zustand=2 OR Zustand=3 THEN
    IF Axis.Error THEN
        Err_DW_str:=Axis.Err;
        IF Err_w.w1<>w#16#0 THEN
           Zustand:=4;
           Error:=true;
        END_IF;
    END_IF;
    IF Axis.ManEnable THEN
       Zustand:=4;
       CommandAborted:=true;
    END_IF;
END_IF;   
 
IF Zustand=2 THEN
    Axis.NomVelocity:=Axis.LastNomVelocity-b*Axis.Sample_T;
    IF Axis.NomVelocity*Axis.LastNomVelocity<=0.0 THEN
        Axis.NomVelocity:=0.0;
    END_IF;
    Axis.InternalNomPosition:=(Axis.LastNomVelocity+Axis.NomVelocity)*taHalbe+Axis.LastNomPosition;
    IF Axis.NomVelocity=0.0 THEN
        Axis.InternalNomPosition:=ziel;
        Zustand:=3;
    END_IF;
    IF Axis.RemainingDistance<>0.0 THEN
        Axis.RemainingDistance:=Axis.RemainingDistance-(Axis.InternalNomPosition-Axis.LastNomPosition);
    END_IF;
 
ELSIF Zustand=3 THEN 
    IF Axis.AxisState=2 THEN
        IF NOT Axis.Err.TargetApproachErr THEN
            Done:=true;
        END_IF;
        Busy:=false;
        Zustand:=5;
    ELSE
        Axis.AxisState:=8;
    END_IF;     
 
ELSIF Zustand=4 THEN     
        Busy:=false;
        Zustand:=5;
 
ELSIF Zustand=5 THEN     
    IF NOT Execute THEN
        Done:=false;
        CommandAborted:=false;
        Error:=false;
        Busy:=false;
        Zustand:=1;
    END_IF;
END_IF;
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB11 MC_Control - Position control

Make by Thomas Wiens



Name: MC_Ctrl
Symbolic Name: MC_Control
Symbol Comment: Position control
Family: EMC2
Version: 2.1
Author: EMC
Last modified: 12/03/2009
Use: UDT1
Size in work memory: 1772
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB111
 
TITLE = 'Position control'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Ctrl
VERSION : '2.1'
 
VAR_INPUT
    EnableDrive : BOOL;                 //1=Drive enable request
END_VAR
VAR_OUTPUT
    DriveEnabled : BOOL;                //1=Drive enable set
END_VAR
VAR_IN_OUT
    Axis : UDT1;                        //Global axis data
    Init : BOOL  := true;               //1=Initialize block
END_VAR
VAR
    t : REAL;                           //internal use
    ta : REAL;                          //internal use
    ErrorAck_alt : BOOL;                //internal use
    Sim_alt : BOOL;                     //internal use
END_VAR
VAR_TEMP
    Err_DW : DWORD;                     //internal use
    Err_w AT Err_DW : STRUCT
        w0 : WORD;
        w1 : WORD;
    END_STRUCT;
    Err_DW_str AT Err_DW : STRUCT
        SWLimitMinExceeded : BOOL;      //1=SW-Endschalter Anfang überfahren
        SWLimitMaxExceeded : BOOL;      //1=SW-Endschalter Ende überfahren
        TargetErr : BOOL;               //1=Ziel außerhalb des Verfahrbereichs
        NoSync : BOOL;                  //1=Achse nicht synchronisiert
        DirectionErr : BOOL;            //1=Fahrt in vorgegebene Richtung unzulässig
        DataErr : BOOL;                 //1=Parameter eines Fahr-FBs unzulässig
        StartErr : BOOL;                //1=Start im aktuellen Achszustand nicht möglich
        DistanceErr : BOOL;             //1=max. Fahrweg überschritten (Fahrt ohne Ziel)
        MasterErr : BOOL;               //1=Leitachse mit hartem Fehler oder in falschem Achsstatus
        bit09 : BOOL;
        bit10 : BOOL;
        bit11 : BOOL;
        bit12 : BOOL;
        bit13 : BOOL;
        bit14 : BOOL;
        bit15 : BOOL;
        StoppedMotion : BOOL;           //1=Achse im quittierpflichtigen Stop-Zustand
        EnableDriveErr : BOOL;          //1=Antriebsfreigabe fehlt
        FollowingDistErr : BOOL;        //1=Max. Schleppabstand überschritten
        StandstillErr : BOOL;           //1=Stillstandsbereich verlassen
        TargetApproachErr : BOOL;       //1=Fehler beim Zieleinlauf
        EncoderErr : BOOL;              //1=Geberfehler
        OutputErr : BOOL;               //1=Fehler am Ausgangstreiber
        ConfigErr : BOOL;               //1=Achsdaten fehlerhaft parametriert
        DriveErr : BOOL;                //1=Antriebsfehler
        bit25 : BOOL;
        bit26 : BOOL;
        bit27 : BOOL;
        bit28 : BOOL;
        bit29 : BOOL;
        bit30 : BOOL;
        bit31 : BOOL;
    END_STRUCT ;
    Init_DW : DWORD;                    //internal use
    Init_DW_str AT Init_DW : STRUCT     //Initialisierungsbits für 32 Bausteine
        I0 : BOOL;                      //Init bit 0
        I1 : BOOL;                      //Init bit 1
        I2 : BOOL;                      //Init bit 2
        I3 : BOOL;                      //Init bit 3
        I4 : BOOL;                      //Init bit 4
        I5 : BOOL;                      //Init bit 5
        I6 : BOOL;                      //Init bit 6
        I7 : BOOL;                      //Init bit 7
        I8 : BOOL;                      //Init bit 8
        I9 : BOOL;                      //Init bit 9
        I10 : BOOL;                     //Init bit 10
        I11 : BOOL;                     //Init bit 11
        I12 : BOOL;                     //Init bit 12
        I13 : BOOL;                     //Init bit 13
        I14 : BOOL;                     //Init bit 14
        I15 : BOOL;                     //Init bit 15
        I16 : BOOL;                     //Init bit 16
        I17 : BOOL;                     //Init bit 17
        I18 : BOOL;                     //Init bit 18
        I19 : BOOL;                     //Init bit 19
        I20 : BOOL;                     //Init bit 20
        I21 : BOOL;                     //Init bit 21
        I22 : BOOL;                     //Init bit 22
        I23 : BOOL;                     //Init bit 23
        I24 : BOOL;                     //Init bit 24
        I25 : BOOL;                     //Init bit 25
        I26 : BOOL;                     //Init bit 26
        I27 : BOOL;                     //Init bit 27
        I28 : BOOL;                     //Init bit 28
        I29 : BOOL;                     //Init bit 29
        I30 : BOOL;                     //Init bit 30
        I31 : BOOL;                     //Init bit 31
    END_STRUCT ;
END_VAR
//========================================================
BEGIN
 
IF Init THEN
    Init := false;
    ErrorAck_alt := false;
    Sim_alt := Axis.Sim;
    t := 0.0;
    Axis.OutVelocity := 0.0;
    Axis.FollowingDistance := 0.0;
    ta := Axis.Sample_T;
END_IF;
 
IF Axis.Error THEN
    Err_DW_str := Axis.Err;
    Err_DW_str.ConfigErr := false;
    Err_DW_str.SWLimitMinExceeded := false;
    Err_DW_str.SWLimitMaxExceeded := false;
    IF (Err_DW <> DW#16#0) THEN
        IF (NOT ErrorAck_alt AND Axis.ErrorAck) THEN
            ErrorAck_alt := true;
        ELSIF ((Axis.ErrorAck AND ErrorAck_alt) AND
            NOT Axis.EinInitLaeuft AND NOT Axis.AusInitLaeuft AND
            NOT Axis.EinQuittungLaeuft AND NOT Axis.AusQuittungLaeuft AND
            (Axis.AxisState <= 2)) THEN
            IF (Err_w.w1 <> W#16#0) THEN
                Axis.InternalNomPosition := Axis.InternalActPos;
                Axis.LastNomPosition := Axis.InternalActPos;
            END_IF;
            Err_DW := DW#16#0;
            Err_DW_str.ConfigErr := Axis.Err.ConfigErr;
            Err_DW_str.SWLimitMinExceeded := Axis.Err.SWLimitMinExceeded;
            Err_DW_str.SWLimitMaxExceeded := Axis.Err.SWLimitMaxExceeded;
            Axis.Err := Err_DW_str;
            Axis.Error := (Err_DW <> DW#16#0);
            Axis.ErrorAck := false;
            ErrorAck_alt := false;
            Axis.AxisState := 2;
        END_IF;
    ELSE
        Axis.ErrorAck := false;
        ErrorAck_alt := false;
    END_IF;
ELSE
    Axis.ErrorAck := false;
    ErrorAck_alt := false;
END_IF;
 
IF NOT EnableDrive THEN
    Axis.Err.EnableDriveErr := true;
    Axis.Error := true;
END_IF;
 
IF (Axis.Sim XOR Sim_alt) THEN
    Axis.AxisState := 1;
    Axis.Error := true;
    Axis.Err.StoppedMotion := true;
    Sim_alt := Axis.Sim;
    Init_DW := DW#16#FFFFFFFF;
    Axis.Init := Init_DW_str;
END_IF;
 
IF Axis.Error THEN
    Err_DW_str := Axis.Err;
    IF (Err_w.w1 <> W#16#0) THEN
        IF (Axis.AxisState <= 2) THEN
            Axis.AxisState := 1;
        ELSE
            IF (Axis.AxisState <> 7) THEN
                Axis.AxisState := 7;
                Axis.Coord := Axis.Coord + 1;
                IF (ABS(Axis.OutVelocity) >= ABS(Axis.NomVelocity)) THEN
                    Axis.OutVelocity := Axis.NomVelocity;
                END_IF;
            END_IF;
        END_IF;
    END_IF;
END_IF;
 
IF NOT Axis.ManEnable THEN
    IF (Axis.AxisState <> 1 AND Axis.AxisState <> 7) THEN
        Axis.FollowingDistance := Axis.InternalNomPosition - Axis.InternalActPos;
        IF (ABS(Axis.FollowingDistance) > Axis.MaxFollowingDist) THEN
            Axis.Err.FollowingDistErr := true;
            Axis.Error := true;
        END_IF;
        Axis.OutVelocity := ABS(Axis.FactorP) * Axis.FollowingDistance;
        IF (Axis.AxisState = 2) THEN
            IF (ABS(Axis.FollowingDistance) > Axis.StandstillRange) THEN
                Axis.Err.StandstillErr := true;
                Axis.Error := true;
            END_IF;
        ELSIF (Axis.AxisState = 5 OR Axis.AxisState = 8) THEN
            IF Axis.MonitorTargetAppr THEN
                IF (ABS(Axis.FollowingDistance) > Axis.TargetRange) THEN
                    IF (t > Axis.MonTimeTargetAppr) THEN
                        Axis.Err.TargetApproachErr := true;
                        Axis.Error := true;
                        t := 0.0;
                    ELSE
                        t := t + ta;
                    END_IF;
                ELSE
                    t := 0.0;
                    Axis.AxisState := 2;
                END_IF;
            ELSE
                t := 0.0;
                Axis.AxisState := 2;
            END_IF;
        END_IF;
    ELSIF (Axis.AxisState = 7) THEN
        Axis.RemainingDistance := 0.0;
        Axis.FollowingDistance := 0.0;
        IF (Axis.OutVelocity > 0.0) THEN
            Axis.OutVelocity := (Axis.OutVelocity - (Axis.EmergencyDec * ta));
            IF (Axis.OutVelocity <= 0.0) THEN
                Axis.OutVelocity := 0.0;
                Axis.AxisState := 1;
            END_IF;
        ELSE
            Axis.OutVelocity := ((Axis.EmergencyDec * ta) + Axis.OutVelocity);
            IF (Axis.OutVelocity >= 0.0) THEN
                Axis.OutVelocity := 0.0;
                Axis.AxisState := 1;
            END_IF;
        END_IF;
    ELSIF (Axis.AxisState = 1) THEN
        Axis.InternalNomPosition := Axis.InternalActPos;
        Axis.LastNomPosition := Axis.InternalActPos;
        Axis.NomVelocity := 0.0;
        Axis.OutVelocity := 0.0;
        Axis.RemainingDistance := 0.0;
        Axis.FollowingDistance := 0.0;
        Axis.Error := true;
        Axis.Err.StoppedMotion := true;
    END_IF;
    DriveEnabled := ((Axis.AxisState <> 1) AND EnableDrive);
ELSE
    Axis.OutVelocity := Axis.ManVelocity;
    IF (ABS(Axis.ManVelocity) > Axis.MaxVelocity) THEN
        Axis.OutVelocity := ((Axis.ManVelocity / ABS(Axis.ManVelocity)) * Axis.MaxVelocity);
    END_IF;
    Axis.InternalNomPosition := Axis.InternalActPos;
    Axis.LastNomPosition := Axis.InternalActPos;
    Axis.NomVelocity := 0.0;
    Axis.LastNomVelocity := 0.0;
    Axis.RemainingDistance := 0.0;
    Axis.FollowingDistance := 0.0;
    DriveEnabled := EnableDrive;
END_IF;
 
Axis.VLastNomPosition := Axis.LastNomPosition;
Axis.LastNomPosition := Axis.InternalNomPosition;
Axis.VLastNomVelocity := Axis.LastNomVelocity;
Axis.LastNomVelocity := Axis.NomVelocity;
Axis.LastInternalPosOffset := Axis.InternalPosOffset;
Axis.LastRundKorrektur := Axis.RundKorrektur;
Axis.RundKorrektur := 0.0;
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB12 MC_Simulation - Simulate axis



Name: MC_Sim
Symbolic Name: MC_Simulation
Symbol Comment: Simulate axis
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 410
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB112
TITLE ='Simulate axis'
AUTHOR : EMC
FAMILY : EMC2
NAME : MC_Sim
VERSION : '2.0'
 
 
VAR_IN_OUT
  Axis : UDT1 ;    //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Raster : BOOL ;    //internal use
  Bitanzahl : INT  := 12;    //internal use
  LageDiff_R : REAL ;    //internal use
  Faktor : REAL ;    //internal use
  AusFaktor : REAL ;    //internal use
  WertBei10V : REAL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI_alt : DINT ;    //internal use
  v : REAL ;    //internal use
  v_B AT v : ARRAY[0..31] OF BOOL;
  vz : BOOL ;    //internal use
END_VAR
BEGIN
 
IF Init THEN
    Init:=false;
    Axis.OutVelocity:=0.0;
    LageDiff_R:=0.0;
    WertBei10V:=EXP(INT_TO_REAL(Bitanzahl)*6.931472e-001);
    Faktor:=Axis.DriveInputAtMaxVel/Axis.MaxVelocity*WertBei10V/Axis.DriveInputAt100;
    AusFaktor:=Faktor*INT_TO_REAL(Axis.PolarityEncoder);
END_IF;
 
IF Axis.Sim THEN
    v:=Axis.OutVelocity*AusFaktor;
    IF ABS(v)>WertBei10V THEN
        vz:=v_B[7];
        v:=WertBei10V;
        v_B[7]:=vz;
    END_IF;
   
    IF Raster THEN
        v:=DINT_TO_REAL(ROUND(v))/Faktor;
    ELSE
        v:=v/Faktor;
    END_IF;
    LageDiff_R:=v*Axis.Sample_T+LageDiff_R;
    Geber_DI_alt:=Axis.EncoderValue;
    Axis.EncoderValue:=ROUND(LageDiff_R/Axis.aufl)+Axis.EncoderValue;
    LageDiff_R:=LageDiff_R-DINT_TO_REAL(Axis.EncoderValue-Geber_DI_alt)*Axis.aufl;
    IF Axis.EncoderType THEN
        Axis.EncoderValue:=Axis.EncoderValue MOD Axis.AbsGeberLaenge_DI;
    END_IF;
END_IF;
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB21 EncoderIM178 - Input driver for IM178-4



Name: EncIM178
Symbolic Name: EncoderIM178
Symbol Comment: Input driver for IM178-4
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 2210
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB121
TITLE ='Input driver for IM178-4'
AUTHOR : EMC
FAMILY : EMC2
NAME : EncIM178
VERSION : '2.0'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
  RefMode : BOOL ;    //Referencing: 0=with I0, 1=with I1 and zero mark
END_VAR
VAR_OUTPUT
  DI_0 : BOOL ;    //Digital input 0
  DI_1 : BOOL ;    //Digital input 1
  DI_2 : BOOL ;    //Digital input 2
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Status : STRUCT    
   REF1_Q : BOOL ;    //1=Acknowledgment for actual reference value detection with I1 and zero mark
   REF0_Q : BOOL ;    //1=Acknowledgment for actual reference value detection with I0
   SYN_Q : BOOL ;    //1=Acknowledgment for synchronization
   bit11 : BOOL ;   
   DIR : BOOL ;    //Direction of movement (0=negative direction,1=positive direction)
   SYNC : BOOL ;    //1=Actual value synchronized
   PARA : BOOL ;    //1=Channel parameter assignment errorfree
   bit15 : BOOL ;   
   DI_0 : BOOL ;    //Digital input 0
   DI_1 : BOOL ;    //Digital input 1
   DI_2 : BOOL ;    //Digital input 2
   bit03 : BOOL ;   
   EXTF0 : BOOL ;    //1=Sensor signal cable error
   EXTF1 : BOOL ;    //1=Sensor error
   EXTF2 : BOOL ;    //1=Zero mark error
   bit07 : BOOL ;   
  END_STRUCT ;   
  Status_w AT Status : WORD;
  GeberAlt_DI : DINT ;    //internal use
  Addr_Status : INT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  Addr_RefPos_DI : INT ;    //internal use
  Addr_Steuer : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  Steuer_W : WORD ;    //internal use
  Steuer_byte AT Steuer_W : ARRAY[0..1] OF BYTE;
  Steuer_bool AT Steuer_W : ARRAY[0..15] OF BOOL;
  RefPointInt : REAL ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  aufl : REAL ;    //internal use
  AxisLimitMin : REAL ;    //internal use
  AxisLimitMax : REAL ;    //internal use
  PositionOffset : DINT ;    //internal use
  EncoderType : BOOL ;    //internal use
  EncErr_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Addr_InChannel : INT ;    //internal use
  Addr_OutChannel : INT ;    //internal use
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT ;
  GeberAmAchsende : DINT ;    //internal use
  GeberAmAchsanfang : DINT ;    //internal use
  Hilf_DI : DINT ;    //internal use
  Sim : BOOL ;    //internal use
END_VAR
BEGIN
 
IF  NOT Init AND NOT EncErr  AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Addr_InChannel:=Axis.InputChannelNo*12+Axis.InputModuleInAddr;
    Addr_Status:=Addr_InChannel;
    Addr_ActPos_DI:=Addr_InChannel+4;
    Addr_RefPos_DI:=Addr_InChannel+8;
    Addr_OutChannel:=Axis.OutputChannelNo*4+Axis.OutputModuleOutAddr;
    Addr_Steuer:=Addr_OutChannel+1;
    Steuer_byte[1]:=B#16#0;
    Status_w:=W#16#0;
    Axis.EinQuittungLaeuft:=false;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;
    Axis.ExecRef:=0;
    RefPointInt:=Axis.RefPoint;
    aufl:=Axis.aufl;
    v_Faktor:=aufl/Axis.Sample_T;
    Richtungsanpassung:=Axis.PolarityEncoder;
    AxisLimitMin:=Axis.AxisLimitMin;
    AxisLimitMax:=Axis.AxisLimitMax;
    EncoderType:=Axis.EncoderType;
    IF NOT EncoderType THEN
        Axis.Sync:=false;
    ELSE
        MaxZahl:=Axis.AbsGeberLaenge_DI;
        MaxZahlHalb:=MaxZahl/2;
    END_IF;
END_IF;   
   
Sim:=Axis.Sim;
 
IF Sim OR EncErr THEN
    Status_w:=Status_w OR W#16#4000;
ELSE
    Status_w  :=PIW[Addr_Status];
    Axis.EncoderValue:=DWORD_TO_DINT(PID[Addr_ActPos_DI]);
END_IF;
 
DI_0:=Status.DI_0;
DI_1:=Status.DI_1;
DI_2:=Status.DI_2;
 
Geber_DI:=Axis.EncoderValue;
 
IF NOT Status.PARA OR EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    IF EncErr THEN
        EncErr_alt:=true;
    END_IF;
    IF NOT EncoderType THEN
        Axis.Sync:=false;
    END_IF;
END_IF;
 
IF Status.EXTF0 OR Status.EXTF1 OR Status.EXTF2 THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    IF NOT EncoderType THEN
        Axis.Sync:=false;
    END_IF;
 
    Steuer_byte[1]:=Steuer_byte[1] AND B#16#80;       
    IF NOT Steuer_bool[15] THEN
        Steuer_bool[15]:=Axis.ErrorAck;
        Axis.EinQuittungLaeuft:=Axis.ErrorAck;
    END_IF;   
ELSE
    Steuer_bool[15]:=false;
    Axis.EinQuittungLaeuft:=false;
END_IF;
 
IF NOT EncErr THEN
    IF Init THEN
        Axis.LageIstwert_DI:=Geber_DI;
        GeberAlt_DI:=Geber_DI;
        PositionOffset:=Axis.PositionOffset;
        IF EncoderType THEN
            GeberAmAchsanfang:=ROUND((AxisLimitMin-RefPointInt)/aufl*INT_TO_REAL(Richtungsanpassung)+
                               DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl)) MOD MaxZahl;
            GeberAmAchsende:=ROUND((AxisLimitMax-RefPointInt)/aufl*INT_TO_REAL(Richtungsanpassung)+
                               DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl)) MOD MaxZahl;
            IF Richtungsanpassung=-1
            THEN
                Hilf_DI:=GeberAmAchsanfang;
                GeberAmAchsanfang:=GeberAmAchsende;
                GeberAmAchsende:=Hilf_DI;
            END_IF;
            Hilf_DI:=0;
            IF GeberAmAchsanfang>GeberAmAchsende
            THEN
                IF PositionOffset>=GeberAmAchsanfang
                THEN
                    IF Geber_DI<=GeberAmAchsende
                    THEN
                        Hilf_DI:=MaxZahl;
                    END_IF;
                END_IF;
               
                IF PositionOffset<=GeberAmAchsende
                THEN
                    IF Geber_DI>=GeberAmAchsanfang
                    THEN
                        Hilf_DI:=-MaxZahl;
                    END_IF;
                END_IF;
            END_IF;
            Axis.LageIstwert_DI:=(Geber_DI+Hilf_DI-PositionOffset)*
                                 INT_TO_DINT(Richtungsanpassung)+PositionOffset;
        ELSE
            Axis.PositionOffset:=Geber_DI;
        END_IF;
    END_IF;
 
    IF NOT Axis.Err.EncoderErr THEN
        IF Axis.ExecRef=2 THEN
            IF (Status.REF0_Q OR Status.REF1_Q) OR
               NOT Axis.EintreiberFahrbereit  AND
               (NOT RefMode AND DI_0 OR RefMode AND DI_1)
            THEN
                Axis.DoneRef:=true;
                PositionOffset:=Axis.PositionOffset;
                Axis.InternalPosOffset:=(Axis.InternalPosOffset-
                                         DINT_TO_REAL(Axis.LageIstwert_DI-PositionOffset)*aufl)-
                                         RefPointInt+Axis.RefPoint;
                RefPointInt:=Axis.RefPoint;                        
                IF NOT Axis.EintreiberFahrbereit OR Sim THEN 
                    PositionOffset:=Geber_DI;
                ELSE
                    PositionOffset:=DWORD_TO_DINT(PID[Addr_RefPos_DI]);
                END_IF;
                Axis.LageIstwert_DI:=PositionOffset;
                GeberAlt_DI:=PositionOffset;
                Axis.PositionOffset:=PositionOffset;
                Steuer_byte[1]:=Steuer_byte[1] AND B#16#FC;
            ELSE
                Steuer_bool[8]:=RefMode;
                Steuer_bool[9]:= NOT RefMode;
                Axis.EintreiberFahrbereit:=true;
            END_IF;
 
        ELSIF Axis.ExecRef=1 THEN
            RefPointInt:=Axis.RefPoint;
            Axis.InternalPosOffset:=RefPointInt;
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.DoneRef:=true;
        ELSE
            Axis.DoneRef:=false;
            Axis.EintreiberFahrbereit:=false;
            Steuer_byte[1]:=Steuer_byte[1] AND B#16#FC;
        END_IF;
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
        IF  EncoderType THEN 
            IF LageDiff_DI<-MaxZahlHalb THEN
                LageDiff_DI:=LageDiff_DI+MaxZahl;
            END_IF;
            IF LageDiff_DI>MaxZahlHalb THEN
                LageDiff_DI:=LageDiff_DI-MaxZahl;
            END_IF;
        END_IF;   
        Axis.LageIstwert_DI:=Axis.LageIstwert_DI+LageDiff_DI; 
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                          aufl+RefPointInt;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;   
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
        IF Axis.AxisType THEN
            TruncKorr:=(Axis.ActPosition-AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;
            Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
        ELSE 
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable AND Axis.Sync AND
                                         Axis.ActPosition<=AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable AND Axis.Sync AND
                                         Axis.ActPosition>=AxisLimitMax;
            Err_DW_str:=Axis.Err;                            
            Axis.Error:=Err_DW<>0;                            
        END_IF;  
    END_IF;
END_IF;
IF Init THEN
    Init:=false;
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
END_IF;
 
IF NOT (Sim OR EncErr) THEN
    PQB[Addr_Steuer]:=Steuer_byte[1];
END_IF;
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB22 EncoderFM450 - Input driver for FM450



Name: EncFM450
Symbolic Name: EncoderFM450
Symbol Comment: Input driver for FM450
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 2334
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB122
TITLE ='Input driver for FM450'
AUTHOR : EMC
FAMILY : EMC2
NAME : EncFM450
VERSION : '2.0'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
END_VAR
VAR_OUTPUT
  DI_0 : BOOL ;    //Digital input 0
  DI_1 : BOOL ;    //Digital input 1
  DI_2 : BOOL ;    //Digital input 2
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
  ReadDiagErr : BOOL  := TRUE;    //1=Read data record 1 (DS1)
END_VAR
VAR
  Koord : STRUCT    
   DA_ERR_W : WORD ;    //Data error word
   OT_ERR_B : BYTE ;    //Operating error byte
   bit0 : BOOL ;   
   STS_TFB : BOOL ;    //Status test free
   DIAG : BOOL ;    //internal use
   OT_ERR : BOOL ;    //internal use
   DATA_ERR : BOOL ;    //Data error bit
   FM_NEUSTQ : BOOL ;    //internal use
   FM_NEUST : BOOL ;    //internal use
   PARA : BOOL ;    //1=Module configured
  END_STRUCT ;   
  Koord_dw AT Koord : DWORD;
  Status : STRUCT    
   byte0 : BYTE ;   
   STS_RUN : BOOL ;    //Status counter working
   STS_DIR : BOOL ;    //Status count direction
   STS_ZERO : BOOL ;    //Status zero pass
   STS_OFLW : BOOL ;    //Status overflow
   STS_UFLW : BOOL ;    //Status underflow
   STS_SYNC : BOOL ;    //Status counter synchronized
   STS_GATE : BOOL ;    //Status internal gate
   STS_SW_G : BOOL ;    //Status software gate
   STS_SET : BOOL ;    //Status software gate
   bit9 : BOOL ;   
   STS_STA : BOOL ;    //Status digital input START
   STS_STP : BOOL ;    //Status digital input STOP
   STS_CMP1 : BOOL ;    //Status output comparison value 1
   STS_CMP2 : BOOL ;    //Status output comparison value 2
   bit14 : BOOL ;   
   bit15 : BOOL ;   
   LoadInCounter : BOOL ;    //internal use
   LoadInLoad : BOOL ;    //internal use
   Comp1Set : BOOL ;    //internal use
   Comp2Set : BOOL ;    //internal use
   NoSync : BOOL ;    //internal use
   NoZero : BOOL ;    //internal use
   bit6 : BOOL ;   
   bit7 : BOOL ;   
  END_STRUCT ;   
  Status_dw AT Status : DWORD;
  JobErr : INT ;    //Error reported while reading DS1
  DiagStatus : STRUCT    
   MDL_DEFECT : BOOL ;    //Module defective
   INT_FAULT : BOOL ;    //Internal fault
   EXT_FAULT : BOOL ;    //External fault
   PNT_INFO : BOOL ;    //Point information
   EXT_VOLTAGE : BOOL ;    //External voltage low
   FLD_CONNCTR : BOOL ;    //Field wiring connector missing
   NO_CONFIG : BOOL ;    //Module has no configuration data
   CONFIG_ERR : BOOL ;    //Module has configuration error
   MDL_TYPE : BYTE ;    //Type of module
   SUB_NDL_ERR : BOOL ;    //Sub-Module is missing or has error
   COMM_FAULT : BOOL ;    //Communication fault
   MDL_STOP : BOOL ;    //Module is stopped
   WTCH_DOG_FLT : BOOL ;    //Watch dog timer stopped module
   INT_PS_FLT : BOOL ;    //Internal power supply fault
   PRIM_BATT_FLT : BOOL ;    //Primary battery is in fault
   BCKUP_BATT_FLT : BOOL ;    //Backup battery is in fault
   RESERVED_2 : BOOL ;    //Reserved for system
   RACK_FLT : BOOL ;    //Rack fault, only for bus interface module
   PROC_FLT : BOOL ;    //Processor fault
   EPROM_FLT : BOOL ;    //EPROM fault
   RAM_FLT : BOOL ;    //RAM fault
   ADU_FLT : BOOL ;    //ADU fault
   FUSE_FLT : BOOL ;    //Fuse fault
   HW_INTR_FLT : BOOL ;    //Hardware interupt input in fault
   RESERVED_3 : BOOL ;    //Reserved for system 
   CH_TYPE : BYTE ;    //Channel type
   LGTH_DIA : BYTE ;    //Diagnostics data length per channel
   CH_NO : BYTE ;    //Channel number
   GRP_ERR1 : BOOL ;    //Group error channel 1
   GRP_ERR2 : BOOL ;    //Group error channel 2
   bit7_2 : BOOL ;   
   bit7_3 : BOOL ;   
   bit7_4 : BOOL ;   
   bit7_5 : BOOL ;   
   bit7_6 : BOOL ;   
   bit7_7 : BOOL ;   
   CH1_SIGA : BOOL ;    //Channel 1, error signal A
   CH1_SIGB : BOOL ;    //Channel 1, error signal B
   CH1_SIGZ : BOOL ;    //Channel 1, error signal zero
   CH1_BETW : BOOL ;    //Channel 1, error between channels
   CH1_5V2 : BOOL ;    //Channel 1, error in 5.2 V encoder supply
   byte9 : BYTE ;   
   CH2_SIGA : BOOL ;    //Channel 2, error signal A
   CH2_SIGB : BOOL ;    //Channel 2, error signal B
   CH2_SIGZ : BOOL ;    //Channel 2, error signal zero
   CH2_BETW : BOOL ;    //Channel 2, error between channels
   CH2_5V2 : BOOL ;    //Channel 2, error in 5.2 V encoder supply
   byte11 : BYTE ;   
END_STRUCT ;   
DiagStatus_dw AT DiagStatus : DWORD ;
DiagStatus_b AT DiagStatus : ARRAY[0..31] OF BOOL ;
 
  GeberAlt_DI : DINT ;    //internal use
  Addr_Status : INT ;    //internal use
  Addr_Koord : INT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  Addr_LoadVal_DI : INT ;    //internal use
  Addr_Steuer : INT ;    //internal use
  KanalNr : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  PASteuer : DWORD ;    //internal use
  PASteuer_b AT PASteuer : ARRAY[0..31] OF BOOL ;
  RefPointInt : REAL ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  LoadVal_DW : DWORD ;    //internal use
  RefZustand : INT ;    //internal use
  DiagFehler : BOOL ;    //internal use
  EncErr_alt : BOOL ;    //internal use
  Diag_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  Addr_InChannel : INT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
    Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
  Sim : BOOL ;    //internal use
END_VAR
BEGIN
 
IF  NOT Init AND NOT EncErr  AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    KanalNr:=Axis.InputChannelNo;
    Addr_InChannel:=Axis.InputChannelNo*32+AXis.InputModuleInAddr;
    Addr_Status:=Addr_InChannel+12;
    Addr_ActPos_DI:=Addr_InChannel+4;
    Addr_Koord:=Addr_InChannel+8;
    Addr_LoadVal_DI:=Addr_InChannel;
    Addr_Steuer:=Addr_LoadVal_DI+12;
    v_Faktor:=Axis.aufl/Axis.Sample_T;
    Koord_dw:=DW#16#0;
    Status_dw:=DW#16#0;
    PASteuer:=DW#16#0;
    DiagFehler:=false;
    ReadDiagErr:=true;
    Axis.EinInitLaeuft:=true;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Diag_alt:=false;
    Axis.DoneRef:=false;
    RefPointInt:=Axis.RefPoint;
    Axis.ExecRef:=0;
    Axis.Sync:=false;
    Axis.EncoderType:=false;
    Richtungsanpassung:=Axis.PolarityEncoder;
    RefZustand:=0;
END_IF;
 
Sim:=Axis.Sim;
 
IF Sim OR EncErr THEN
    Koord_dw:=DW#16#80;
    PASteuer:=DW#16#0;
    Axis.EinInitLaeuft:=false;
    ReadDiagErr:=false;
ELSE
    Status_dw:=PID[Addr_Status];
    Koord_dw:=PID[Addr_Koord];
    IF (Koord_dw AND DW#16#60) = DW#16#40 THEN
        PASteuer:=DW#16#40000000;
        Init:=true;
        Axis.EinInitLaeuft:=true;
        Axis.Sync:=false;
        Axis.EintreiberFahrbereit:=false;
    ELSE
        PASteuer_b[6]:=false;
        Axis.EncoderValue:=DWORD_TO_DINT(PID[Addr_ActPos_DI]);
        IF Koord.DIAG XOR Diag_alt THEN
            ReadDiagErr:=true;
            Diag_alt:=Koord.DIAG;
        END_IF;
        IF ReadDiagErr THEN
            JobErr:=RD_REC(REQ :=  true
                   ,IOID := B#16#54
                   ,LADDR :=  INT_TO_WORD(Axis.InputModuleInAddr)
                   ,RECNUM :=  1
                   ,BUSY :=  ReadDiagErr
                   ,RECORD :=  DiagStatus
                   );
                  
            IF (INT_TO_DINT(JobErr)>=32930 AND
                INT_TO_DINT(JobErr)<=32932OR
                (INT_TO_DINT(JobErr)>=32960 AND
                INT_TO_DINT(JobErr)<=32975)
            THEN
                ReadDiagErr:=true;
            END_IF;
            IF NOT ReadDiagErr THEN
                IF JobErr>=0 THEN
                    IF DiagStatus.MDL_DEFECT THEN
                        IF (DW#16#F000FFFF AND DiagStatus_dw) <> 0 THEN
                            DiagFehler:=true;
                        ELSE
                             DiagFehler:=DiagStatus_b[INT_TO_DINT(KanalNr)+56];
                        END_IF;
                    ELSE
                        DiagFehler:=false;
                    END_IF;
                ELSE   
                    DiagFehler:=true;
                END_IF;
            END_IF;
        END_IF;
    END_IF;
END_IF;
 
Geber_DI:=Axis.EncoderValue;
DI_0:=Status.STS_STA;
DI_1:=Status.STS_STP;
DI_2:=Status.STS_SET;
 
IF EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
    Axis.Sync:=false;
ELSE
    IF Init THEN
        GeberAlt_DI:=Geber_DI;
        Axis.LageIstwert_DI:=Geber_DI;
        Axis.PositionOffset:=Geber_DI;
    END_IF;
    IF (Koord.OT_ERR OR Koord.DATA_ERR) OR
       (NOT Koord.PARA AND Koord.FM_NEUSTQ) OR
       DiagFehler
    THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
        Axis.Sync:=false;
    ELSE
        IF Axis.ExecRef=2 THEN
            IF RefZustand=0 THEN
                LoadVal_DW:=DINT_TO_DWORD(Geber_DI) XOR DW#16#50000000;
                LoadVal_DW:=LoadVal_DW AND DW#16#F0000000;
                LoadVal_DW:=LoadVal_DW OR DW#16#2000000;
                IF Status.STS_SET THEN
                    RefZustand:=5;
                    LoadVal_DW:=DINT_TO_DWORD(Geber_DI);
                ELSE
                    IF Sim THEN
                        RefZustand:=5;
                    ELSE
                        PQD[Addr_LoadVal_DI]:=LoadVal_DW;
                        PASteuer_b[25]:=true;
                        RefZustand:=3;
                    END_IF;
                END_IF;
            ELSIF RefZustand=3 THEN
                IF Status.LoadInLoad THEN
                    PASteuer_b[25]:=false;
                    RefZustand:=4;
                END_IF;
            ELSIF RefZustand=4 THEN
                    IF PID[Addr_LoadVal_DI]=LoadVal_DW THEN
                        RefZustand:=5;
                    END_IF;   
            ELSIF RefZustand=5 THEN
                IF (LoadVal_DW AND DW#16#F0000000)=(DINT_TO_DWORD(Geber_DI) AND DW#16#F0000000) THEN
                    Axis.DoneRef:=true;
                    Axis.InternalPosOffset:=(Axis.InternalPosOffset-DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*Axis.aufl)
                                            -RefPointInt+Axis.RefPoint;
                    RefPointInt:=Axis.RefPoint;
                    Axis.PositionOffset:=DWORD_TO_DINT(LoadVal_DW);
                    Axis.LageIstwert_DI:=DWORD_TO_DINT(LoadVal_DW);
                    GeberAlt_DI:=DWORD_TO_DINT(LoadVal_DW);
                   
                    PASteuer:=PASteuer AND DW#16#FFFCFFFF;
                    RefZustand:=0;
                ELSE
                    PASteuer:=PASteuer OR DW#16#30000;
                    Axis.EintreiberFahrbereit:=true;
                END_IF;
            END_IF;
        ELSIF Axis.ExecRef=1 THEN
            RefPointInt:=Axis.RefPoint;
            Axis.InternalPosOffset:=RefPointInt;
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.DoneRef:=true;
        ELSE
            Axis.DoneRef:=false;
            Axis.EintreiberFahrbereit:=false;
            PASteuer:=PASteuer AND DW#16#FFFCFFFF;
        END_IF;
       
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
        Axis.LageIstwert_DI:=LageDiff_DI+Axis.LageIstwert_DI;
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)
                          *Axis.aufl+RefPointInt;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;   
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
       
        IF Axis.AxisType THEN
            TruncKorr:=(Axis.ActPosition-Axis.AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;
           
            Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
        ELSE
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable AND Axis.Sync AND
                                         Axis.ActPosition<=Axis.AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable AND Axis.Sync AND
                                         Axis.ActPosition>=Axis.AxisLimitMax;
            Err_DW_str:=Axis.Err;                            
            Axis.Error:=Err_DW<>0;                            
        END_IF;
    END_IF;   
END_IF;
 
IF Init THEN
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
    IF PASteuer=DW#16#0 THEN
        IF NOT ReadDiagErr THEN
            Init:=false;
            Axis.EinInitLaeuft:=false;
        END_IF;
    END_IF;
END_IF;
 
IF NOT (Sim OR EncErr) THEN
    PQD[Addr_Steuer]:=PASteuer;
END_IF;
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB23 EncoderET200S1SSI - Input driver for ET200S 1SSI



Name: Enc1SSI
Symbolic Name: EncoderET200S1SSI
Symbol Comment: Input driver for ET200S 1SSI
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 1566
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB123
TITLE ='Input driver for ET200S 1SSI'
AUTHOR : EMC
FAMILY : EMC2
NAME : Enc1SSI
VERSION : '2.0'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Status : STRUCT    
   Istwert2424 : BOOL ;    //internal use
   STS_UP : BOOL ;    //UP status
   STS_DN : BOOL ;    //DN status
   STS_DI : BOOL ;    //DI status
   EXTF : BOOL ;    //1=Group error "absolute value encoder" or "short circuit of the encoder supply"
   ERR_PARA : BOOL ;    //1=Parameter assignment error
   RDY : BOOL ;    //1=Ready for operation (feedback is valid)
   bit31 : BOOL ;   
   Istwert1623 : BYTE ;    //internal use                 
   Istwert0815 : BYTE ;    //internal use                 
   Istwert0007 : BYTE ;    //internal use                 
  END_STRUCT ;   
  Status_dw AT Status : DWORD;
  GeberAlt_DI : DINT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  PositionOffset : DINT ;    //internal use
  EncErr_alt : BOOL ;    //internal use
  Taktsynchron : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  Addr_InChannel : INT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
  GeberAmAchsende : DINT ;    //internal use
  GeberAmAchsanfang : DINT ;    //internal use
  Hilf_DI : DINT ;    //internal use
  SFCErr : INT ;    //Rückgabewert des SFC6 (RD_SINFO) lokal, da keine relevante Info
  TOP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  START_UP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
END_VAR
BEGIN
 
IF NOT Init AND NOT EncErr AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Addr_InChannel:=Axis.InputModuleInAddr;
    Addr_ActPos_DI:=Addr_InChannel;
    v_Faktor:=Axis.aufl/Axis.Sample_T;
    Axis.ExecRef:=0;
    Status_dw:=DW#16#0;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;   
    Axis.ExecRef:=0;
    Axis.EncoderType:=true;
    MaxZahl:=Axis.AbsGeberLaenge_DI;
    MaxZahlHalb:=MaxZahl/2;
     Richtungsanpassung:=Axis.PolarityEncoder;
   
    SFCErr:=RD_SINFO(TOP_SI :=  TOP_SI
         ,START_UP_SI :=  START_UP_SI
         );
    SFCErr:=BYTE_TO_INT(TOP_SI.NUM);   
    Taktsynchron:=SFCErr>=61 AND SFCErr<=64;
 END_IF;
 
IF Axis.Sim OR EncErr THEN
    Status_dw:=DW#16#40000000;   
ELSE
    IF Taktsynchron THEN
        Status_dw:=ID[Addr_ActPos_DI];
    ELSE
        Status_dw:=PID[Addr_ActPos_DI];
    END_IF;
    Axis.EncoderValue:=DWORD_TO_DINT(Status_dw AND DW#16#1FFFFFF);
END_IF;
   
Geber_DI:=Axis.EncoderValue;
 
IF EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
ELSE
    IF Init THEN
        PositionOffset:=Axis.PositionOffset;
        GeberAmAchsanfang:=ROUND((Axis.AxisLimitMin-Axis.RefPoint)/
                           Axis.aufl*INT_TO_REAL(Richtungsanpassung)+
                            DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl))
                            MOD MaxZahl;
        GeberAmAchsende:=ROUND((Axis.AxisLimitMax-Axis.RefPoint)/
                           Axis.aufl*INT_TO_REAL(Richtungsanpassung)+
                            DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl))
                            MOD MaxZahl;
        IF Richtungsanpassung=-1 THEN
            Hilf_DI:=GeberAmAchsanfang;
            GeberAmAchsanfang:=GeberAmAchsende;
            GeberAmAchsende:=Hilf_DI;
        END_IF;
        Hilf_DI:=0;
        IF GeberAmAchsanfang>GeberAmAchsende THEN
            IF PositionOffset>=GeberAmAchsanfang THEN
                IF Geber_DI<=GeberAmAchsende THEN
                    Hilf_DI:=MaxZahl;
                END_IF;
            END_IF;
            IF PositionOffset<=GeberAmAchsende THEN
                IF Geber_DI>=GeberAmAchsanfang THEN
                    Hilf_DI:=-MaxZahl;
                END_IF;
            END_IF;
        END_IF;
        Axis.LageIstwert_DI:=(Geber_DI+Hilf_DI-PositionOffset)*
                         INT_TO_DINT(Richtungsanpassung)+PositionOffset;
        GeberAlt_DI:=Geber_DI;
    END_IF;
    IF Status.EXTF OR Status.ERR_PARA OR NOT Status.RDY THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
    ELSE
        IF Axis.ExecRef=1 THEN
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.InternalPosOffset:=Axis.RefPoint;
            Axis.DoneRef:=true;
        ELSE
             Axis.DoneRef:=false;
        END_IF;
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
        IF LageDiff_DI<-MaxZahlHalb THEN
            LageDiff_DI:=LageDiff_DI+MaxZahl;
        END_IF;
        IF LageDiff_DI>MaxZahlHalb THEN
            LageDiff_DI:=LageDiff_DI-MaxZahl;
        END_IF;
        Axis.LageIstwert_DI:=Axis.LageIstwert_DI+LageDiff_DI;
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                          Axis.aufl+Axis.RefPoint;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
        IF Axis.AxisType THEN
            TruncKorr:=(Axis.ActPosition-Axis.AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0  AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;
            Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
        ELSE
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition<=Axis.AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition>=Axis.AxisLimitMax;
            Err_DW_str:=Axis.Err;                            
            Axis.Error:=Err_DW<>0;                            
         END_IF;
    END_IF;
END_IF;
 
IF Init THEN
    Init:=false;
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
END_IF;
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB24 EncoderAbsSensorDP - Input driver for DP-sensor



Name: EncAbsDP
Symbolic Name: EncoderAbsSensorDP
Symbol Comment: Input driver for DP-sensor
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 1420
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB24
TITLE ='Input driver for DP-sensor'
AUTHOR : EMC
FAMILY : EMC2
NAME : EncAbsDP
VERSION : '2.0'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
END_VAR
VAR_IN_OUT
  Axis :  UDT1   ;
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Status : STRUCT    
   bit24 : BOOL ;   
   Ready : BOOL ;    //1=Module ready
   Mode : BOOL ;    //Operating mode: 0=commissioning, 1=normal mode
   SWLimitExceeded : BOOL ;    //1=SW limit switch min. or max. exceeded
   Dir : BOOL ;    //Rotational direction: 0=clockwise, 1=counterclockwise
   bit29 : BOOL ;   
   bit30 : BOOL ;   
   bit31 : BOOL ;   
   Istwert1623 : BYTE ;    //internal use                 
   Istwert0815 : BYTE ;    //internal use                 
   Istwert0007 : BYTE ;    //internal use                 
END_STRUCT ;
  Status_dw AT Status : DWORD;
  GeberAlt_DI : DINT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  aufl : REAL ;    //internal use
  AxisLimitMin : REAL ;    //internal use
  AxisLimitMax : REAL ;    //internal use
  PositionOffset : DINT ;    //internal use
  PositionOffset_r AT PositionOffset : REAL;
  EncErr_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  Addr_InChannel : INT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
  GeberAmAchsende : DINT ;    //internal use
  GeberAmAchsanfang : DINT ;    //internal use
  Hilf_DI : DINT ;    //internal use
END_VAR
BEGIN
IF NOT Init AND NOT EncErr AND EncErr_alt
THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init  
THEN
    Addr_InChannel:=Axis.InputModuleInAddr;
    Addr_ActPos_DI:=Addr_InChannel;
    Status_dw:=DW#16#0;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;
    Axis.ExecRef:=0;
    aufl:=Axis.aufl;
    v_Faktor:=aufl/Axis.Sample_T;
    Richtungsanpassung:=Axis.PolarityEncoder;
    AxisLimitMin:=Axis.AxisLimitMin;
    AxisLimitMax:=Axis.AxisLimitMax;
    Axis.EncoderType:=true;
    MaxZahl:=Axis.AbsGeberLaenge_DI;
    MaxZahlHalb:=MaxZahl/2;
END_IF;   
 
IF Axis.Sim OR EncErr
THEN
    Status_dw:=DW#16#2000000;
ELSE
    Status_dw:=PID[Addr_ActPos_DI];
    Axis.EncoderValue:=DWORD_TO_DINT(Status_dw AND DW#16#FFFFFF);
END_IF;
 
Geber_DI:=Axis.EncoderValue;
 
IF EncErr
THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
ELSE
    IF Init
    THEN
        PositionOffset:=Axis.PositionOffset;
        GeberAmAchsanfang:=ROUND((AxisLimitMin-Axis.RefPoint)/aufl*INT_TO_REAL(Richtungsanpassung)+
                           DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl)) MOD MaxZahl;
        GeberAmAchsende:=ROUND((AxisLimitMax-Axis.RefPoint)/aufl*INT_TO_REAL(Richtungsanpassung)+
                           DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl)) MOD MaxZahl;
    
        IF Richtungsanpassung=-1
        THEN
            Hilf_DI:=GeberAmAchsanfang;
            GeberAmAchsanfang:=GeberAmAchsende;
            GeberAmAchsende:=Hilf_DI;
        END_IF;
        Hilf_DI:=0;
        IF GeberAmAchsanfang>GeberAmAchsende
        THEN
            IF PositionOffset>=GeberAmAchsanfang
            THEN
                IF Geber_DI<=GeberAmAchsende
                THEN
                    Hilf_DI:=MaxZahl;
                END_IF;
            END_IF;
           
            IF PositionOffset<=GeberAmAchsende
            THEN
                IF Geber_DI>=GeberAmAchsanfang
                THEN
                    Hilf_DI:=-MaxZahl;
                END_IF;
            END_IF;
        END_IF;
        Axis.LageIstwert_DI:=(Geber_DI+Hilf_DI-PositionOffset)*
                             INT_TO_DINT(Richtungsanpassung)+PositionOffset;
                            
        GeberAlt_DI:=Geber_DI;
    END_IF;     
   
    IF NOT Status.Ready
    THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
    ELSE 
        IF Axis.ExecRef=1
        THEN
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.InternalPosOffset:=Axis.RefPoint; 
            Axis.DoneRef:=true;
        ELSE          
            Axis.DoneRef:=false;
        END_IF;
       
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
       
        IF LageDiff_DI<-MaxZahlHalb
        THEN
            LageDiff_DI:=LageDiff_DI+MaxZahl;
        END_IF;
       
        IF LageDiff_DI>MaxZahlHalb
        THEN
            LageDiff_DI:=LageDiff_DI-MaxZahl;
        END_IF;
       
        Axis.LageIstwert_DI:=Axis.LageIstwert_DI+LageDiff_DI;
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                           aufl+Axis.RefPoint;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;                  
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
        IF Axis.AxisType
        THEN
            TruncKorr:=(Axis.ActPosition-AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr
            THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;
            Axis.ActPosition:=Axis.ActPosition-(TruncKorr_DI*Axis.AchsLaenge);
        ELSE
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable AND
                                         Axis.Sync AND
                                         Axis.ActPosition<=AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable AND
                                         Axis.Sync AND
                                         Axis.ActPosition>=AxisLimitMax;
                                    
            Err_DW_str:=Axis.Err;
            Axis.Error:=Err_DW<>DW#16#0;
        END_IF;
    END_IF;      
END_IF;
 
IF Init 
THEN
    Init:=false;
    Axis.InternalNomPosition:=Axis.InternalActPos;  
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
END_IF;
   
END_FUNCTION_BLOCK
 



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB25 EncoderSM338 - Input driver for SM338

Name: EncSM338
Symbolic Name: EncoderSM338
Symbol Comment: Input driver for SM338
Family: EMC2
Version: 2.1
Author: EMC
Last modified: 03/12/2009
Use: UDT1,SFC6,SFB52
Size in work memory: 2028
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCLCOMP K05.03.05.00_01.03.00.01 release

FUNCTION_BLOCK FB125
TITLE ='Input driver for SM338'
AUTHOR : EMC
FAMILY : EMC2
NAME : EncSM338
VERSION : '2.1'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
  ReadDiagErr : BOOL  := TRUE;    //1=Read data record 1 (DS1)
END_VAR
VAR
  Freeze : BOOL ;    //1=Freeze at encoder input
  JobErr : INT ;    //Error reported while reading DS1
  DiagStatus : STRUCT    
   MDL_DEFECT : BOOL ;    //Module defective
   INT_FAULT : BOOL ;    //Internal fault
   EXT_FAULT : BOOL ;    //External fault
   PNT_INFO : BOOL ;    //Point information
   EXT_VOLTAGE : BOOL ;    //External voltage low
   FLD_CONNCTR : BOOL ;    //Field wiring connector missing
   NO_CONFIG : BOOL ;    //Module has no configuration data
   CONFIG_ERR : BOOL ;    //Module has configuration error
   MDL_TYPE : BYTE ;    //Type of module
   SUB_NDL_ERR : BOOL ;    //Sub-Module is missing or has error
   COMM_FAULT : BOOL ;    //Communication fault
   MDL_STOP : BOOL ;    //Module is stopped
   WTCH_DOG_FLT : BOOL ;    //Watch dog timer stopped module
   INT_PS_FLT : BOOL ;    //Internal power supply fault
   PRIM_BATT_FLT : BOOL ;    //Primary battery is in fault
   BCKUP_BATT_FLT : BOOL ;    //Backup battery is in fault
   RESERVED_2 : BOOL ;    //Reserved for system
   RACK_FLT : BOOL ;    //Rack fault, only for bus interface module
   PROC_FLT : BOOL ;    //Processor fault
   EPROM_FLT : BOOL ;    //EPROM fault
   RAM_FLT : BOOL ;    //RAM fault
   ADU_FLT : BOOL ;    //ADU fault
   FUSE_FLT : BOOL ;    //Fuse fault
   HW_INTR_FLT : BOOL ;    //Hardware interupt input in fault
   RESERVED_3 : BOOL ;    //Reserved for system 
   CH_TYPE : BYTE ;    //Channel type
   LGTH_DIA : BYTE ;    //Diagnostics data length per channel
   CH_NO : BYTE ;    //Channel number
   GRP_ERR0 : BOOL ;    //Group error channel 0
   GRP_ERR1 : BOOL ;    //Group error channel 1
   GRP_ERR2 : BOOL ;    //Group error channel 2
   bit7_3 : BOOL ;   
   bit7_4 : BOOL ;   
   bit7_5 : BOOL ;   
   bit7_6 : BOOL ;   
   bit7_7 : BOOL ;   
   CH0_INTF : BOOL ;    //Configuration or parameterization error (internal channel malfunction)
   CH0_EXTF : BOOL ;    //Encoder malfunction (external channel malfunction)
   bit8_2 : BOOL ;   
   bit8_3 : BOOL ;   
   bit8_4 : BOOL ;   
   bit8_5 : BOOL ;   
   bit8_6 : BOOL ;   
   bit8_7 : BOOL ;   
   CH1_INTF : BOOL ;    //Configuration or parameterization error (internal channel malfunction)
   CH1_EXTF : BOOL ;    //Encoder malfunction (external channel malfunction)
   bit9_2 : BOOL ;   
   bit9_3 : BOOL ;   
   bit9_4 : BOOL ;   
   bit9_5 : BOOL ;   
   bit9_6 : BOOL ;   
   bit9_7 : BOOL ;   
   CH2_INTF : BOOL ;    //Configuration or parameterization error (internal channel malfunction)
   CH2_EXTF : BOOL ;    //Encoder malfunction (external channel malfunction)
   bit10_2 : BOOL ;   
   bit10_3 : BOOL ;   
   bit10_4 : BOOL ;   
   bit10_5 : BOOL ;   
   bit10_6 : BOOL ;   
   bit10_7 : BOOL ;   
   byte11 : BYTE ;   
   dword12 : DWORD ;   
  END_STRUCT ;   
  DiagStatus_dw AT DiagStatus : DWORD;
  DiagStatus_b AT DiagStatus : ARRAY[0..127] OF BOOL;
  GeberAlt_DI : DINT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  PEStatus : DWORD ;    //internal use
  PEStatus_b AT PEStatus : ARRAY[0..31] OF BOOL;
  Richtungsanpassung : INT  := 1;    //internal use
  PositionOffset : DINT ;    //internal use
  BGAdr : WORD ;    //internal use
  BGTyp : BYTE ;    //internal use
  DiagFehler : BOOL ;    //internal use
  EncErr_alt : BOOL ;    //internal use
  Taktsynchron : BOOL ;    //internal use
  sRDREC : SFB52;   
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  Addr_InChannel : INT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
  GeberAmAchsende : DINT ;    //internal use
  GeberAmAchsanfang : DINT ;    //internal use
  Hilf_DI : DINT ;    //internal use
  SFCErr : INT ;    //Rückgabewert des SFC6 (RD_SINFO) lokal, da keine relevante Info
  TOP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  START_UP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
END_VAR
BEGIN
 
IF NOT Init AND NOT EncErr AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Addr_InChannel:=Axis.InputChannelNo*4+Axis.InputModuleInAddr;
    Addr_ActPos_DI:=Addr_InChannel;
    v_Faktor:=Axis.aufl/Axis.Sample_T;
    PEStatus:=DW#16#0;
    DiagFehler:=false;
    ReadDiagErr:=true;
    Axis.EinInitLaeuft:=true;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;
    Axis.ExecRef:=0;
    Axis.EncoderType:=true;
    MaxZahl:=Axis.AbsGeberLaenge_DI;
    MaxZahlHalb:=MaxZahl/2;
    Richtungsanpassung:=Axis.PolarityEncoder;
    IF Axis.InputModuleInAddr<=Axis.InputModuleOutAddr THEN
        BGAdr:=INT_TO_WORD(Axis.InputModuleInAddr);
        BGTyp:=B#16#54;
    ELSE
        BGAdr:=INT_TO_WORD(Axis.InputModuleOutAddr);
        BGAdr:=BGAdr OR W#16#8000;
        BGTyp:=B#16#55;
    END_IF;
   
    SFCErr:=RD_SINFO(TOP_SI :=  TOP_SI
         ,START_UP_SI :=  START_UP_SI
         );
       
    SFCErr:=BYTE_TO_INT(TOP_SI.NUM);
    Taktsynchron:=SFCErr>=61 AND SFCErr<=64;
END_IF;
 
IF Axis.Sim OR EncErr THEN
    PEStatus:=DW#16#0;   
    ReadDiagErr:=false;
ELSE
    IF Taktsynchron THEN
        PEStatus:=ID[Addr_ActPos_DI];
    ELSE
        PEStatus:=PID[Addr_ActPos_DI];
    END_IF;
 
 
    Axis.EncoderValue:=DWORD_TO_DINT(PEStatus AND DW#16#1FFFFFF);
   
    IF ReadDiagErr THEN
        sRDREC     (REQ := true
                    ,ID :=BGAdr  
                    ,INDEX := 1
                    ,MLEN := 16
                    ,RECORD := DiagStatus
                    );
        ReadDiagErr:=sRDREC.BUSY;
        JobErr:=DWORD_TO_INT(SHR(IN:=sRDREC.STATUS,N:=8));
        IF (INT_TO_DINT(JobErr)>=32930 AND
            INT_TO_DINT(JobErr)<=32932OR
            (INT_TO_DINT(JobErr)>=32960 AND
            INT_TO_DINT(JobErr)<=32975)
        THEN
            ReadDiagErr:=true;
        END_IF;
        IF NOT ReadDiagErr THEN
            IF JobErr>=0 THEN
                IF DiagStatus.MDL_DEFECT THEN
                    IF (DW#16#F000FFFF AND DiagStatus_dw) <> 0 THEN
                        DiagFehler:=true;
                    ELSE
                        DiagFehler:=DiagStatus_b[INT_TO_DINT(Axis.InputChannelNo)+56];
                    END_IF;
                ELSE
                    DiagFehler:=false;
                END_IF;
            ELSE   
                DiagFehler:=true;
            END_IF;
        END_IF;
    END_IF;
END_IF;   
 
Geber_DI:=Axis.EncoderValue;
Freeze:=PEStatus_b[7];
 
IF EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
ELSE
    IF Init THEN
        PositionOffset:=Axis.PositionOffset;
        GeberAmAchsanfang:=ROUND((Axis.AxisLimitMin-Axis.RefPoint)/
                           Axis.aufl*INT_TO_REAL(Richtungsanpassung)+
                            DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl))
                            MOD MaxZahl;
        GeberAmAchsende:=ROUND((Axis.AxisLimitMax-Axis.RefPoint)/
                           Axis.aufl*INT_TO_REAL(Richtungsanpassung)+
                            DINT_TO_REAL(PositionOffset)+DINT_TO_REAL(MaxZahl))
                            MOD MaxZahl;
        IF Richtungsanpassung=-1 THEN
            Hilf_DI:=GeberAmAchsanfang;
            GeberAmAchsanfang:=GeberAmAchsende;
            GeberAmAchsende:=Hilf_DI;
        END_IF;
       
        Hilf_DI:=0;
        IF GeberAmAchsanfang>GeberAmAchsende THEN
            IF PositionOffset>=GeberAmAchsanfang THEN
                IF Geber_DI<=GeberAmAchsende THEN
                    Hilf_DI:=MaxZahl;
                END_IF;
            END_IF;
            IF PositionOffset<=GeberAmAchsende THEN
                IF Geber_DI>=GeberAmAchsanfang THEN
                    Hilf_DI:=-MaxZahl;
                END_IF;
            END_IF;
        END_IF;
 
        Axis.LageIstwert_DI:=(Geber_DI+Hilf_DI-PositionOffset)*
                         INT_TO_DINT(Richtungsanpassung)+PositionOffset;
        GeberAlt_DI:=Geber_DI;
    END_IF;
   
    IF DiagFehler THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
    ELSE
        IF Axis.ExecRef=1 THEN
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.InternalPosOffset:=Axis.RefPoint;
            Axis.DoneRef:=true;
        ELSE
            Axis.DoneRef:=false;
        END_IF;
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
        IF LageDiff_DI<-MaxZahlHalb THEN
            LageDiff_DI:=LageDiff_DI+MaxZahl;
        END_IF;
        IF LageDiff_DI>MaxZahlHalb THEN
            LageDiff_DI:=LageDiff_DI-MaxZahl;
        END_IF;
        Axis.LageIstwert_DI:=Axis.LageIstwert_DI+LageDiff_DI;
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                          Axis.aufl+Axis.RefPoint;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
        IF Axis.AxisType THEN
            TruncKorr:=(Axis.ActPosition-Axis.AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0  AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;
            Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
        ELSE
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition<=Axis.AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition>=Axis.AxisLimitMax;
            Err_DW_str:=Axis.Err;                            
            Axis.Error:=Err_DW<>0;                            
         END_IF;
    END_IF;
END_IF;
 
IF Init THEN
    IF NOT ReadDiagErr THEN
        Init:=false;
        Axis.EinInitLaeuft:=false;
    END_IF;
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
END_IF;
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB26 EncoderET200S1Count - Input driver for ET200S 1Count

Name: Enc1CTR
Symbolic Name: EncoderET200S1Count
Symbol Comment: Input driver for ET200S 1Count
Family: EMC2
Version: 2.1
Author: EMC
Last modified: 03/12/2009
Use: UDT1,SFC6
Size in work memory: 2456
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCLCOMP K05.03.05.00_01.03.00.01 release

FUNCTION_BLOCK FB126
TITLE ='Input driver for ET200S 1Count'
AUTHOR : EMC
FAMILY : EMC2
NAME : Enc1CTR
VERSION : '2.1'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
  DOut_1 : BOOL ;    //Digital output 1
  DOut_2 : BOOL ;    //Digital output 2
END_VAR
VAR_OUTPUT
  DIn : BOOL ;    //Digital input
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Status : STRUCT    
   STS_LOAD : BOOL ;    //1=Load function active
   ERR_LOAD : BOOL ;    //1=Load function error
   RES_STS_A : BOOL ;    //1=Resetting of status bit active
   ERR_ENCODER : BOOL ;    //(1COUNT5V only) 1=Short circuit / wire break of the sensor-signal
   ERR_DO2 : BOOL ;    //(1COUNT5V only) 1=DO2: Short circuit / wire break / overtemperature
   ERR_PARA : BOOL ;    //1=Parameter assignment error
   ERR_DO1 : BOOL ;    //DO1: 1=Short circuit / wire break / overtemperature
   ERR_24V : BOOL ;    //1=Short circuit of the sensor supply
   STS_GATE : BOOL ;    //Internal gate status
   STS_DI : BOOL ;    //DI status
   bit18 : BOOL ;   
   STS_DO1 : BOOL ;    //DO1 status
   STS_DO2 : BOOL ;    //DO2 status
   bit21 : BOOL ;   
   STS_C_UP : BOOL ;    //Up direction status
   STS_C_DN : BOOL ;    //Down direction status
   STS_SYN : BOOL ;    //Synchronization status
   bit09 : BOOL ;   
   bit10 : BOOL ;   
   STS_CMP1 : BOOL ;    //Comparator status 1
   STS_CMP2 : BOOL ;    //Comparator status 2
   STS_OFLW : BOOL ;    //Upper count limit
   STS_UFLW : BOOL ;    //Lower count limit
   STS_ND : BOOL ;    //Zero-crossing in the count range in counting without a main counting direction
   byte3 : BYTE ;   
  END_STRUCT ;   
  Status_dw AT Status : DWORD;
  GeberAlt_DI : DINT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  Addr_Status : INT ;    //internal use
  Addr_LoadVal_DI : INT ;    //internal use
  Addr_Steuer : INT ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  PASteuer : WORD ;    //internal use #AJ
  PASteuer_b AT PASteuer : ARRAY[0..15] OF BOOL;
  RefPointInt : REAL ;    //internal use
  LoadVal_DW : DWORD ;    //internal use
  EncoderZustand : INT ;    //internal use
  RefZustand : INT ;    //internal use
  aufl : REAL ;    //internal use
  EncErr_alt : BOOL ;    //internal use
  Taktsynchron : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  Addr_InChannel : INT ;    //internal use
  Addr_OutChannel : INT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
  SFCErr : INT ;    //Rückgabewert des SFC6 (RD_SINFO) lokal, da keine relevante Info
  TOP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  START_UP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  Sim : BOOL ;    //internal use
END_VAR
BEGIN
 
Sim:=Axis.Sim;
 
 
IF NOT Init AND NOT EncErr AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Addr_InChannel:=Axis.InputModuleInAddr;
    Addr_Status:=Addr_InChannel+4;
    Addr_ActPos_DI:=Addr_InChannel;
    Addr_OutChannel:=Axis.InputModuleOutAddr;
    Addr_LoadVal_DI:=Addr_OutChannel;
    Addr_Steuer:=Addr_LoadVal_DI+4;
    Status_dw:=DW#16#0;
    PASteuer:=W#16#0;
    Axis.EinInitLaeuft:=true;
    Axis.EinQuittungLaeuft:=false;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;
    Axis.ExecRef:=0;
    RefPointInt:=Axis.RefPoint;
    aufl:=Axis.aufl;
    v_Faktor:=aufl/Axis.Sample_T;
    Richtungsanpassung:=Axis.PolarityEncoder;
    Axis.EncoderType:=false;
    Axis.Sync:=false;
    EncoderZustand:=0;
   
        SFCErr:=RD_SINFO(TOP_SI :=  TOP_SI
             ,START_UP_SI :=  START_UP_SI
             );
   
    SFCErr:=BYTE_TO_INT(TOP_SI.NUM);
    Taktsynchron:=SFCErr>=61 AND SFCErr<=64;
    LoadVal_DW:=DW#16#0;
   
    IF NOT (Sim OR EncErr) THEN
        IF Taktsynchron THEN
            QD[Addr_LoadVal_DI]:=LoadVal_DW;
        ELSE
            PQD[Addr_LoadVal_DI]:=LoadVal_DW;
        END_IF;
    END_IF;   
    RefZustand:=0;
 END_IF;    
 
IF Sim OR EncErr THEN
    PASteuer:=W#16#0;
    EncoderZustand:=4;
    Axis.EinInitLaeuft:=false;
ELSE     
    IF Taktsynchron THEN
        Status_dw:=ID[Addr_Status];
        Axis.EncoderValue:=DWORD_TO_DINT(ID[Addr_ActPos_DI]);
    ELSE
        Status_dw:=PID[Addr_Status];
        Axis.EncoderValue:=DWORD_TO_DINT(PID[Addr_ActPos_DI]);
    END_IF
END_IF;     
 
IF EncErr THEN
    Status_dw:=DW#16#0;
END_IF;
 
Geber_DI:=Axis.EncoderValue;
DIn:=Status.STS_DI;   
IF EncoderZustand<>4 OR Init THEN
    GeberAlt_DI:=Geber_DI;
    Axis.LageIstwert_DI:=Geber_DI;
    Axis.PositionOffset:=Geber_DI;
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
    Init:=false;
END_IF;     
 
IF EncoderZustand=4 THEN
    IF EncErr THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
        EncErr_alt:=true;
        Axis.Sync:=false;
    END_IF;   
    IF Status.ERR_ENCODER OR
       Status.ERR_DO2 OR
       Status.ERR_PARA OR
       Status.ERR_DO1 OR
       Status.ERR_24V
    THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
        Axis.Sync:=false;
        IF NOT PASteuer_b[7] THEN
            PASteuer_b[7]:=Axis.ErrorAck;
            Axis.EinQuittungLaeuft:=Axis.ErrorAck;
        END_IF;
    ELSE
        PASteuer_b[7]:=false;
        Axis.EinQuittungLaeuft:=false;
    END_IF
 
    IF NOT EncErr THEN
        IF Axis.ExecRef=2 THEN
            IF RefZustand=0 THEN
                IF Status.STS_DI THEN
                    LoadVal_DW:=DINT_TO_DWORD(Geber_DI);
                    RefZustand:=5;
                ELSE
                    IF Sim THEN
                        RefZustand:=2;
                    ELSE
                        PASteuer_b[2]:=true;
                        RefZustand:=1;
                    END_IF;
                END_IF;
            ELSIF RefZustand=1 THEN
                IF Status.RES_STS_A THEN
                    PASteuer_b[2]:=false;
                    RefZustand:=2;
                END_IF;
            ELSIF RefZustand=2 THEN
                LoadVal_DW:=DINT_TO_DWORD(Geber_DI) XOR DW#16#50000000;
                LoadVal_DW:=LoadVal_DW AND DW#16#F0000000;
                LoadVal_DW:=LoadVal_DW OR DW#16#2000000;
                IF Sim THEN
                    RefZustand:=5;
                ELSE
                    IF Taktsynchron THEN
                        QD[Addr_LoadVal_DI]:=LoadVal_DW;
                    ELSE
                        PQD[Addr_LoadVal_DI]:=LoadVal_DW;
                    END_IF;
                    PASteuer_b[9]:=true;
                    RefZustand:=3;
                END_IF;
            ELSIF RefZustand=3 THEN
                IF Status.STS_LOAD THEN
                    PASteuer_b[9]:=false;
                    RefZustand:=4;
                END_IF;
               
            ELSIF RefZustand=4 THEN
                IF NOT Status.STS_LOAD THEN
                    PASteuer_b[1]:=true;
                    RefZustand:=5;
                END_IF;
            ELSIF RefZustand=5 THEN
                IF (LoadVal_DW AND DW#16#F0000000) = (DINT_TO_DWORD(Geber_DI) AND DW#16#F0000000) THEN
                    Axis.DoneRef:=true;
                    Axis.InternalPosOffset:=Axis.InternalPosOffset-DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*aufl;
                    Axis.InternalPosOffset:=Axis.InternalPosOffset-RefPointInt+Axis.RefPoint;
                    RefPointInt:=Axis.RefPoint;
                    Axis.PositionOffset:=DWORD_TO_DINT(LoadVal_DW);
                    Axis.LageIstwert_DI:=DWORD_TO_DINT(LoadVal_DW);
                    GeberAlt_DI:=DWORD_TO_DINT(LoadVal_DW);
                    PASteuer_b[1]:=false;
                    RefZustand:=0;                   
                ELSE
                    Axis.EintreiberFahrbereit:=true;
                END_IF;
            END_IF;
        ELSIF Axis.ExecRef=1 THEN
            RefPointInt:=Axis.RefPoint;
            Axis.InternalPosOffset:=RefPointInt;
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.DoneRef:=true;
        ELSE
            Axis.DoneRef:=false;
            Axis.EintreiberFahrbereit:=false;
            PASteuer_b[1]:=false;
            RefZustand:=0;
        END_IF;
    END_IF;
ELSIF EncoderZustand=0 THEN
    IF NOT Status.STS_LOAD THEN
        PASteuer_b[8]:=true;
        EncoderZustand:=1;
    END_IF;   
ELSIF EncoderZustand=1 THEN    
    IF Status.STS_LOAD THEN
        PASteuer_b[8]:=false;
        EncoderZustand:=2;
    END_IF;   
ELSIF EncoderZustand=2 THEN
    IF NOT Status.STS_LOAD THEN
        PASteuer_b[0]:=true;
        EncoderZustand:=3;
    END_IF;   
ELSIF EncoderZustand=3 THEN
    IF Status.STS_GATE THEN
        Axis.EinInitLaeuft:=false;
        EncoderZustand:=4;
        PASteuer_b[4]:=true;
        PASteuer_b[6]:=true;
    END_IF;   
END_IF;   
 
LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
Axis.LageIstwert_DI:=LageDiff_DI+Axis.LageIstwert_DI;
Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                  aufl+RefPointInt;
Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;
GeberAlt_DI:=Geber_DI;
Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
 
IF Axis.AxisType THEN
    TruncKorr:=(Axis.ActPosition-Axis.AxisLimitMin)/Axis.AchsLaenge;
    TruncKorr_DI:=TRUNC(TruncKorr);
    IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
        TruncKorr_DI:=TruncKorr_DI-1;
    END_IF;
   
    Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
ELSE   
    Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                 Axis.ActPosition<=Axis.AxisLimitMin;
    Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                 Axis.ActPosition>=Axis.AxisLimitMax;
    Err_DW_str:=Axis.Err;                            
    Axis.Error:=Err_DW<>0;                            
END_IF;
   
IF NOT (Sim OR EncErr) THEN
    PASteuer_b[3]:=DOut_1;
    PASteuer_b[5]:=DOut_2;
    IF Taktsynchron THEN
        QW[Addr_Steuer]:=PASteuer;
    ELSE
        PQW[Addr_Steuer]:=PASteuer;
    END_IF;
END_IF;
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB27 EncoderFM350 - Input driver for FM350

Name: EncFM350
Symbolic Name: EncoderFM350
Symbol Comment: Input driver for FM350
Family: EMC2
Version: 2.1
Author: EMC
Last modified: 03/12/2009
Use: UDT1,SFB52,SFC6
Size in work memory: 2634
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCLCOMP K05.03.05.00_01.03.00.01 release

FUNCTION_BLOCK FB127
TITLE ='Input driver for FM350'
AUTHOR : EMC
FAMILY : EMC2
NAME : EncFM350
VERSION : '2.1'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
END_VAR
VAR_OUTPUT
  DI_0 : BOOL ;    //Digital input 0
  DI_1 : BOOL ;    //Digital input 1
  DI_2 : BOOL ;    //Digital input 2
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
  ReadDiagErr : BOOL  := TRUE;    //1=Read data record 1 (DS1)
END_VAR
VAR
  Koord : STRUCT    
   DA_ERR_W : WORD ;    //Data error word
   OT_ERR_B : BYTE ;    //Operating error byte
   bit0 : BOOL ;   
   STS_TFB : BOOL ;    //Status test free
   DIAG : BOOL ;    //internal use
   OT_ERR : BOOL ;    //internal use
   DATA_ERR : BOOL ;    //Data error bit
   FM_NEUSTQ : BOOL ;    //internal use
   FM_NEUST : BOOL ;    //internal use
   PARA : BOOL ;    //1=Module configured
  END_STRUCT ;   
  Koord_dw AT Koord : DWORD ;
  Status : STRUCT    
   byte0 : BYTE ;   
   STS_RUN : BOOL ;    //Status counter working
   STS_DIR : BOOL ;    //Status count direction
   STS_ZERO : BOOL ;    //Status zero pass
   STS_OFLW : BOOL ;    //Status overflow
   STS_UFLW : BOOL ;    //Status underflow
   STS_SYNC : BOOL ;    //Status counter synchronized
   STS_GATE : BOOL ;    //Status internal gate
   STS_SW_G : BOOL ;    //Status software gate
   STS_SET : BOOL ;    //Status software gate
   bit9 : BOOL ;   
   STS_STA : BOOL ;    //Status digital input START
   STS_STP : BOOL ;    //Status digital input STOP
   STS_CMP1 : BOOL ;    //Status output comparison value 1
   STS_CMP2 : BOOL ;    //Status output comparison value 2
   bit14 : BOOL ;   
   bit15 : BOOL ;   
   LoadInCounter : BOOL ;    //internal use
   LoadInLoad : BOOL ;    //internal use
   Comp1Set : BOOL ;    //internal use
   Comp2Set : BOOL ;    //internal use
   NoSync : BOOL ;    //internal use
   NoZero : BOOL ;    //internal use
   bit6 : BOOL ;   
   bit7 : BOOL ;   
  END_STRUCT ;   
  Status_dw AT Status : DWORD ;
  JobErr : INT ;    //Error reported while reading DS1
  DiagStatus : STRUCT    
   MDL_DEFECT : BOOL ;    //Module defective
   INT_FAULT : BOOL ;    //Internal fault
   EXT_FAULT : BOOL ;    //External fault
   PNT_INFO : BOOL ;    //Point information
   EXT_VOLTAGE : BOOL ;    //External voltage low
   FLD_CONNCTR : BOOL ;    //Field wiring connector missing
   NO_CONFIG : BOOL ;    //Module has no configuration data
   CONFIG_ERR : BOOL ;    //Module has configuration error
   MDL_TYPE : BYTE ;    //Type of module
   SUB_NDL_ERR : BOOL ;    //Sub-Module is missing or has error
   COMM_FAULT : BOOL ;    //Communication fault
   MDL_STOP : BOOL ;    //Module is stopped
   WTCH_DOG_FLT : BOOL ;    //Watch dog timer stopped module
   INT_PS_FLT : BOOL ;    //Internal power supply fault
   PRIM_BATT_FLT : BOOL ;    //Primary battery is in fault
   BCKUP_BATT_FLT : BOOL ;    //Backup battery is in fault
   RESERVED_2 : BOOL ;    //Reserved for system
   RACK_FLT : BOOL ;    //Rack fault, only for bus interface module
   PROC_FLT : BOOL ;    //Processor fault
   EPROM_FLT : BOOL ;    //EPROM fault
   RAM_FLT : BOOL ;    //RAM fault
   ADU_FLT : BOOL ;    //ADU fault
   FUSE_FLT : BOOL ;    //Fuse fault
   HW_INTR_FLT : BOOL ;    //Hardware interupt input in fault
   RESERVED_3 : BOOL ;    //Reserved for system 
   CH_TYPE : BYTE ;    //Channel type
   LGTH_DIA : BYTE ;    //Diagnostics data length per channel
   CH_NO : BYTE ;    //Channel number
   GRP_ERR1 : BOOL ;    //Group error channel 1
   bit7_1 : BOOL ;   
   bit7_2 : BOOL ;   
   bit7_3 : BOOL ;   
   bit7_4 : BOOL ;   
   bit7_5 : BOOL ;   
   bit7_6 : BOOL ;   
   bit7_7 : BOOL ;   
   CH1_SIGA : BOOL ;    //Error signal A
   CH1_SIGB : BOOL ;    //Error signal B
   CH1_SIGZ : BOOL ;    //Error signal zero
   CH1_BETW : BOOL ;    //Error between channels
   CH1_5V2 : BOOL ;    //Error in 5.2 V encoder supply
   byte9 : BYTE ;   
   byte10 : BYTE ;   
   byte11 : BYTE ;   
   dword12 : DWORD ;   
  END_STRUCT ;   
  DiagStatus_dw AT DiagStatus : DWORD;
  GeberAlt_DI : DINT ;    //internal use
  Addr_Status : INT ;    //internal use
  Addr_Koord : INT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  Addr_LoadVal_DI : INT ;    //internal use
  Addr_Steuer : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  PASteuer : DWORD ;    //internal use
  PASteuer_b AT PASteuer : ARRAY[0..31] OF BOOL;
  RefPointInt : REAL ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  LoadVal_DW : DWORD ;    //internal use
  RefZustand : INT ;    //internal use
  DiagFehler : BOOL ;    //internal use
  EncErr_alt : BOOL ;    //internal use
  Diag_alt : BOOL ;    //internal use
  Taktsynchron : BOOL ;    //internal use
  sRDREC : SFB52;   
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  Addr_InChannel : INT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
  SFCErr : INT ;    //Rückgabewert des SFC6 (RD_SINFO) lokal, da keine relevante Info
  TOP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  START_UP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  Sim : BOOL ;    //internal use
END_VAR
BEGIN
 
IF  NOT Init AND NOT EncErr  AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Addr_InChannel:=AXis.InputModuleInAddr;
    Addr_Status:=Addr_InChannel+12;
    Addr_ActPos_DI:=Addr_InChannel+4;
    Addr_Koord:=Addr_InChannel+8;
    Addr_LoadVal_DI:=Addr_InChannel;
    Addr_Steuer:=Addr_LoadVal_DI+12;
    v_Faktor:=Axis.aufl/Axis.Sample_T;
    Koord_dw:=DW#16#0;
    Status_dw:=DW#16#0;
    PASteuer:=DW#16#0;
    DiagFehler:=false;
    ReadDiagErr:=true;
    Axis.EinInitLaeuft:=true;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Diag_alt:=false;
    Axis.DoneRef:=false;
    RefPointInt:=Axis.RefPoint;
    Axis.ExecRef:=0;
    Axis.Sync:=false;
    Axis.EncoderType:=false;
    Richtungsanpassung:=Axis.PolarityEncoder;
    RefZustand:=0;
   
    SFCErr:=RD_SINFO(TOP_SI :=  TOP_SI
             ,START_UP_SI :=  START_UP_SI
             );
   
    SFCErr:=BYTE_TO_INT(TOP_SI.NUM);
    Taktsynchron:=SFCErr>=61 AND SFCErr<=64;
END_IF;
 
Sim:=Axis.Sim;
 
IF Sim OR EncErr THEN
    Koord_dw:=DW#16#80;
    PASteuer:=DW#16#0;
    Axis.EinInitLaeuft:=false;
    ReadDiagErr:=false;
ELSE
    IF Taktsynchron THEN
        Status_dw:=ID[Addr_Status];
        Koord_dw:=ID[Addr_Koord];
    ELSE    
        Status_dw:=PID[Addr_Status];
        Koord_dw:=PID[Addr_Koord];
    END_IF;   
   
    IF (Koord_dw AND DW#16#60) = DW#16#40 THEN
        PASteuer:=DW#16#40000000;
        Init:=true;
        Axis.EinInitLaeuft:=true;
        Axis.Sync:=false;
        Axis.EintreiberFahrbereit:=false;
    ELSE
        PASteuer_b[6]:=false;
        IF Taktsynchron THEN
            Axis.EncoderValue:=DWORD_TO_DINT(ID[Addr_ActPos_DI]);
        ELSE
            Axis.EncoderValue:=DWORD_TO_DINT(PID[Addr_ActPos_DI]);
        END_IF;
      
        IF Koord.DIAG XOR Diag_alt THEN
            ReadDiagErr:=true;
            Diag_alt:=Koord.DIAG;
        END_IF;
 
        IF ReadDiagErr THEN
            sRDREC(REQ :=  true
                ,ID := INT_TO_DWORD(Axis.InputModuleInAddr)
                ,INDEX := 1
                ,MLEN := 16
                ,RECORD :=  DiagStatus
                );
            ReadDiagErr:=sRDREC.BUSY;
            JobErr:=DWORD_TO_INT(SHR(IN:=sRDREC.STATUS,N:=8));
            IF (JobErr>=32930 AND JobErr<=32932) OR (JobErr>=32960 AND JobErr<=32975)
            THEN
                ReadDiagErr:=true;
            END_IF;
           
            IF NOT ReadDiagErr THEN
                IF JobErr>=0 THEN
                    IF DiagStatus.MDL_DEFECT THEN
                        IF (DW#16#F000FFFF AND DiagStatus_dw)<>0 THEN
                            DiagFehler:=true;
                        ELSE
                            DiagFehler:=DiagStatus.GRP_ERR1;
                        END_IF;
                    ELSE
                        DiagFehler:=false;
                    END_IF;   
                ELSE
                    DiagFehler:=true;
                END_IF;
            END_IF;
        END_IF;
    END_IF;     
END_IF;     
 
Geber_DI:=Axis.EncoderValue;
DI_0:=Status.STS_STA;
DI_1:=Status.STS_STP;
DI_2:=Status.STS_SET;
 
IF EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
    Axis.Sync:=false;
    ELSE      
    IF Init THEN
        GeberAlt_DI:=Geber_DI;
        Axis.LageIstwert_DI:=Geber_DI;
        Axis.PositionOffset:=Geber_DI;
    END_IF;
 
    IF (Koord.OT_ERR OR Koord.DATA_ERR) OR
       (NOT Koord.PARA AND Koord.FM_NEUSTQ) OR
       DiagFehler
    THEN
        Axis.Err.EncoderErr:=true;
        Axis.Error:=true;
        Axis.Sync:=false;
    ELSE
        IF Axis.ExecRef=2 THEN
            IF RefZustand=0 THEN
                LoadVal_DW:=DINT_TO_DWORD(Geber_DI) XOR DW#16#50000000;
                LoadVal_DW:=LoadVal_DW AND DW#16#F0000000;
                LoadVal_DW:=LoadVal_DW OR DW#16#2000000;
                IF Status.STS_SET THEN
                    RefZustand:=5;
                    LoadVal_DW:=DINT_TO_DWORD(Geber_DI);
                ELSE
                    IF Sim THEN
                        RefZustand:=5;
                    ELSE
                        IF Taktsynchron THEN
                            QD[Addr_LoadVal_DI]:=LoadVal_DW;
                        ELSE
                            PQD[Addr_LoadVal_DI]:=LoadVal_DW;
                        END_IF;
                        PASteuer_b[25]:=true;
                        RefZustand:=3;
                    END_IF;
                END_IF;
            ELSIF RefZustand=3 THEN
                IF Status.LoadInLoad THEN
                    PASteuer_b[25]:=false;
                    RefZustand:=4;
                END_IF;
            ELSIF RefZustand=4 THEN
                IF Taktsynchron THEN
                    IF ID[Addr_LoadVal_DI]=LoadVal_DW THEN
                        RefZustand:=5;
                    END_IF;   
                ELSE
                    IF PID[Addr_LoadVal_DI]=LoadVal_DW THEN
                        RefZustand:=5;
                    END_IF;   
                END_IF;
            ELSIF RefZustand=5 THEN
                IF (LoadVal_DW AND DW#16#F0000000)=(DINT_TO_DWORD(Geber_DI) AND DW#16#F0000000) THEN
                    Axis.DoneRef:=true;
                    Axis.InternalPosOffset:=(Axis.InternalPosOffset-DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*Axis.aufl)
                                            -RefPointInt+Axis.RefPoint;
                    RefPointInt:=Axis.RefPoint;
                    Axis.PositionOffset:=DWORD_TO_DINT(LoadVal_DW);
                    Axis.LageIstwert_DI:=DWORD_TO_DINT(LoadVal_DW);
                    GeberAlt_DI:=DWORD_TO_DINT(LoadVal_DW);
                   
                    PASteuer:=PASteuer AND DW#16#FFFCFFFF;
                    RefZustand:=0;
                ELSE
                    PASteuer:=PASteuer OR DW#16#30000;
                    Axis.EintreiberFahrbereit:=true;
                END_IF;
            END_IF;
        ELSIF Axis.ExecRef=1 THEN
            RefPointInt:=Axis.RefPoint;
            Axis.InternalPosOffset:=RefPointInt;
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.DoneRef:=true;
        ELSE
            Axis.DoneRef:=false;
            Axis.EintreiberFahrbereit:=false;
            PASteuer:=PASteuer AND DW#16#FFFCFFFF;
        END_IF;
       
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
        Axis.LageIstwert_DI:=LageDiff_DI+Axis.LageIstwert_DI;
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)
                          *Axis.aufl+RefPointInt;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;   
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
       
        IF Axis.AxisType THEN
            TruncKorr:=(Axis.ActPosition-Axis.AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;
           
            Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
        ELSE
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition<=Axis.AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition>=Axis.AxisLimitMax;
            Err_DW_str:=Axis.Err;                            
            Axis.Error:=Err_DW<>0;                            
        END_IF;
    END_IF;   
END_IF;     
 
IF Init    THEN
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
   
    IF PASteuer=DW#16#0 THEN
        IF NOT ReadDiagErr THEN
            Init:=false;
            Axis.EinInitLaeuft:=false;
        END_IF;    
    END_IF;
END_IF;
 
IF NOT (Sim OR EncErr) THEN
    IF Taktsynchron THEN
        QD[Addr_Steuer]:=PASteuer;
    ELSE
        PQD[Addr_Steuer]:=PASteuer;
    END_IF;
END_IF;
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB28 EncoderCPU314C - Input driver for CPU 314C counter

Name: Enc314C
Symbolic Name: EncoderCPU314C
Symbol Comment: Input driver for CPU 314C counter
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 12/11/2002
Use: UDT1,SFB47,SFC58
Size in work memory: 1416
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.15)

FUNCTION_BLOCK FB128
TITLE ='Input driver for CPU 314C counter'
AUTHOR : EMC
FAMILY : EMC2
NAME : Enc314C
VERSION : '2.0'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
END_VAR
VAR_IN_OUT
  Axis : UDT1;     //Global axis data   
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  GeberAlt_DI : DINT ;    //internal use
  Addr_ActPos_DI : INT ;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  Steuer_W : WORD ;    //internal use
  RefPointInt : REAL ;    //internal use
  DSNummer : BYTE ;    //internal use
  SFC_err : INT ;    //internal use
  SFB_Count : SFB47;   
  Richtungsanpassung : INT  := 1;    //internal use
  aufl : REAL ;    //internal use
  AxisLimitMin : REAL ;    //internal use
  AxisLimitMax : REAL ;    //internal use
  PositionOffset : DINT ;    //internal use
  EncErr_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
  GeberAmAchsende : DINT ;    //internal use
  GeberAmAchsanfang : DINT ;    //internal use
  Hilf_DI : DINT ;    //internal use
  DStorauf : STRUCT    
   TF_Kennung : WORD ;   
   Job_ID : INT ;   
   CtrlVal : DWORD ;   
  END_STRUCT ;   
  Sim : BOOL ;    //internal use
  SFC_busy : BOOL ;    //internal use
END_VAR
BEGIN
 
Sim:=Axis.Sim;
 
IF NOT Init AND NOT EncErr   AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Addr_ActPos_DI:=Axis.InputChannelNo*4+Axis.InputModuleInAddr;
    DSNummer:=int_to_byte(Axis.InputChannelNo*2+3);
    Axis.EinInitLaeuft:=true;
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;
    Axis.ExecRef:=0;
    RefPointInt:=Axis.RefPoint;
    aufl:=Axis.aufl;
    v_Faktor:=aufl/Axis.Sample_T;
    Richtungsanpassung:=Axis.PolarityEncoder;
    AxisLimitMin:=Axis.AxisLimitMin;
    AxisLimitMax:=Axis.AxisLimitMax;
    Axis.EncoderType:=false;
    Axis.Sync:=false;
   
    SFB_Count.LADDR:=int_to_word(Axis.InputModuleInAddr);
    SFB_Count.CHANNEL:=Axis.InputChannelNo;
    SFB_Count.SW_GATE:=true;
    SFB_Count.JOB_REQ:=false;
    SFC_busy:=false;
   
    IF NOT Sim THEN 
        DStorauf.TF_Kennung:=W#16#21;
        DStorauf.Job_ID:=32;
        DStorauf.CtrlVal:=DW#16#1;
       
   
    SFC_err:=SFC58(REQ :=  true
           ,IOID :=  B#16#54
           ,LADDR :=  INT_TO_WORD(Axis.InputModuleInAddr)
           ,RECNUM :=  DSNummer
           ,RECORD :=  DStorauf
           ,BUSY :=  SFC_busy
           );
    END_IF
END_IF;      
 
IF NOT(Sim OR EncErr) THEN 
    Axis.EncoderValue:=DWORD_TO_DINT(PID[Addr_ActPos_DI]);
END_IF;
 
Geber_DI:=Axis.EncoderValue;
 
IF EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
    Axis.Sync:=false;
END_IF;
 
IF NOT EncErr THEN
    IF Init THEN
        Axis.LageIstwert_DI:=Geber_DI;
        GeberAlt_DI:=Geber_DI;
        PositionOffset:=Axis.PositionOffset;
        Axis.PositionOffset:=GeberAlt_DI;
    END_IF;
    IF NOT Axis.Err.EncoderErr THEN
        IF Axis.ExecRef=2 THEN
            IF NOT Sim THEN
                SFB_Count();
            END_IF;
            IF SFB_Count.STS_LTCH THEN
                Axis.DoneRef:=true;
                PositionOffset:=Axis.PositionOffset;
                Axis.InternalPosOffset:=(Axis.InternalPosOffset-
                                         DINT_TO_REAL(Axis.LageIstwert_DI-PositionOffset)*aufl)-
                                         RefPointInt+Axis.RefPoint;
                RefPointInt:=Axis.RefPoint;                        
                IF NOT Axis.EintreiberFahrbereit OR Sim THEN 
                    PositionOffset:=Geber_DI;
                ELSE
                    PositionOffset:=SFB_Count.LATCHVAL;
                END_IF;
                Axis.LageIstwert_DI:=PositionOffset;
                GeberAlt_DI:=PositionOffset;
                Axis.PositionOffset:=PositionOffset;
            ELSE    
                Axis.EintreiberFahrbereit:=true;           
            END_IF;
           
        ELSIF Axis.ExecRef=1 THEN
            RefPointInt:=Axis.RefPoint;
            Axis.InternalPosOffset:=RefPointInt;
            Axis.InternalNomPosition:=0.0;
            Axis.LastNomPosition:=0.0;
            Axis.LageIstwert_DI:=Geber_DI;
            Axis.PositionOffset:=Geber_DI;
            Axis.DoneRef:=true;
        ELSE
            Axis.DoneRef:=false;
            Axis.EintreiberFahrbereit:=false;
        END_IF;
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*INT_TO_DINT(Richtungsanpassung);
        Axis.LageIstwert_DI:=LageDiff_DI+Axis.LageIstwert_DI;
        Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                          aufl+RefPointInt;
        Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;
        GeberAlt_DI:=Geber_DI;
        Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
        IF Axis.AxisType THEN
            TruncKorr:=(Axis.ActPosition-AxisLimitMin)/Axis.AchsLaenge;
            TruncKorr_DI:=TRUNC(TruncKorr);
            IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
                TruncKorr_DI:=TruncKorr_DI-1;
            END_IF;    
            Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
        ELSE
            Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition<=AxisLimitMin;
            Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                         Axis.ActPosition>=AxisLimitMax;
            Err_DW_str:=Axis.Err;                            
            Axis.Error:=Err_DW<>0;                            
        END_IF;
    END_IF;
END_IF;      
 
IF Init    THEN
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
    Init:=SFC_busy;
    Axis.EinInitLaeuft:=SFC_busy;
END_IF;    
END_FUNCTION_BLOCK


emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB29 EncoderUniversal - Universal input driver

Name: EncUniv
Symbolic Name: EncoderUniversal
Symbol Comment: Universal input driver
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 1416
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)

FUNCTION_BLOCK FB129
TITLE ='Universal input driver'
AUTHOR : EMC
FAMILY : EMC2
NAME : EncUniv
VERSION : '2.0'
 
 
VAR_INPUT
  EncErr : BOOL ;    //1=Encoder error
  EncoderValue : DINT ;    //Current encoder value [step]
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  GeberAlt_DI : DINT ;    //internal use
  v_Faktor : REAL ;    //internal use
  MaxZahl : DINT ;    //internal use
  MaxZahlHalb : DINT ;    //internal use
  RefPointInt : REAL ;    //internal use
  Richtungsanpassung : INT  := 1;    //internal use
  PositionOffset : DINT ;    //internal use
  EncoderType : BOOL ;    //internal use
  EncErr_alt : BOOL ;    //internal use
END_VAR
VAR_TEMP
  Geber_DI : DINT ;    //internal use
  LageDiff_DI : DINT ;    //internal use
  TruncKorr : REAL ;    //internal use
  TruncKorr_DI : DINT ;    //internal use
  Err_DW : DWORD ;    //internal use
  Err_DW_str AT Err_DW : STRUCT
     SWLimitMinExceeded : BOOL ;    //1=Min. SW limit switch exceeded
     SWLimitMaxExceeded : BOOL ;    //1=Max. SW limit switch exceeded
     TargetErr : BOOL ;    //1=Target beyond travel range
     NoSync : BOOL ;    //1=Axis not synchronized
     DirectionErr : BOOL ;    //1=Motion not allowed in direction entered
     DataErr : BOOL ;    //1=Invalid motion FB parameter
     StartErr : BOOL ;    //1=Start not possible in current axis state
     DistanceErr : BOOL ;    //1=Motion is too far
     MasterErr : BOOL ;    //1=Master axis error with hard stop or wrong axis status
     bit09 : BOOL ;   
     bit10 : BOOL ;   
     bit11 : BOOL ;   
     bit12 : BOOL ;   
     bit13 : BOOL ;   
     bit14 : BOOL ;   
     bit15 : BOOL ;   
     StoppedMotion : BOOL ;    //1=Axis is in stop and must be acknowledged
     EnableDriveErr : BOOL ;    //1=Drive enable missing
     FollowingDistErr : BOOL ;    //1=Max. following distance exceeded
     StandstillErr : BOOL ;    //1=Outside standstill range
     TargetApproachErr : BOOL ;    //1=Target approach error
     EncoderErr : BOOL ;    //1=Encoder error
     OutputErr : BOOL ;    //1=Output driver error
     ConfigErr : BOOL ;    //1=Axis data incorrectly configured
     DriveErr : BOOL ;    //1=Drive error
     bit25 : BOOL ;   
     bit26 : BOOL ;   
     bit27 : BOOL ;   
     bit28 : BOOL ;   
     bit29 : BOOL ;   
     bit30 : BOOL ;   
     bit31 : BOOL ;   
  END_STRUCT
 
  GeberAmAchsende : DINT ;    //internal use
  GeberAmAchsanfang : DINT ;    //internal use
  Hilf_DI : DINT ;    //internal use
END_VAR
BEGIN
 
IF (NOT Init) AND NOT EncErr AND EncErr_alt THEN
    Init:=true;
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
END_IF;
 
IF Init THEN
    Axis.EintreiberFahrbereit:=false;
    EncErr_alt:=false;
    Axis.DoneRef:=false;
    Axis.ExecRef:=0;
    RefPointInt:=Axis.RefPoint;
    v_Faktor:=Axis.aufl/Axis.Sample_T;
    Richtungsanpassung:=Axis.PolarityEncoder;
    EncoderType:=Axis.EncoderType;
    IF NOT EncoderType THEN
        Axis.Sync:=false;
    ELSE
        MaxZahl:=Axis.AbsGeberLaenge_DI;
        MaxZahlHalb:=MaxZahl/2;
    END_IF;
END_IF;   
 
IF EncErr THEN
    Axis.Err.EncoderErr:=true;
    Axis.Error:=true;
    EncErr_alt:=true;
    IF NOT EncoderType THEN Axis.Sync:=false; END_IF;
END_IF;   
   
IF  NOT (Axis.Sim OR EncErr)    THEN 
    Axis.EncoderValue:=EncoderValue;
END_IF;
 
Geber_DI:=Axis.EncoderValue;
 
IF NOT EncErr THEN 
    IF Init THEN
        Axis.LageIstwert_DI:=Geber_DI;
        GeberAlt_DI:=Geber_DI;
        PositionOffset:=Axis.PositionOffset;
        IF EncoderType THEN 
            GeberAmAchsanfang:=ROUND((Axis.AxisLimitMin-Axis.RefPoint) /
                                Axis.aufl *
                                INT_TO_REAL(Richtungsanpassung) +  
                                DINT_TO_REAL(PositionOffset) +
                                DINT_TO_REAL(MaxZahl))
                                MOD
                                MaxZahl;
            GeberAmAchsende:=ROUND((Axis.AxisLimitMax-Axis.RefPoint) / 
                                Axis.aufl *
                                INT_TO_REAL(Richtungsanpassung) +  
                                DINT_TO_REAL(PositionOffset) +
                                DINT_TO_REAL(MaxZahl))
                                MOD
                                MaxZahl;   
            IF Richtungsanpassung=-1 THEN 
                Hilf_DI:=GeberAmAchsanfang;
                GeberAmAchsanfang:=GeberAmAchsende;
                GeberAmAchsende:=Hilf_DI;
            END_IF;     
                               
            Hilf_DI:=0;
           
            IF GeberAmAchsanfang>GeberAmAchsende THEN 
                IF PositionOffset>=GeberAmAchsanfang THEN
                    IF Geber_DI<=GeberAmAchsende THEN 
                        Hilf_DI:=MaxZahl;
                    END_IF;
                END_IF;
                IF PositionOffset<=GeberAmAchsende THEN 
                    IF Geber_DI>=GeberAmAchsanfang THEN
                        Hilf_DI:=-MaxZahl;
                    END_IF;
                END_IF;
            END_IF;
            Axis.LageIstwert_DI:=(Geber_DI+Hilf_DI-PositionOffset) *
                                 INT_TO_DINT(Richtungsanpassung) + PositionOffset;
              ELSE
            Axis.PositionOffset:=Geber_DI;
        END_IF;
    END_IF;
   
    IF Axis.ExecRef=2 OR Axis.ExecRef=1 THEN 
        RefPointInt:=Axis.RefPoint;
        Axis.InternalPosOffset:=RefPointInt;
        Axis.InternalNomPosition:=0.0;
        Axis.LastNomPosition:=0.0;
        Axis.LageIstwert_DI:=Geber_DI;
        Axis.PositionOffset:=Geber_DI;
        Axis.DoneRef:=true;
        Axis.EintreiberFahrbereit:=true;
    ELSE
        Axis.DoneRef:=false;
        Axis.EintreiberFahrbereit:=false;
    END_IF;
     
        LageDiff_DI:=(Geber_DI-GeberAlt_DI)*int_to_dint(Richtungsanpassung);
     
    IF  EncoderType THEN 
        IF LageDiff_DI<-MaxZahlHalb THEN
            LageDiff_DI:=LageDiff_DI+MaxZahl;
        END_IF;
        IF LageDiff_DI>MaxZahlHalb THEN
            LageDiff_DI:=LageDiff_DI-MaxZahl;
        END_IF;
    END_IF;   
    Axis.LageIstwert_DI:=Axis.LageIstwert_DI+LageDiff_DI; 
    Axis.ActPosition:=DINT_TO_REAL(Axis.LageIstwert_DI-Axis.PositionOffset)*
                      Axis.aufl+RefPointInt;
    Axis.InternalActPos:=Axis.ActPosition-Axis.InternalPosOffset;   
    GeberAlt_DI:=Geber_DI;
    Axis.ActVelocity:=DINT_TO_REAL(LageDiff_DI)*v_Faktor;
   
    if Axis.AxisType then
        TruncKorr:=(Axis.ActPosition-Axis.AxisLimitMin)/Axis.AchsLaenge;
        TruncKorr_DI:=TRUNC(TruncKorr);
        IF TruncKorr<0.0 AND DINT_TO_REAL(TruncKorr_DI)<>TruncKorr THEN
            TruncKorr_DI:=TruncKorr_DI-1;
        END_IF;
        Axis.ActPosition:=Axis.ActPosition-DINT_TO_REAL(TruncKorr_DI)*Axis.AchsLaenge;
    ELSE 
        Axis.Err.SWLimitMinExceeded:=Axis.SWLimitEnable AND Axis.Sync AND
                                     Axis.ActPosition<=Axis.AxisLimitMin;
        Axis.Err.SWLimitMaxExceeded:=Axis.SWLimitEnable and Axis.Sync AND
                                     Axis.ActPosition>=Axis.AxisLimitMax;
        Err_DW_str:=Axis.Err;                            
        Axis.Error:=Err_DW<>0;                            
    END_IF;  
END_IF;     
 
IF Init THEN 
    Init:=false;
    Axis.InternalNomPosition:=Axis.InternalActPos;
    Axis.LastNomPosition:=Axis.InternalActPos;
    Axis.VLastNomPosition:=Axis.InternalActPos;
END_IF;    
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB31 OutputIM178 - Output driver for IM178-4



Name: OutIM178
Symbolic Name: OutputIM178
Symbol Comment: Output driver for IM178-4
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 436
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)

FUNCTION_BLOCK FB31 // OutputIM178
TITLE ='Output driver for IM178-4'
AUTHOR : EMC
FAMILY : EMC2
NAME : OutIM178
VERSION : '2.0'
 
 
VAR_INPUT
  EnableDrive : BOOL ;    //1=Enable analog output
  Q0 : BOOL ;    //1=Set digital output 0
  Q1 : BOOL ;    //1=Set digital output 1
  Q2 : BOOL ;    //1=Set digital output 2
  OutErr : BOOL ;    //1=Output module error
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Faktor : REAL ;    //internal use
  Addr_OutChannel : INT ;    //internal use
  Addr_NomVelocity_I : INT ;    //internal use
END_VAR
VAR_TEMP
  OutputValue_R : REAL ;    //internal use
  OutputValue_B AT OutputValue_R : ARRAY[0..31] OF BOOL;
  OutputValue : INT ;    //internal use
  Steuer_W : WORD ;    //internal use
  Steuer_Byte AT Steuer_W : BYTE ;
  Steuer_Bool AT Steuer_W : ARRAY[0..7] OF BOOL ;
  vz : BOOL ;    //internal use
END_VAR
BEGIN
 
IF Init
THEN
    Init:=false;
    Faktor:=INT_TO_REAL(Axis.PolarityDrive)*Axis.DriveInputAtMaxVel/Axis.MaxVelocity;
    Addr_OutChannel:=Axis.OutputChannelNo*4+Axis.OutputModuleOutAddr;
    Addr_NomVelocity_I:=Addr_OutChannel+2;
END_IF;     
 
IF OutErr 
THEN
    Axis.Error:=true;
    Axis.Err.OutputErr:=true;
END_IF;
 
OutputValue_R:=(Axis.OutVelocity*Faktor+Axis.OffsetCompensation)*3.044000e+003;
 
IF ABS(OutputValue_R)>3.044000e+004
THEN
      vz:=OutputValue_B[7]; // save sign of real number : cool trick
      OutputValue_R:=3.044000e+004;
      OutputValue_B[7]:=vz; // restore sign
END_IF;   
 
OutputValue:=REAL_TO_INT(OutputValue_R);
 
Steuer_Byte:=BOOL_TO_BYTE(Q0);
Steuer_Bool[1]:=Q1;
Steuer_Bool[2]:=Q2;
Steuer_Bool[7]:=EnableDrive;
 
IF NOT EnableDrive 
THEN
    OutputValue:=0;
END_IF;
  
IF NOT (Axis.Sim OR OutErr)
THEN
    PQB[Addr_OutChannel]:=Steuer_Byte;
    PQW[Addr_NomVelocity_I]:=INT_TO_WORD(OutputValue);
END_IF;
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.





FB32 OutputSM432 - Output driver for SM432



Name: OutSM432
Symbolic Name: OutputSM432
Symbol Comment: Output driver for SM432
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 352
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB32 //OutputSM432
TITLE ='Output driver for SM432'
AUTHOR : EMC
FAMILY : EMC2
NAME : OutSM432
VERSION : '2.0'
 
VAR_INPUT
  EnableDrive : BOOL ;    //1=Enable analog output
  OutErr : BOOL ;    //1=Output module error
END_VAR
VAR_IN_OUT
  Axis : UDT1;
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Faktor : REAL ;    //internal use
  Addr_NomVelocity_I : INT ;    //internal use
END_VAR
VAR_TEMP
  OutputValue_R : REAL ;    //internal use
  OutputValue_B AT OutputValue_R : ARRAY[0..31] OF BOOL;
  OutputValue : INT ;    //internal use
  vz : BOOL ;    //internal use
END_VAR
BEGIN
IF Init
THEN
    Init:=false;
    Faktor:=INT_TO_REAL(Axis.PolarityDrive)*Axis.DriveInputAtMaxVel/Axis.MaxVelocity;
    Addr_NomVelocity_I:=Axis.OutputChannelNo*2+Axis.OutputModuleOutAddr;
END_IF;     
 
IF OutErr 
THEN
    Axis.Error:=true;
    Axis.Err.OutputErr:=true;
END_IF;
OutputValue_R:=(Axis.OutVelocity*Faktor+Axis.OffsetCompensation)*2.764800e+003;
IF ABS(OutputValue_R)>2.764800e+004
THEN
      vz:=OutputValue_B[7]; // save sign of real number : cool trick
      OutputValue_R:=2.764800e+004;
      OutputValue_B[7]:=vz; // restore sign
END_IF;   
OutputValue:=REAL_TO_INT(OutputValue_R);
IF NOT EnableDrive 
THEN
    OutputValue:=0;
END_IF;
  
IF NOT (Axis.Sim OR OutErr)
THEN
    PQW[Addr_NomVelocity_I]:=INT_TO_WORD(OutputValue);
END_IF;    
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.



FB33 OutputET200S2AO - Output driver for ET200S 2AO



Name: OutET2AO
Symbolic Name: OutputET200S2AO
Symbol Comment: Output driver for ET200S 2AO
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 498
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB33 // OutputET200S2AO
TITLE ='Output driver for ET200S 2AO'
AUTHOR : EMC
FAMILY : EMC2
NAME : OutET2AO
VERSION : '2.0'
 
 
VAR_INPUT
  EnableDrive : BOOL ;    //1=Enable analog output
  OutErr : BOOL ;    //1=Output module error
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;    //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Faktor : REAL ;    //internal use
  Addr_NomVelocity_I : INT ;    //internal use
  Taktsynchron : BOOL ;    //internal use
END_VAR
VAR_TEMP
  OutputValue_R : REAL ;    //internal use
  OutputValue_B AT OutputValue_R : ARRAY[0..31] OF BOOL;
  OutputValue : INT ;    //internal use
  vz : BOOL ;    //internal use
  SFCErr : INT ;    //Rückgabewert des SFC6 (RD_SINFO) lokal, da keine relevante Info
  TOP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
  START_UP_SI : STRUCT    
   EV_CLASS : BYTE ;   
   EV_NUM : BYTE ;   
   PRIORITY : BYTE ;   
   NUM : BYTE ;   
   TYP2_3 : BYTE ;   
   TYP1 : BYTE ;   
   ZI1 : WORD ;   
   ZI2_3 : DWORD ;   
  END_STRUCT ;   
END_VAR
BEGIN
IF Init
THEN
    Init:=false;
    Faktor:=INT_TO_REAL(Axis.PolarityDrive)*Axis.DriveInputAtMaxVel/Axis.MaxVelocity;
    Addr_NomVelocity_I:=Axis.OutputChannelNo*2+Axis.OutputModuleOutAddr;
    SFCErr:=RD_SINFO(TOP_SI := TOP_SI,START_UP_SI := START_UP_SI);
    SFCErr:=BYTE_TO_INT(TOP_SI.NUM);
    Taktsynchron:=SFCErr>=61 AND SFCErr<=64;
END_IF;
 
IF OutErr 
THEN
    Axis.Error:=true;
    Axis.Err.OutputErr:=true;
END_IF;
 
OutputValue_R:=(Axis.OutVelocity*Faktor+Axis.OffsetCompensation)*2.764800e+003;
 
IF ABS(OutputValue_R)>2.764800e+004
THEN
      vz:=OutputValue_B[7]; // save sign of real number : cool trick
      OutputValue_R:=2.764800e+004;
      OutputValue_B[7]:=vz; // restore sign
END_IF
 
OutputValue:=REAL_TO_INT(OutputValue_R);
 
IF NOT EnableDrive 
THEN
    OutputValue:=0;
END_IF;
  
IF NOT (Axis.Sim OR OutErr)
THEN
    IF Taktsynchron
    THEN
        QW[Addr_NomVelocity_I]:=INT_TO_WORD(OutputValue);
    ELSE
        PQW[Addr_NomVelocity_I]:=INT_TO_WORD(OutputValue);
    END_IF;
END_IF;    
 
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.



FB34 OutputCPU314C - Output driver for CPU 314C



Name: OutIM178
Symbolic Name: Out314C
Symbol Comment: Output driver for CPU 314C
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 356
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB34 // OutputCPU314C
TITLE ='Output driver for CPU 314C'
AUTHOR : EMC
FAMILY : EMC2
NAME : Out314C
VERSION : '2.0'
 
 
VAR_INPUT
  EnableDrive : BOOL ;    //1=Enable analog output
  OutErr : BOOL ;    //1=Output module error
END_VAR
VAR_IN_OUT
  Axis : UDT1;
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Faktor : REAL ;    //internal use
  Addr_NomVelocity_I : INT ;    //internal use
END_VAR
VAR_TEMP
  OutputValue_R : REAL ;    //internal use
  OutputValue_B AT OutputValue_R : ARRAY[0..31] OF BOOL;
  OutputValue : INT ;    //internal use
  Addr_OutChannel : INT ;    //internal use
  vz : BOOL ;    //internal use
END_VAR
BEGIN
 
IF Init
THEN
    Init:=false;
    Faktor:=INT_TO_REAL(Axis.PolarityDrive)*Axis.DriveInputAtMaxVel/Axis.MaxVelocity;
    Addr_OutChannel:=Axis.OutputChannelNo*2+Axis.OutputModuleOutAddr;
    Addr_NomVelocity_I:=Addr_OutChannel;
END_IF;     
 
IF OutErr 
THEN
    Axis.Error:=true;
    Axis.Err.OutputErr:=true;
END_IF;
OutputValue_R:=(Axis.OutVelocity*Faktor+Axis.OffsetCompensation)*2.764800e+003;
IF ABS(OutputValue_R)>2.764800e+004
THEN
      vz:=OutputValue_B[7]; // save sign of real number : cool trick
      OutputValue_R:=2.764800e+004;
      OutputValue_B[7]:=vz; // restore sign
END_IF;   
OutputValue:=REAL_TO_INT(OutputValue_R);
IF NOT EnableDrive 
THEN
    OutputValue:=0;
END_IF;
  
IF NOT (Axis.Sim OR OutErr)
THEN
    PQW[Addr_NomVelocity_I]:=INT_TO_WORD(OutputValue);
END_IF;    
   
END_FUNCTION_BLOCK



emc

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò.



FB35 OutputSM332 - Output driver for SM332



Name: OutSM332
Symbolic Name: OutputSM332
Symbol Comment: Output driver for SM332
Family: EMC2
Version: 2.0
Author: EMC
Last modified: 11/26/2002
Use: UDT1
Size in work memory: 498
Object name: emc2
Signature: generiert vom SCL Übersetzer Version: SCL K5.1.4 (C5.1.8.13)



FUNCTION_BLOCK FB35  // OutputSM332
TITLE ='Output driver for SM332'
AUTHOR : EMC
FAMILY : EMC2
NAME : OutSM332
VERSION : '2.0'
 
 
VAR_INPUT
  EnableDrive : BOOL ;    //1=Enable analog output
  OutErr : BOOL ;    //1=Output module error
END_VAR
VAR_IN_OUT
  Axis : UDT1 ;     //Global axis data
  Init : BOOL  := TRUE;    //1=Initialize block
END_VAR
VAR
  Faktor : REAL ;    //internal use
  Addr_NomVelocity_I : INT ;    //internal use
  Taktsynchron : BOOL ;    //internal use
END_VAR
VAR_TEMP
  OutputValue_R : REAL ;    //internal use
  OutputValue_B AT OutputValue_R : ARRAY[0..31] OF BOOL;
  OutputValue