Example: Fast Homing with the Pipe Network Motion Engine Axis Pipe Block

This example explains how to use the motion library functions of the axes when you want to detect the positive edge of the first Fast Input in the drive and read its associated timestamp.

MLAxisIsTrigged can be used to accurately perform a homing procedure in a user-defined procedure.

Procedure

  1. MLAxisCfgFastIn (PipeNetwork.AXIS1, MLFI_FIRST, MLFI_RISING_EDGE)
    • Configure Fast Input 0 of AXIS1 to be triggered on the positive edge.

      • Since tMLFI_FIRST and MLFI_SECOND correspond to the physical Fast Inputs 1 and 2.

        The drive must be configured to link fast input 1 with engine 0, and fast input 2 with engine 1.

    • The first argument indicates the Axis pipe block in the Pipe Network that represents the drive to be configured.
    • The second argument identifies which of the two Fast Inputs of the drive is configured (can be 0 or 1).
    • The third argument can indicate detection of positive edge when set to 1 and detection of negative edge when set to 2.
      • If set to 0, Fast Input is disabled.
  2. MLAxisIsTrigged(PipeNetwork.AXIS1, 0, 1)
    • This function returns true if Fast Input 0 of AXIS1 has been triggered on the positive edge.
    • The meaning of the arguments is the same as in MLAxisCfgFastIn.
  3. MLAxisTimeStamp (PipeNetwork.AXIS1, 0, 1)
    • This function returns the time in microseconds when the Fast Input was triggered on the positive edge.
    • This time is relative to the start of the drive cycle time.
    • The meaning of the arguments is the same as in MLAxisCfgFastIn.
  4. MLAxisRstFastIn (PipeNetwork.AXIS1, MLFI_FIRST)
    • This function resets the Fast Input 0 of AXIS1.
    • The reset keeps the configuration of the Fast Input, but it rearms it so it can be triggered again.
    • The meaning of the first two arguments is the same as in MLAxisCfgFastIn.
  5. Follow-up Motion

This is typical code used in a homing procedure:

CASE StepCounter OF

0:

MLAxisRstFastIn(PipeNetwork.Feeder,MLFI_FIRST);

MLAxisMoveVel(PipeNetwork.Feeder,250.0); //Jog Feeder Axis to search for sensor input

StepCounter := 1;

1:

IF MLAxisIsTrigged(PipeNetwork.Feeder,MLFI_FIRST,MLFI_RISING_EDGE) THEN MLAxisAbs(PipeNetwork.Feeder,MLAxisCmdPos(PipeNetwork.Feeder)); //Stop motion when sensor is reached
StepCounter := 2;
END_IF;

2:

IF MLAxisGenIsRdy(PipeNetwork.Feeder) THEN MLAxisWritePos(PipeNetwork.Feeder,0); //Set Feeder Axis position to zero
StepCounter := 3;
END_IF;

The Axis Position can be derived from the Time Stamp using this code:

TimeStamp := any_to_lreal(MLAxisTimeStamp( iAxisID, any_to_dint(ibFastInputNumber), 1+any_to_dint(ibHomeSwitchMode) ))/1000000;
CalculatedTriggerPosition := (CurrentVelocity-PreviousVelocity)/2/iCycleTime*TimeStamp*TimeStamp+PreviousVelocity*TimeStamp+PreviousPosition;