<?xml version="1.0" encoding="UTF-8"?>

<ExportedUserProgram
    Version="1.0.0">
   <VariableTable>
   <Variable
       Offset="41"
       TagName="EnableIntegratorOnInPos"
       Format="DWORD"
       DefaultValue="16#00000000"
       Description="Set which axes the Integrator On In Position feature applies to."/>
   <Variable
       Offset="42"
       TagName="LastEnableIntOnInPosState"
       Format="DWORD"
       DefaultValue="16#00000000"
       Description="Do not edit! Used by DoIntegratorOnInPos user program."/>
   <Variable
       Offset="43"
       TagName="LastTGDoneState"
       Format="DWORD"
       DefaultValue="16#00000000"
       Description="Do not edit! Used by DoIntegratorOnInPos user program."/>
</VariableTable>
   <DiscreteIO/>
   <UserProgram
    Name="DoIntegratorOnInPos"
    Type="STEP"
    Number="3"
    Desc="This program always runs and checks the state of the axes. If the Target Generator Done bit is on, enable the integrator. If the Target Generator Done bit is off, clear and disable the integrator.&#13;&#10;&#13;&#10;Use the IntegratorOnInPos variable to enable or disable this feature for each axis.&#13;&#10;&#13;&#10;This user program must always run. To make sure it does:&#13;&#10;1. Set the RMC to start in RUN mode.&#13;&#10;2. Use the _FirstScan bit in the Program Triggers to start the user program on a dedicated task that nothing else will run on.&#13;&#10;3. In the Programming folder properties, on the Halts page, make sure the specified task will never stop.&#13;&#10;&#13;&#10;This example does axes 0 through 7. In the Expression boxes, you will need to delete the lines for the axes in your project that do not exist or are not control axes."
    SingleInstance="True"
    TaskMask="4294967295">
   <ProgramBlock
       Type="STEP">
      <Comment
          Comment="Initialize the variables."/>
      <Step>
         <Expression
             Src="LastTGDoneState.0 := _Axis[0].StatusBits.TGDone;&#13;&#10;LastTGDoneState.1 := _Axis[1].StatusBits.TGDone;&#13;&#10;LastTGDoneState.2 := _Axis[2].StatusBits.TGDone;&#13;&#10;LastTGDoneState.3 := _Axis[3].StatusBits.TGDone;&#13;&#10;LastTGDoneState.4 := _Axis[4].StatusBits.TGDone;&#13;&#10;LastTGDoneState.5 := _Axis[5].StatusBits.TGDone;&#13;&#10;LastTGDoneState.6 := _Axis[6].StatusBits.TGDone;&#13;&#10;LastTGDoneState.7 := _Axis[7].StatusBits.TGDone;"/>
      </Step>
      <Transition>
         <Jump
             Type="NEXT"/>
      </Transition>
   </ProgramBlock>
   <ProgramBlock
       Type="STEP">
      <Declarations
          Declarations="VAR&#13;&#10;&#9;ClearIntCmdMask : DWORD := 0;&#9;&#9;//Specifies which axes to send the Integrator Adjust command to, to clear the integrator.&#13;&#10;&#9;DisableIntCmdMask : DWORD := 0;&#9;//Specifies which axes to send the Set Integrator Mode command to, to enable the integrator.&#13;&#10;&#9;EnableIntCmdMask : DWORD := 0;&#9;//Specifies which axes to send the Set Integrator Mode command to, to disable the integrator.&#13;&#10;END_VAR"/>
      <Step>
         <Expression
             Src="//AXIS 0 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.0 AND NOT LastTGDoneState.0 AND _Axis[0].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.0 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 0 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.0 AND &#32;LastTGDoneState.0 AND NOT _Axis[0].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.0 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.0 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 1 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.1 AND NOT LastTGDoneState.1 AND _Axis[1].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.1 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 1 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.1 AND LastTGDoneState.1 AND NOT _Axis[1].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.1 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.1 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 2 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.2 AND NOT LastTGDoneState.2 AND _Axis[2].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.2 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 2 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.2 AND LastTGDoneState.2 AND NOT _Axis[2].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.2 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.2 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 3 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.3 AND NOT LastTGDoneState.3 AND _Axis[3].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.3 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 3 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.3 AND LastTGDoneState.3 AND NOT _Axis[3].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.3 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.3 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 4 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.4 AND NOT LastTGDoneState.4 AND _Axis[4].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.4 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 4 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.4 AND LastTGDoneState.4 AND NOT _Axis[4].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.4 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.4 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 5 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.5 AND NOT LastTGDoneState.5 AND _Axis[5].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.5 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 5 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.5 AND LastTGDoneState.5 AND NOT _Axis[5].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.5 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.5 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 6 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.6 AND NOT LastTGDoneState.6 AND _Axis[6].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.6 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 6 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.6 AND LastTGDoneState.6 AND NOT _Axis[6].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.6 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.6 := TRUE;&#13;&#10;END_IF&#13;&#10;&#13;&#10;//AXIS 7 - Check if entering TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.7 AND NOT LastTGDoneState.7 AND _Axis[7].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;EnableIntCmdMask.7 := TRUE;&#13;&#10;END_IF&#13;&#10;//AXIS 7 - Check if exiting TGDone state&#13;&#10;IF &#32;EnableIntegratorOnInPos.7 AND LastTGDoneState.7 AND NOT _Axis[7].StatusBits.TGDone THEN&#13;&#10;&#9;&#9;ClearIntCmdMask.7 := TRUE;&#13;&#10;&#9;&#9;DisableIntCmdMask.7 := TRUE;&#13;&#10;END_IF"/>
         <Expression
             Src="//If this IntOnInPos feature is being turned off, make sure to turn on the integrator.&#13;&#10;IF NOT EnableIntegratorOnInPos.0 AND LastEnableIntOnInPosState.0 THEN EnableIntCmdMask.0 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.1 AND LastEnableIntOnInPosState.1 THEN EnableIntCmdMask.1 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.2 AND LastEnableIntOnInPosState.2 THEN EnableIntCmdMask.2 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.3 AND LastEnableIntOnInPosState.3 THEN EnableIntCmdMask.3 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.4 AND LastEnableIntOnInPosState.4 THEN EnableIntCmdMask.4 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.5 AND LastEnableIntOnInPosState.5 THEN EnableIntCmdMask.5 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.6 AND LastEnableIntOnInPosState.6 THEN EnableIntCmdMask.6 := TRUE; END_IF&#13;&#10;IF NOT EnableIntegratorOnInPos.7 AND LastEnableIntOnInPosState.7 THEN EnableIntCmdMask.7 := TRUE; END_IF&#13;&#10;&#13;&#10;//Update previous state trackers&#13;&#10;LastTGDoneState.0 := _Axis[0].StatusBits.TGDone;&#13;&#10;LastTGDoneState.1 := _Axis[1].StatusBits.TGDone;&#13;&#10;LastTGDoneState.2 := _Axis[2].StatusBits.TGDone;&#13;&#10;LastTGDoneState.3 := _Axis[3].StatusBits.TGDone;&#13;&#10;LastTGDoneState.4 := _Axis[4].StatusBits.TGDone;&#13;&#10;LastTGDoneState.5 := _Axis[5].StatusBits.TGDone;&#13;&#10;LastTGDoneState.6 := _Axis[6].StatusBits.TGDone;&#13;&#10;LastTGDoneState.7 := _Axis[7].StatusBits.TGDone;&#13;&#10;&#13;&#10;LastEnableIntOnInPosState.0 := EnableIntegratorOnInPos.0;&#13;&#10;LastEnableIntOnInPosState.1 := EnableIntegratorOnInPos.1;&#13;&#10;LastEnableIntOnInPosState.2:= EnableIntegratorOnInPos.2;&#13;&#10;LastEnableIntOnInPosState.3 := EnableIntegratorOnInPos.3;&#13;&#10;LastEnableIntOnInPosState.4 := EnableIntegratorOnInPos.4;&#13;&#10;LastEnableIntOnInPosState.5 := EnableIntegratorOnInPos.5;&#13;&#10;LastEnableIntOnInPosState.6 := EnableIntegratorOnInPos.6;&#13;&#10;LastEnableIntOnInPosState.7 := EnableIntegratorOnInPos.7;&#13;&#10;"/>
         <Command
             Command="70"
             CmdAxesExpr="ClearIntCmdMask"
             CmdPrm1="0.0"
             CmdPrm2="Active (0)"/>
         <Command
             Command="71"
             CmdAxesExpr="DisableIntCmdMask"
             CmdPrm1="Off (0)"/>
         <Command
             Command="71"
             CmdAxesExpr="EnableIntCmdMask"
             CmdPrm1="On (1)"/>
      </Step>
      <Transition>
         <Jump
             Type="JUMP"
             Next="Repeat"/>
      </Transition>
   </ProgramBlock>
</UserProgram>
</ExportedUserProgram>
