Here is some code i used for testing back in 2016, for two X axis.
Hope it helps:-)
(******* Main Program, State Machine *******)
CASE nState OF
0: (******* Manual mode *******)
IF nState <> 60 AND NOT bTestLaser THEN bTurnLaserOn := FALSE; ELSE bTurnLaserOn := TRUE; END_IF
(* Home Axis *)
fbMC_HomeX(Axis:= X_AXIS, Execute:=bHomeX , Position:=0 , HomingMode:=0 , bCalibrationCam:=NOT bHome_X_CAM ,);
fbMC_HomeX2(Axis:= X2_AXIS,Execute:=bHomeX , Position:=0 , HomingMode:=0 , bCalibrationCam:=NOT bHome_X2_CAM ,);
fbMC_HomeY(Axis:= Y_AXIS, Execute:=bHomeY , Position:=0 , HomingMode:=0 , bCalibrationCam:=NOT bHome_Y_CAM ,);
(* Jog Axis*)
IF iJogMode = 1 THEN JogMode := MC_JOGMODE_STANDARD_FAST ; END_IF;
IF iJogMode = 2 THEN JogMode := MC_JOGMODE_INCHING ; END_IF;
IF iJogMode = 3 THEN JogMode := MC_JOGMODE_INCHING ; END_IF;
IF iJogMode = 4 THEN JogMode := MC_JOGMODE_INCHING ; END_IF;
IF iJogMode = 5 THEN JogMode := MC_JOGMODE_INCHING ; END_IF;
fbMC_Jog_Y(Axis:= Y_AXIS, JogForward:= bJogForwardY,JogBackwards:=bJogBackwardsY,Mode:= JogMode,Velocity:=800,Position:=lrJogDistance,);
fbMC_Jog_X(Axis:= X_AXIS, JogForward:= bJogForwardX,JogBackwards:=bJogBackwardsX,Mode:= JogMode,Velocity:=800,Position:=lrJogDistance,);
fbMC_Jog_X2(Axis:= X2_AXIS,JogForward:= bJogForwardX,JogBackwards:=bJogBackwardsX,Mode:= JogMode,Velocity:=800,Position:=lrJogDistance,);
(* Store Zero shift G54 *)
IF bZeroX THEN arr_ZeroShiftDesc[54].fShiftX:= X_AXIS.NcToPlc.ActPos; END_IF;
IF bZeroY THEN arr_ZeroShiftDesc[54].fShiftY:= Y_AXIS.NcToPlc.ActPos; END_IF;
(* Run A G-code *)
IF bExec THEN bBusy := TRUE;bErr := FALSE;nErrId := 0;nLastState := 0;nState := 10;END_IF
10: (******* build interpolation group *******)
fbBuildGrp(bExecute := TRUE ,nGroupId := ItpGetGroupId(sNciToPlc:= in_stItpToPlc),nXAxisId := X_AXIS.NcToPlc.AxisId,nYAxisId := Y_AXIS.NcToPlc.AxisId,tTimeOut:= T#200MS);
IF NOT fbBuildGrp.bBusy THEN fbBuildGrp( bExecute := FALSE );IF NOT fbBuildGrp.bErr THEN nState := 11;
ELSE (* an error occured *) bErr:= TRUE; nErrId := fbBuildGrp.nErrId; nLastState:= nState; nState:= 510; END_IF END_IF
11: (******* Write ZeroShift [G54] *******)
fbItpWriteZeroShiftEx(bExecute:= TRUE,nZsNo:= 54,tTimeOut:= T#2S,sNciToPlc:= in_stItpToPlc,sZeroShiftDesc:= arr_ZeroShiftDesc[54],);
IF NOT fbItpWriteZeroShiftEx.bBusy THEN fbItpWriteZeroShiftEx(bExecute:= FALSE,nZsNo:= 54,tTimeOut:= T#2S,sNciToPlc:= in_stItpToPlc,sZeroShiftDesc:= arr_ZeroShiftDesc[54], );
IF NOT fbItpWriteZeroShiftEx.bErr THEN nState:= 12;
ELSE (* an error occured *) bErr:= TRUE; nErrId:= fbItpWriteZeroShiftEx.nErrId; nLastState := nState; nState:= 510; END_IF END_IF;
12: (******* Write R Parameters *******)
fbItpWriteRParamsEx(bExecute:= TRUE, pAddr:= ADR (arr_R_ParameterToNci), nIndex:= 0, nCount:= SIZEOF(arr_R_ParameterToNci) / SIZEOF(arr_R_ParameterToNci[1]), tTimeOut:= T#2S, sNciToPlc:= in_stItpToPlc, );
IF NOT fbItpWriteRParamsEx.bBusy THEN
fbItpWriteRParamsEx(bExecute:= FALSE, pAddr:= ADR (arr_R_ParameterToNci), nIndex:= 0, nCount:= SIZEOF(arr_R_ParameterToNci) / SIZEOF(arr_R_ParameterToNci[1]), tTimeOut:= T#2S, sNciToPlc:= in_stItpToPlc,); IF NOT fbItpWriteRParamsEx.bErr THEN
iIndex:=1; nState:= 13;
ELSE (* an error occured *)bErr:= TRUE; nErrId:= fbItpWriteRParamsEx.nErrId; nLastState:=nState;nState:= 510;END_IF END_IF
13: (******** Write Tool Parameters *******)
fbItpWriteToolDescEx(bExecute:= TRUE,nDNo:= iIndex, tTimeOut:= T#2S, sNciToPlc:=in_stItpToPlc , sToolDesc:= arr_ToolDescToNci[iIndex], );
IF NOT fbItpWriteToolDescEx.bBusy THEN fbItpWriteToolDescEx(bExecute:= FALSE, nDNo:= 1, tTimeOut:= T#2S, sNciToPlc:=in_stItpToPlc , sToolDesc:= arr_ToolDescToNci[1],);
IF NOT fbItpWriteToolDescEx.bErr THEN
nState := 14;
ELSE (* an error occured *) bErr:= TRUE;nErrId := fbItpWriteToolDescEx.nErrId; nLastState := nState; nState:= 510;END_IF END_IF
14: (******** Check if more Tool Parameters *******)
IF iIndex = 2 THEN nState:= 20; ELSE iIndex:= iIndex +1 ; nState := 13 ; END_IF
20:(******* load part program *******)
fbLoadProg(bExecute := TRUE,sPrg:= sFileName,nLength:= LEN(sFileName),tTimeOut:= T#200MS,sNciToPlc:=in_stItpToPlc);
IF NOT fbLoadProg.bBusy THEN fbLoadProg( bExecute:=FALSE, sNciToPlc:=in_stItpToPlc);IF NOT fbLoadProg.bErr THEN nState := 30;
ELSE(* an error occured *)bErr:= TRUE;nErrId:= fbLoadProg.nErrId;nLastState:=nState;nState:= 510;END_IF END_IF
30:(******* wait until interpreter is in ready state *******)
nItpState := ItpGetStateInterpreter( in_stItpToPlc );
IF nItpState = NCI_INTERPRETER_READY THEN
(* load part program succeeded *)
nState := 31;
ELSIF nItpState = NCI_INTERPRETER_ABORTED THEN
(* load program failed - probably there is a load time error, e.g. syntax error *)
(* add error handling here *)bErr:= TRUE;nErrId := 4711; (* substitute with own error code *) nLastState:= nState;nState:= 510; END_IF
31:(******* Gear In X + X2 *******)
fbMC_GearIn(Master:= X_AXIS,Slave:= X2_AXIS,Execute:= TRUE,RatioNumerator:=1,RatioDenominator:=1,);
IF fbMC_GearIn.InGear THEN fbMC_GearIn( Master:= X_AXIS, Slave:= X2_AXIS, Execute:= FALSE,);IF NOT fbMC_GearIn.Error THEN nState := 40;
ELSE (* an error occured *)bErr := TRUE;nErrId := fbMC_GearIn.ErrorID;nLastState:= nState;nState:= 510;END_IF END_IF
40:(******* start part program *******)
fbStart(bStart := TRUE,bStop := FALSE,tTimeOut := T#200MS,sNciToPlc:= in_stItpToPlc );
IF NOT fbStart.bBusy THEN fbStart( bStart:=FALSE, sNciToPlc:=in_stItpToPlc );IF NOT fbStart.bErr THEN nState:= 50;
ELSE(* an error occured *)bErr:= TRUE;nErrId:= fbStart.nErrId;nLastState := nState;nState := 510;END_IF END_IF
50: (******* check if the part program is really started *******)
(* as long as the part program is active we are not in the ready state *)
(* if the part program has finished without an error we switch back to the ready state *)
(* if the program has finished with an error the interpreter is in the aborted state *)
nItpState := ItpGetStateInterpreter( in_stItpToPlc );
IF nItpState <> NCI_INTERPRETER_READY THEN
nState := 60; END_IF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
60: (******* Running State *******)
(* Stop *)
IF bStop THEN nState := 61; END_IF;
(* confirm m-func - e.g. m30 *)
bTurnLaserOn := ItpIsFastMFunc( nFastMFuncNo:= FastMFuncs.M22_LaserOn,sNciToPlc:= in_stItpToPlc );
(* Laser Power *)
IF ( ItpIsHskMFunc(in_stItpToPlc) ) THEN bConfirm:= TRUE; ELSE bConfirm := FALSE; END_IF
fbConfirm(bExecute:= bConfirm,sNciToPlc:= in_stItpToPlc,sPlcToNci:= out_stPlcToItp );IF NOT fbConfirm.bBusy THEN IF fbConfirm.bErr
THEN(* an error occured *)
(* this usually can just occur, if a confirmation is triggered without a request *)
bErr:= TRUE; nErrId := fbStart.nErrId; nLastState := nState; nState := 510; END_IF END_IF
nItpState:= ItpGetStateInterpreter( in_stItpToPlc );
IF nItpState = NCI_INTERPRETER_READY THEN
(* part program is finished without an error *)
fbConfirm( bExecute:= FALSE, sNciToPlc:= in_stItpToPlc, sPlcToNci:= out_stPlcToItp );
nState := 69;
ELSIF nItpState = NCI_INTERPRETER_ABORTED THEN
(* a runtime error occured - e.g. a lag distance error occured *)
bErr:= TRUE; nErrId := ItpGetError(in_stItpToPlc);nLastState:= nState;nState:= 510; END_IF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
61: (******* Stop State *******)
bTurnLaserOn:= FALSE;
fbItpEStopEx(sNciToPlc:=in_stItpToPlc,bExecute:=TRUE,);
IF NOT fbItpEStopEx.bBusy THEN
fbItpEStopEx(sNciToPlc:=in_stItpToPlc,bExecute:=FALSE,);
IF NOT fbItpEStopEx.bErr THEN nState := 62;
ELSE(* an error occured *)bErr:= TRUE;nErrId:= fbItpEStopEx.nErrId;nLastState:= nState;nState:= 510;END_IF END_IF
62:(******* Restart Part Program *******)
IF bReset THEN nState := 63; END_IF
IF bExec THEN fbItpStepOnAfterEStop(bExecute:=TRUE,nGrpId:=5,);
IF NOT fbItpStepOnAfterEStop.bBusy THEN
fbItpStepOnAfterEStop(bExecute:=FALSE,nGrpId:=5,);
IF NOT fbItpStepOnAfterEStop.bErr THEN nState := 60;
ELSE(* an error occured *)bErr:= TRUE;nErrId:= fbItpStepOnAfterEStop.nErrId;nLastState := nState;nState := 510;END_IF END_IF END_IF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
63: (******* Reset *******)
fbItpResetEx2(bExecute:=TRUE ,sNciToPlc:=in_stItpToPlc , );
IF NOT fbItpResetEx2.bBusy THEN
fbItpResetEx2(bExecute:=FALSE,sNciToPlc:=in_stItpToPlc,);
IF NOT fbItpResetEx2.bErr THEN nState:=69;
ELSE(* an error occured *)bErr:= TRUE;nErrId := fbItpResetEx2.nErrId;nLastState := nState;nState := 510;END_IF END_IF
69: (******* Gear out *******)
fbMC_GearOut(Slave:=X2_AXIS,Execute:=TRUE,);
IF fbMC_GearOut.Done THEN fbMC_GearOut(Slave:=X2_AXIS,Execute:=FALSE ,) ;
IF NOT fbMC_GearOut.Error THEN nState := 70;
ELSE(* an error occured *)bErr := TRUE;nErrId := fbMC_GearOut.ErrorID;nLastState := nState;nState := 510;END_IF END_IF
70: (******* clear interpolation group *******)
fbClearGrp(bExecute:= TRUE,nGroupId:= ItpGetGroupId(sNciToPlc:=in_stItpToPlc),tTimeOut:= T#200MS);
IF NOT fbClearGrp.bBusy THEN fbClearGrp(bExecute:= FALSE);IF NOT fbClearGrp.bErr THEN nState := 500;
ELSE(* an error occured *)bErr:= TRUE;nErrId := fbClearGrp.nErrId;nLastState := nState;nState := 510;END_IF END_IF
500: (******* Finsh *******)
bBusy:=FALSE;IF NOT bExec THEN nState:= 0;END_IF IF bReset THEN nState := 0;END_IF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
510: (******* Error State *******)
fbItpEStopEx(sNciToPlc:=in_stItpToPlc ,bExecute:=TRUE, );
fbBuildGrp( bExecute := FALSE );
fbLoadProg(bExecute := FALSE,sPrg:= sFileName,tTimeOut := T#200MS,sNciToPlc:= in_stItpToPlc );
fbMC_GearIn(Master:= X_AXIS,Slave:= X2_AXIS,Execute:= FALSE,RatioNumerator:=1,RatioDenominator:=1, );
fbMC_ResetX(Axis:=X_AXIS , Execute:=FALSE, );
fbMC_ResetX2(Axis:=X_AXIS , Execute:=FALSE , );
fbMC_ResetY(Axis:=X_AXIS , Execute:=FALSE , );
IF bReset THEN nState:= 511;END_IF
511: (******* Reset State *******)
fbMC_GearOut(Slave:=X2_AXIS,Execute:=TRUE,);
fbClearGrp(bExecute:= TRUE,nGroupId:= ItpGetGroupId(sNciToPlc:=in_stItpToPlc),tTimeOut:= T#200MS);
fbItpResetEx2(bExecute:=TRUE,tTimeOut:=,sNciToPlc:=in_stItpToPlc ,);
fbMC_ResetX(Axis:=X_AXIS , Execute:=TRUE, );
fbMC_ResetX2(Axis:=X_AXIS , Execute:=TRUE , );
fbMC_ResetY(Axis:=X_AXIS , Execute:=TRUE , );
fbTimer(IN:=TRUE , PT:=T#200MS , Q=> , ET=> );
IF fbTimer.Q THEN nState:=512;END_IF
512: (******* Error State *******)
fbItpEStopEx(sNciToPlc:=in_stItpToPlc ,bExecute:=FALSE, );
fbMC_GearOut(Slave:=X2_AXIS,Execute:=FALSE,);
fbClearGrp(bExecute:= FALSE,nGroupId:= ItpGetGroupId(sNciToPlc:=in_stItpToPlc),tTimeOut:= T#200MS);
fbItpResetEx2(bExecute:=FALSE,tTimeOut:=,sNciToPlc:=in_stItpToPlc ,);
fbMC_ResetX(Axis:=X_AXIS , Execute:=FALSE, );
fbMC_ResetX2(Axis:=X_AXIS , Execute:=FALSE , );
fbMC_ResetY(Axis:=X_AXIS , Execute:=FALSE , );
fbTimer(IN:=FALSE , PT:=T#200MS , Q=> , ET=> );
nState:= 513;
513:
bErr := FALSE;
nErrId := 0;
nLastState := 0;
bBusy := FALSE;
nState := 0;
END_CASE