LauMotion

MrPLC Member
  • Content count

    3
  • Joined

  • Last visited

Everything posted by LauMotion

  1. NEED HELP, TwinCat 3 NCI SlaveAxis

    i am trying to set up dual motors   "master and slave"  on a X axis in TwinCat NCI ,   so far i don some test with "MC_GearIn"   but i keep getting this error       "Error    40    14-05-2016 11:27:39 417 ms | 'TCNC' (500): NC-Ctrl (R0), Cannot configurate axis 4 into group 4 because a slave is coupled or this axis is a slave itself (CoupleState: 1) !!"                when i activate NCI. also i did try using a virtual axis as X and link two slave , but i get the same result :(   anybody knows how to do this ?  
  2. NEED HELP, TwinCat 3 NCI SlaveAxis

    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  
  3. NEED HELP, TwinCat 3 NCI SlaveAxis

    Hi , yes i use MC_GearIn after i have created the "NCI interpolation group"  works fine. How can i do it in motion ?