<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									How-to &amp; Troubleshooting - twinControls Forum				            </title>
            <link>https://twincontrols.com/community/twincat-troubleshooting/</link>
            <description>twinControls  Discussion Board</description>
            <language>en-US</language>
            <lastBuildDate>Thu, 22 Oct 2026 07:51:19 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>Inquiry: Actual Position Leading Target Position in TwinCAT MoveAbsolute</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/inquiry-actual-position-leading-target-position-in-twincat-moveabsolute/</link>
                        <pubDate>Thu, 15 Oct 2026 02:02:14 +0000</pubDate>
                        <description><![CDATA[I am writing to inquire about an unusual issue we have encountered while controlling a servo motor using the TwinCAT system.
Currently, we are operating the motor by inputting the target po...]]></description>
                        <content:encoded><![CDATA[<p data-path-to-node="2">I am writing to inquire about an unusual issue we have encountered while controlling a servo motor using the TwinCAT system.</p>
<p data-path-to-node="3">Currently, we are operating the motor by inputting the target position and velocity into the MoveAbsolute function block. While monitoring the servo motor's actual position (<code data-path-to-node="3" data-index-in-node="174">GVL.Axis1.NcToPlc.ModuloActPos</code>) using the Scope function, we noticed a strange behavior: during the initial phase of the movement, the actual position lags behind the target position. However, after a certain point, the actual position starts to lead the target position by approximately 1 degree.</p>
<p data-path-to-node="4">Unlike a standard following error (lagging), it is difficult for us to pinpoint why the motor would move ahead of the target position. Therefore, we are reaching out for your assistance.</p>
<p data-path-to-node="5">To help with your investigation, I have attached the relevant test files. In the attached <code data-path-to-node="5" data-index-in-node="90">test_profile.csv</code> file, 'F' represents the velocity and 'U' represents the target position.</p>
<p data-path-to-node="6">We would greatly appreciate your insights into the potential causes of this issue and any recommendations on additional parameters or settings we should inspect.</p>
<p data-path-to-node="6">Additionally, I have provided the PLC code below.</p>
<p data-path-to-node="7">Thank you for your support.<br /><br /><br /></p>
<div>PROGRAM MAIN</div>
<div>VAR</div>
<div><span> Robot1: FB_FANUC_Basic;</span></div>
<div><span> bReset: BOOL;</span></div>
<div><span> RobotEnable, RobotFault: BOOL;</span></div>
<div> </div>
<div><span> // Buffer</span></div>
<div><span> send_single_buffer_v2 : ARRAY OF REAL;</span></div>
<div><span> goto_buffer : ARRAY OF REAL; // Buffer to move robot for manual</span></div>
<div> </div>
<div><span> send_buffer1_1_v2, send_buffer1_2_v2, send_buffer1_3_v2,</span></div>
<div><span> send_buffer2_1_v2, send_buffer2_2_v2, send_buffer2_3_v2: ARRAY OF REAL;</span></div>
<div> </div>
<div><span> // Function Block</span></div>
<div><span> fb_custom_service : FB_CUSTOM_SERVICE; // Send a Sequence Data to Robot</span></div>
<div> </div>
<div><span> fbMove1, fbMove2, fbHome : MC_MoveModulo; // Turn Table Motor Move, Only Turn Table Motor Move, Turn Table Motor Homing</span></div>
<div><span> fbMove : MC_MoveAbsolute;</span></div>
<div><span> fbMove_rev1, fbMove_rev2, fbMove_rot1, fbMove_rot2 : MC_MoveVelocity; // Revolution &amp; Rotation Motor Move</span></div>
<div> </div>
<div><span> fbReset : MC_Reset; // Motor Reset</span></div>
<div> </div>
<div><span> fbPower, fbPower_rev, fbPower_rot : MC_Power; // Motor Power On</span></div>
<div> </div>
<div><span> mc_readactpos : MC_ReadActualPosition; // Read Position of Turn Table Motor</span></div>
<div><span> mc_readactvel_rev, mc_readactvel_rot : MC_ReadActualVelocity; // Read Velocity of Revolution &amp; Rotation Motor</span></div>
<div> </div>
<div><span> mc_stop, mc_stop_rev, mc_stop_rot : MC_Stop; // Motor Stop</span></div>
<div><span> mc_setpos: MC_SetPosition;</span></div>
<div><span> bSetDone: BOOL;</span></div>
<div> </div>
<div><span> fbTimer_SetPos: TON;</span></div>
<div><span> bTimer: BOOL;</span></div>
<div><span> REdge_setdone: R_TRIG;</span></div>
<div> </div>
<div> </div>
<div><span> // Variables</span></div>
<div><span> // Bool</span></div>
<div><span> bExecute : BOOL; // fb_custom_service.Execute</span></div>
<div><span> motor_trig1, motor_trig2 : BOOL; // Signal for cross-action of Motors</span></div>
<div><span> bStopDone, bStopDone_rev, bStopDone_rot : BOOL; // Stopped Rising Edge Signal</span></div>
<div><span> bHomeDone : BOOL; // Hoiming Done Signal</span></div>
<div><span> // LREAL</span></div>
<div><span> nPos, nVel : LREAL; // Input Data of Turn Table Motor</span></div>
<div><span> fServoCurrPos, fServoCurrVel_rev, fServoCurrVel_rot : LREAL; // Output Data of the Motors</span></div>
<div><span> // INT</span></div>
<div><span> nState : INT:= 0;</span></div>
<div><span> nPointIdx : INT:= 1;</span></div>
<div> </div>
<div><span> trig_status : INT:= 0;</span></div>
<div><span> // fb_custom_service variables</span></div>
<div><span> nServiceCode : BYTE;</span></div>
<div><span> nClass, nInstance, nAttribute : WORD;</span></div>
<div> </div>
<div><span> nNumberofData : DINT;</span></div>
<div><span> nBufferID : INT;</span></div>
<div><span> pCurrentAddr : PVOID;</span></div>
<div><span> nCurrentSize : WORD;</span></div>
<div> </div>
<div><span> nErrId : UDINT;</span></div>
<div><span> error : STRING;</span></div>
<div> </div>
<div><span> // Rising Edge Trigger</span></div>
<div><span> REdge_first : R_TRIG;</span></div>
<div><span> REdge_StopDone : R_TRIG;</span></div>
<div><span> REdge_StopDone_rev : R_TRIG;</span></div>
<div><span> REdge_StopDone_rot : R_TRIG;</span></div>
<div><span> REdge_Restart : R_TRIG;</span></div>
<div><span> REdge_HomeDone : R_TRIG;</span></div>
<div><span> REdge_DO48 : R_TRIG;</span></div>
<div> </div>
<div><span> bWaitCheckPoint: BOOL;</span></div>
<div><span> nNextState: INT;</span></div>
<div><span> bRobotAck: BOOL;</span></div>
<div> </div>
<div><span> bInit : BOOL:= TRUE;</span></div>
<div><span> bFirstStart : BOOL:= TRUE;</span></div>
<div><span> bNextStepReq : BOOL;</span></div>
<div><span> nCntIdx : INT;</span></div>
<div> </div>
<div><span> fbScanTimer : TON;</span></div>
<div><span> fbSetOverride : MC_SetOverride;</span></div>
<div> </div>
<div><span> fRobotFirstPos: LREAL;</span></div>
<div><span> fRobotStartPos, fRobotTargetPos, fRobotActualPos,</span></div>
<div><span> fRobotTotalDist, fRobotRemainRatio,</span></div>
<div><span> fMotorStartPos, fMotorTargetPos, fMotorActualPos,</span></div>
<div><span> fMotorTotalDist, fMotorVirtualTarget : LREAL;</span></div>
<div> </div>
<div><span> fSampledTargetPos, fSampledActualPos : LREAL;</span></div>
<div> </div>
<div><span> fOutput : LREAL;</span></div>
<div><span> fCalculatedOverride : LREAL:= 0.0;</span></div>
<div> </div>
<div><span> nPos_X: UDINT:= 0;</span></div>
<div><span> nPos_Y: UDINT:= 0;</span></div>
<div><span> fBackupValue: LREAL;</span></div>
<div><span> fRelativePos: LREAL;</span></div>
<div><span> REdge_bStart: R_TRIG;</span></div>
<div> </div>
<div><span> fScaled_Kp: LREAL;</span></div>
<div><span> fDrivePosLoopGain: LREAL:= 32.0;</span></div>
<div><span> fPositionError: LREAL;</span></div>
<div> </div>
<div><span> bSequenceMode: BOOL:= FALSE;</span></div>
<div><span> nXorY: INT;</span></div>
<div><span> nRobotIdx: UDINT:=0;</span></div>
<div><span> nRobotIdx_int: INT;</span></div>
<div><span> frobot: LREAL;</span></div>
<div><span> nTrackingIdx: INT:= 1;</span></div>
<div><span> nTotalProcessCnt: DINT:= 1;</span></div>
<div>END_VAR</div>
<div> </div>
<div>Robot1.Update();</div>
<div>RobotEnable:= Robot1.qEnable;</div>
<div>RobotFault:= Robot1.qFault;</div>
<div> </div>
<div>CASE nBufferID OF</div>
<div><span> 1:</span></div>
<div><span> pCurrentAddr:= ADR(send_single_buffer_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_single_buffer_v2);</span></div>
<div><span> 2:</span></div>
<div><span> pCurrentAddr:= ADR(goto_buffer);</span></div>
<div><span> nCurrentSize:= SIZEOF(goto_buffer);</span></div>
<div><span> 11:</span></div>
<div><span> pCurrentAddr:= ADR(send_buffer1_1_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_buffer1_1_v2);</span></div>
<div><span> 12:</span></div>
<div><span> pCurrentAddr:= ADR(send_buffer1_2_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_buffer1_2_v2);</span></div>
<div><span> 13:</span></div>
<div><span> pCurrentAddr:= ADR(send_buffer1_3_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_buffer1_3_v2);</span></div>
<div><span> 21:</span></div>
<div><span> pCurrentAddr:= ADR(send_buffer2_1_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_buffer2_1_v2);</span></div>
<div><span> 22:</span></div>
<div><span> pCurrentAddr:= ADR(send_buffer2_2_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_buffer2_2_v2);</span></div>
<div><span> 23:</span></div>
<div><span> pCurrentAddr:= ADR(send_buffer2_3_v2);</span></div>
<div><span> nCurrentSize:= SIZEOF(send_buffer2_3_v2);</span></div>
<div><span> 99:</span></div>
<div><span> pCurrentAddr:= ADR(nNumberofData);</span></div>
<div><span> nCurrentSize:= SIZEOF(nNumberofData);</span></div>
<div>END_CASE</div>
<div> </div>
<div> </div>
<div>fb_custom_service(</div>
<div><span> sNetId:= '192.168.0.196.3.1', </span></div>
<div><span> sIPv4Addr:= '100.100.100.1', </span></div>
<div><span> bExecute:= bExecute, </span></div>
<div><span> nServiceCode:= nServiceCode, </span></div>
<div><span> nClass:= nClass, </span></div>
<div><span> nInstance:= nInstance, </span></div>
<div><span> nAttribute:= nAttribute, </span></div>
<div><span> pSrc:= pCurrentAddr, </span></div>
<div><span> nSrcDataLen:= nCurrentSize, </span></div>
<div>);</div>
<div> </div>
<div>error:= F_GET_ETHERNETIP_ERROR_TEXT(nErrorId:= nErrId);</div>
<div> </div>
<div> </div>
<div>fbPower(Axis:= GVL.Axis1, Enable:= TRUE, Enable_Positive:= TRUE, Enable_Negative:= TRUE, Override:= 100.0);</div>
<div>fbPower_rev(Axis:= GVL.Axis2, Enable:= TRUE, Enable_Positive:= TRUE, Enable_Negative:= TRUE, Override:= 100.0);</div>
<div>fbPower_rot(Axis:= GVL.Axis3, Enable:= TRUE, Enable_Positive:= TRUE, Enable_Negative:= TRUE, Override:= 100.0);</div>
<div>fbReset(Axis:= GVL.Axis1, Execute:= GVL.bReset);</div>
<div> </div>
<div>IF GVL.bReset THEN</div>
<div><span> nState:= 0;</span></div>
<div><span> GVL.bStart:= FALSE;</span></div>
<div><span> GVL.bReqUpdateLower:= FALSE;</span></div>
<div><span> GVL.bReqUpdateUpper:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>CASE nState OF</div>
<div><span> 0:</span></div>
<div><span> IF GVL.bStart THEN</span></div>
<div><span> nPointIdx:= 1;</span></div>
<div><span> nState:= 10;</span></div>
<div><span> END_IF</span></div>
<div><span> 10:</span></div>
<div><span> fbMove1.Position:= GVL.aPathData.fPosition;</span></div>
<div><span> fbMove1.Velocity:= GVL.aPathData.fVelocity;</span></div>
<div><span> fbMove1.BufferMode:= MC_BufferMode.MC_Aborting;</span></div>
<div><span> fbMove1.Direction:= MC_Positive_Direction;</span></div>
<div><span> fbMove1.Execute:= TRUE;</span></div>
<div> </div>
<div><span> fbMove_rev1.Velocity:= GVL.aPathData.fVelocity2;</span></div>
<div><span> fbMove_rev1.BufferMode:= MC_BufferMode.MC_Aborting;</span></div>
<div><span> fbMove_rev1.Execute:= TRUE;</span></div>
<div> </div>
<div><span> fbMove_rot1.Velocity:= GVL.aPathData.fVelocity3;</span></div>
<div><span> fbMove_rot1.BufferMode:= MC_BufferMode.MC_Aborting;</span></div>
<div><span> fbMove_rot1.Execute:= TRUE;</span></div>
<div> </div>
<div><span> IF fbMove1.Active AND fbMove_rev1.Active AND fbMove_rot1.Active THEN</span></div>
<div><span> fbMove1.Execute:= FALSE;</span></div>
<div><span> fbMove_rev1.Execute:= FALSE;</span></div>
<div><span> fbMove_rot1.Execute:= FALSE;</span></div>
<div><span> nPointIdx:= nPointIdx + 1;</span></div>
<div><span> motor_trig1:= TRUE;</span></div>
<div><span> nState:= 20;</span></div>
<div><span> END_IF</span></div>
<div> </div>
<div><span> 20:</span></div>
<div><span> fbMove2.Position:= GVL.aPathData.fPosition;</span></div>
<div><span> fbMove2.Velocity:= GVL.aPathData.fVelocity;</span></div>
<div><span> fbMove2.BufferMode:= MC_BufferMode.MC_BlendingPrevious;</span></div>
<div><span> fbMove2.Direction:= MC_Positive_Direction;</span></div>
<div> </div>
<div><span> fbMove_rev2.Velocity:= GVL.aPathData.fVelocity2;</span></div>
<div><span> fbMove_rev2.BufferMode:= MC_BufferMode.MC_BlendingPrevious;</span></div>
<div> </div>
<div><span> fbMove_rot2.Velocity:= GVL.aPathData.fVelocity3;</span></div>
<div><span> fbMove_rot2.BufferMode:= MC_BufferMode.MC_BlendingPrevious;</span></div>
<div> </div>
<div><span> IF motor_trig1 THEN</span></div>
<div><span> IF GVL.aPathData.fVelocity &gt; 0.0 THEN</span></div>
<div><span> fbMove2.Execute:= TRUE;</span></div>
<div><span> fbMove_rev2.Execute:= TRUE;</span></div>
<div><span> fbMove_rot2.Execute:= TRUE;</span></div>
<div><span> ELSE</span></div>
<div><span> motor_trig1:= FALSE;</span></div>
<div><span> nState:= 99;</span></div>
<div><span> END_IF</span></div>
<div><span> END_IF</span></div>
<div><span> IF fbMove2.Active AND fbMove_rev2.Active AND fbMove_rot2.Active THEN</span></div>
<div><span> fbMove2.Execute:= FALSE;</span></div>
<div><span> fbMove_rev2.Execute:= FALSE;</span></div>
<div><span> fbMove_rot2.Execute:= FALSE;</span></div>
<div><span> motor_trig1:= FALSE;</span></div>
<div><span> nPointIdx:= nPointIdx + 1;</span></div>
<div><span> nTotalProcessCnt:= nTotalProcessCnt + 1;</span></div>
<div> </div>
<div><span> IF (nTotalProcessCnt &gt; 1) AND (((nTotalProcessCnt - 1) MOD 63) = 0) THEN</span></div>
<div><span> bWaitCheckPoint:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> IF nPointIdx = 501 THEN</span></div>
<div><span> GVL.bReqUpdateLower:= TRUE;</span></div>
<div><span> ELSIF nPointIdx &gt; GVL.nMaxPoints THEN</span></div>
<div><span> nPointIdx:= 1;</span></div>
<div><span> IF NOT GVL.bAllDataFinished THEN</span></div>
<div><span> GVL.bReqUpdateUpper:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> END_IF</span></div>
<div><span> IF nState &lt;&gt; 99 THEN</span></div>
<div><span> IF bWaitCheckPoint THEN</span></div>
<div><span> nNextState:= 30;</span></div>
<div><span> nState:= 40;</span></div>
<div><span> ELSE</span></div>
<div><span> motor_trig2:= TRUE;</span></div>
<div><span> nState:= 30;</span></div>
<div><span> END_IF </span></div>
<div><span> END_IF</span></div>
<div><span> ELSIF fbMove2.Error THEN</span></div>
<div><span> nState:= 900;</span></div>
<div><span> END_IF</span></div>
<div><span> 30:</span></div>
<div><span> fbMove1.Position:= GVL.aPathData.fPosition;</span></div>
<div><span> fbMove1.Velocity:= GVL.aPathData.fVelocity;</span></div>
<div><span> fbMove1.BufferMode:= MC_BufferMode.MC_BlendingPrevious;</span></div>
<div><span> fbMove1.Direction:= MC_Positive_Direction;</span></div>
<div> </div>
<div><span> fbMove_rev1.Velocity:= GVL.aPathData.fVelocity2;</span></div>
<div><span> fbMove_rev1.BufferMode:= MC_BufferMode.MC_BlendingPrevious;</span></div>
<div> </div>
<div><span> fbMove_rot1.Velocity:= GVL.aPathData.fVelocity3;</span></div>
<div><span> fbMove_rot1.BufferMode:= MC_BufferMode.MC_BlendingPrevious;</span></div>
<div> </div>
<div><span> IF motor_trig2 THEN</span></div>
<div><span> IF GVL.aPathData.fVelocity &gt; 0.0 THEN</span></div>
<div><span> fbMove1.Execute:= TRUE;</span></div>
<div><span> fbMove_rev1.Execute:= TRUE;</span></div>
<div><span> fbMove_rot1.Execute:= TRUE;</span></div>
<div><span> ELSE</span></div>
<div><span> motor_trig2:= FALSE;</span></div>
<div><span> nState:= 99;</span></div>
<div><span> END_IF</span></div>
<div><span> END_IF</span></div>
<div><span> IF fbMove1.Active AND fbMove_rev1.Active AND fbMove_rot1.Active THEN</span></div>
<div><span> fbMove1.Execute:= FALSE;</span></div>
<div><span> fbMove_rev1.Execute:= FALSE;</span></div>
<div><span> fbMove_rot1.Execute:= FALSE;</span></div>
<div><span> motor_trig2:= FALSE;</span></div>
<div><span> nPointIdx:= nPointIdx + 1;</span></div>
<div><span> nTotalProcessCnt:= nTotalProcessCnt + 1;</span></div>
<div> </div>
<div><span> IF (nTotalProcessCnt &gt; 1) AND (((nTotalProcessCnt - 1) MOD 63) = 0) THEN</span></div>
<div><span> bWaitCheckPoint:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> IF nPointIdx = 501 THEN</span></div>
<div><span> GVL.bReqUpdateLower:= TRUE;</span></div>
<div><span> ELSIF nPointIdx &gt; GVL.nMaxPoints THEN</span></div>
<div><span> nPointIdx:= 1;</span></div>
<div><span> IF NOT GVL.bAllDataFinished THEN</span></div>
<div><span> GVL.bReqUpdateUpper:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> END_IF</span></div>
<div><span> IF nState &lt;&gt; 99 THEN</span></div>
<div><span> IF bWaitCheckPoint THEN</span></div>
<div><span> nNextState:= 20;</span></div>
<div><span> nState:= 40;</span></div>
<div><span> ELSE</span></div>
<div><span> motor_trig1:= TRUE;</span></div>
<div><span> nState:= 20;</span></div>
<div><span> END_IF </span></div>
<div><span> END_IF</span></div>
<div><span> ELSIF fbMove1.Error THEN</span></div>
<div><span> nState:= 900;</span></div>
<div><span> END_IF</span></div>
<div> </div>
<div><span> 40:</span></div>
<div><span> IF Robot1._UO1.DO237 THEN</span></div>
<div><span> Robot1._UI1.DI44:= TRUE;</span></div>
<div><span> bRobotAck:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div> </div>
<div><span> IF bRobotAck AND NOT Robot1._UO1.DO237 THEN</span></div>
<div><span> Robot1._UI1.DI44:= FALSE;</span></div>
<div><span> bRobotAck:= FALSE;</span></div>
<div><span> bWaitCheckPoint:= FALSE;</span></div>
<div> </div>
<div><span> IF nNextState = 20 THEN</span></div>
<div><span> motor_trig1 := TRUE;</span></div>
<div><span> ELSIF nNextState = 30 THEN</span></div>
<div><span> motor_trig2 := TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> nState := nNextState;</span></div>
<div><span> END_IF</span></div>
<div> </div>
<div><span> 99:</span></div>
<div><span> IF NOT fbMove1.Busy AND NOT fbMove2.Busy THEN</span></div>
<div><span> IF Robot1._UO1.DO237 THEN</span></div>
<div><span> Robot1._UI1.DI44:= TRUE;</span></div>
<div><span> ELSE</span></div>
<div><span> Robot1._UI1.DI44:= FALSE;</span></div>
<div><span> nState:= 0;</span></div>
<div><span> nPointIdx:= 1;</span></div>
<div><span> nTrackingIdx:= 1;</span></div>
<div> </div>
<div><span> motor_trig1:= FALSE;</span></div>
<div><span> motor_trig2:= FALSE;</span></div>
<div> </div>
<div><span> bWaitCheckPoint:= FALSE;</span></div>
<div><span> bRobotAck:= FALSE;</span></div>
<div><span> nNextState:= 0; </span></div>
<div> </div>
<div><span> fbMove1.Execute:= FALSE;</span></div>
<div><span> fbMove2.Execute:= FALSE;</span></div>
<div><span> fbMove_rev1.Execute:= FALSE;</span></div>
<div><span> fbMove_rev2.Execute:= FALSE;</span></div>
<div><span> fbMove_rot1.Execute:= FALSE;</span></div>
<div><span> fbMove_rot2.Execute:= FALSE;</span></div>
<div> </div>
<div><span> GVL.bStart:= FALSE;</span></div>
<div><span> IF NOT GVL.bStop_rev THEN</span></div>
<div><span> GVL.bStop_rev:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> IF NOT GVL.bStop_rot THEN</span></div>
<div><span> GVL.bStop_rot:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> bSequenceMode:= FALSE;</span></div>
<div><span> END_IF</span></div>
<div><span> END_IF</span></div>
<div><span> 900:</span></div>
<div><span> IF NOT fbMove1.Busy AND NOT fbMove2.Busy THEN</span></div>
<div><span> GVL.bStart:= FALSE;</span></div>
<div><span> nState:= 0;</span></div>
<div><span> nPointIdx:= 1;</span></div>
<div><span> nCntIdx:= 0;</span></div>
<div><span> bSequenceMode:= FALSE;</span></div>
<div><span> END_IF</span></div>
<div> </div>
<div>END_CASE</div>
<div> </div>
<div>fbMove1(Axis:= GVL.Axis1);</div>
<div>fbMove2(Axis:= GVL.Axis1);</div>
<div>fbMove_rev1(Axis:= GVL.Axis2);</div>
<div>fbMove_rev2(Axis:= GVL.Axis2);</div>
<div>fbMove_rot1(Axis:= GVL.Axis3);</div>
<div>fbMove_rot2(Axis:= GVL.Axis3);</div>
<div> </div>
<div>IF GVL.bReqUpdateLower AND GVL.bUpdateDone THEN</div>
<div><span> GVL.bReqUpdateLower:= FALSE;</span></div>
<div>END_IF</div>
<div>IF GVL.bReqUpdateUpper AND GVL.bUpdateDone THEN</div>
<div><span> GVL.bReqUpdateUpper:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>REdge_first(CLK:= MAIN.Robot1._UO1.DO45);</div>
<div>IF REdge_first.Q THEN</div>
<div><span> GVL.bStart:= TRUE;</span></div>
<div>END_IF</div>
<div> </div>
<div>fbMove(</div>
<div><span> Axis:= GVL.Axis1,</span></div>
<div><span> Execute:= GVL.bStart2,</span></div>
<div><span> Position:= nPos,</span></div>
<div><span> Velocity:= nVel</span></div>
<div>);</div>
<div> </div>
<div>fbHome(</div>
<div><span> Axis:= GVL.Axis1, </span></div>
<div><span> Execute:= GVL.bHome, </span></div>
<div><span> Position:= 0.0, </span></div>
<div><span> Velocity:= 10, </span></div>
<div><span> Direction:= MC_Direction.MC_Shortest_Way, </span></div>
<div><span> Done=&gt; bHomeDone, </span></div>
<div>);</div>
<div> </div>
<div>mc_readactpos(</div>
<div><span> Axis:= GVL.Axis1, </span></div>
<div><span> Enable:= TRUE,  </span></div>
<div><span> Position=&gt; fServoCurrPos</span></div>
<div>);</div>
<div> </div>
<div>mc_readactvel_rev(</div>
<div><span> Axis:= GVL.Axis2, </span></div>
<div><span> Enable:= TRUE, </span></div>
<div><span> ActualVelocity=&gt; fServoCurrVel_rev</span></div>
<div>);</div>
<div> </div>
<div>mc_readactvel_rot(</div>
<div><span> Axis:= GVL.Axis3, </span></div>
<div><span> Enable:= TRUE, </span></div>
<div><span> ActualVelocity=&gt; fServoCurrVel_rot</span></div>
<div>);<span> </span></div>
<div> </div>
<div>mc_stop(</div>
<div><span> Axis:= GVL.Axis1, </span></div>
<div><span> Execute:= GVL.bStop, </span></div>
<div><span> Done=&gt; bStopDone, </span></div>
<div>);</div>
<div> </div>
<div>mc_stop_rev(</div>
<div><span> Axis:= GVL.Axis2, </span></div>
<div><span> Execute:= GVL.bStop_rev,  </span></div>
<div><span> Done=&gt; bStopDone_rev, </span></div>
<div>);</div>
<div> </div>
<div>mc_stop_rot(</div>
<div><span> Axis:= GVL.Axis3, </span></div>
<div><span> Execute:= GVL.bStop_rot, </span></div>
<div><span> Done=&gt; bStopDone_rot, </span></div>
<div>);</div>
<div> </div>
<div>mc_setpos(</div>
<div><span> Axis:= GVL.Axis1,</span></div>
<div><span> Position:= 0.0,</span></div>
<div><span> Done=&gt; bSetDone</span></div>
<div>);</div>
<div> </div>
<div>REdge_HomeDone(CLK:= bHomeDone);</div>
<div>IF REdge_HomeDone.Q THEN</div>
<div><span> GVL.bHome:= FALSE;</span></div>
<div><span> bTimer:= TRUE;</span></div>
<div>END_IF</div>
<div>fbTimer_SetPos(IN:= bTimer, PT:= T#1S);</div>
<div>IF fbTimer_SetPos.Q THEN</div>
<div><span> mc_setpos.Execute:= TRUE;</span></div>
<div>END_IF</div>
<div>REdge_setdone(CLK:= bSetDone);</div>
<div>IF REdge_setdone.Q THEN</div>
<div><span> mc_setpos.Execute:= FALSE;</span></div>
<div><span> bTimer:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>REdge_StopDone(CLK:= bStopDone);</div>
<div>IF REdge_StopDone.Q THEN</div>
<div><span> GVL.bStart := FALSE;</span></div>
<div><span> GVL.bStart2 := FALSE;</span></div>
<div><span> IF motor_trig1 THEN</span></div>
<div><span> trig_status:= 1;</span></div>
<div><span> motor_trig1:= FALSE;</span></div>
<div><span> fbMove2.Execute:= FALSE;</span></div>
<div><span> fbMove_rev2.Execute:= FALSE;</span></div>
<div><span> fbMove_rot2.Execute:= FALSE;</span></div>
<div><span> ELSIF motor_trig2 THEN</span></div>
<div><span> trig_status:= 2;</span></div>
<div><span> motor_trig2:= FALSE;</span></div>
<div><span> fbMove1.Execute:= FALSE;</span></div>
<div><span> fbMove_rev1.Execute:= FALSE;</span></div>
<div><span> fbMove_rot1.Execute:= FALSE;</span></div>
<div><span> END_IF</span></div>
<div><span> GVL.bStop:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>REdge_StopDone_rev(CLK:= bStopDone_rev);</div>
<div>IF REdge_StopDone_rev.Q THEN</div>
<div><span> GVL.bStop_rev:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>REdge_StopDone_rot(CLK:= bStopDone_rot);</div>
<div>IF REdge_StopDone_rot.Q THEN</div>
<div><span> GVL.bStop_rot:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>REdge_Restart(CLK:= GVL.bRestart);</div>
<div>IF REdge_Restart.Q THEN</div>
<div><span> GVL.bStart:= TRUE;</span></div>
<div><span> IF trig_status = 1 THEN</span></div>
<div><span> motor_trig1:= TRUE;</span></div>
<div><span> ELSIF trig_status = 2 THEN</span></div>
<div><span> motor_trig2:= TRUE;</span></div>
<div><span> END_IF</span></div>
<div><span> GVL.bRestart:= FALSE;</span></div>
<div>END_IF</div>
<div> </div>
<div>nPos_X.0:= Robot1._UO1.Xl0;</div>
<div>nPos_X.1:= Robot1._UO1.Xl1;</div>
<div>nPos_X.2:= Robot1._UO1.Xl2;</div>
<div>nPos_X.3:= Robot1._UO1.Xl3;</div>
<div>nPos_X.4:= Robot1._UO1.Xl4;</div>
<div>nPos_X.5:= Robot1._UO1.Xl5;</div>
<div>nPos_X.6:= Robot1._UO1.Xl6;</div>
<div>nPos_X.7:= Robot1._UO1.Xl7;</div>
<div>nPos_X.8:= Robot1._UO1.Xl8;</div>
<div>nPos_X.9:= Robot1._UO1.Xl9;</div>
<div>nPos_X.10:= Robot1._UO1.Xl10;</div>
<div>nPos_X.11:= Robot1._UO1.Xl11;</div>
<div>nPos_X.12:= Robot1._UO1.Xl12;</div>
<div>nPos_X.13:= Robot1._UO1.Xl13;</div>
<div>nPos_X.14:= Robot1._UO1.Xl14;</div>
<div>nPos_X.15:= Robot1._UO1.Xl15;</div>
<div>nPos_X.16:= Robot1._UO1.Xh0;</div>
<div>nPos_X.17:= Robot1._UO1.Xh1;</div>
<div>nPos_X.18:= Robot1._UO1.Xh2;</div>
<div>nPos_X.19:= Robot1._UO1.Xh3;</div>
<div>nPos_X.20:= Robot1._UO1.Xh4;</div>
<div>nPos_X.21:= Robot1._UO1.Xh5;</div>
<div>nPos_X.22:= Robot1._UO1.Xh6;</div>
<div>nPos_X.23:= Robot1._UO1.Xh7;</div>
<div> </div>
<div>nPos_Y.0:= Robot1._UO1.Yl0;</div>
<div>nPos_Y.1:= Robot1._UO1.Yl1;</div>
<div>nPos_Y.2:= Robot1._UO1.Yl2;</div>
<div>nPos_Y.3:= Robot1._UO1.Yl3;</div>
<div>nPos_Y.4:= Robot1._UO1.Yl4;</div>
<div>nPos_Y.5:= Robot1._UO1.Yl5;</div>
<div>nPos_Y.6:= Robot1._UO1.Yl6;</div>
<div>nPos_Y.7:= Robot1._UO1.Yl7;</div>
<div>nPos_Y.8:= Robot1._UO1.Yl8;</div>
<div>nPos_Y.9:= Robot1._UO1.Yl9;</div>
<div>nPos_Y.10:= Robot1._UO1.Yl10;</div>
<div>nPos_Y.11:= Robot1._UO1.Yl11;</div>
<div>nPos_Y.12:= Robot1._UO1.Yl12;</div>
<div>nPos_Y.13:= Robot1._UO1.Yl13;</div>
<div>nPos_Y.14:= Robot1._UO1.Yl14;</div>
<div>nPos_Y.15:= Robot1._UO1.Yl15;</div>
<div>nPos_Y.16:= Robot1._UO1.Yh0;</div>
<div>nPos_Y.17:= Robot1._UO1.Yh1;</div>
<div>nPos_Y.18:= Robot1._UO1.Yh2;</div>
<div>nPos_Y.19:= Robot1._UO1.Yh3;</div>
<div>nPos_Y.20:= Robot1._UO1.Yh4;</div>
<div>nPos_Y.21:= Robot1._UO1.Yh5;</div>
<div>nPos_Y.22:= Robot1._UO1.Yh6;</div>
<div>nPos_Y.23:= Robot1._UO1.Yh7;</div>
<div> </div>
<div>IF nXorY = 0 THEN</div>
<div><span> fRobotActualPos:= UDINT_TO_LREAL(nPos_X) / 1000.0;</span></div>
<div><span> IF Robot1._UO1.X_Check THEN</span></div>
<div><span> fRobotActualPos:= fRobotActualPos * (-1);</span></div>
<div><span> END_IF</span></div>
<div>ELSIF nXorY = 1 THEN</div>
<div><span> fRobotActualPos:= UDINT_TO_LREAL(nPos_Y) / 1000.0;</span></div>
<div><span> IF Robot1._UO1.Y_Check THEN</span></div>
<div><span> fRobotActualPos:= fRobotActualPos * (-1);</span></div>
<div><span> END_IF</span></div>
<div>END_IF</div>
<div> </div>
<div>REdge_bStart(CLK:= Robot1._UI1.UI09_RSR1);</div>
<div>IF REdge_bStart.Q THEN</div>
<div><span> fBackupValue:= fRobotActualPos;</span></div>
<div><span> bSequenceMode:= TRUE;</span></div>
<div> </div>
<div><span> (*fRobotTargetPos := fRobotFirstPos; </span></div>
<div><span> fRobotStartPos  := fRobotFirstPos;</span></div>
<div><span> fMotorTargetPos := 0.0;</span></div>
<div><span> fMotorStartPos  := 0.0;*)</span></div>
<div> </div>
<div><span> nTotalProcessCnt:= 1;</span></div>
<div><span> nTrackingIdx:= 1;</span></div>
<div><span> fRobotTargetPos:= GVL.aPathData.fRobot_Pos;</span></div>
<div><span> fRobotStartPos:= fRobotFirstPos;</span></div>
<div><span> fMotorTargetPos:= GVL.aPathData.fPosition;</span></div>
<div><span> fMotorStartPos:= 0.0;</span></div>
<div> </div>
<div><span> fRobotTotalDist := 0.0;</span></div>
<div><span> fRobotRemainRatio := 0.0;</span></div>
<div> </div>
<div><span> fSampledTargetPos := GVL.Axis1.NcToPlc.ModuloActPos; </span></div>
<div><span> fPositionError := 0.0;</span></div>
<div><span> fOutput := 0.0;</span></div>
<div> </div>
<div><span> fCalculatedOverride := 0.8;</span></div>
<div>END_IF</div>
<div>fRelativePos:= fRobotActualPos - fBackupValue;</div>
<div> </div>
<div>IF bSequenceMode THEN</div>
<div><span> IF ABS(fRelativePos) &gt;= ABS(fRobotTargetPos) THEN</span></div>
<div><span> nTrackingIdx:= nTrackingIdx + 1;</span></div>
<div><span> IF nTrackingIdx &gt; GVL.nMaxPoints THEN</span></div>
<div><span> nTrackingIdx:= 1;</span></div>
<div><span> fRobotTargetPos:= GVL.aPathData.fRobot_Pos;</span></div>
<div><span> fRobotStartPos:= GVL.aPathData.fRobot_Pos;</span></div>
<div><span> fMotorTargetPos:= GVL.aPathData.fPosition;</span></div>
<div><span> fMotorStartPos:= GVL.aPathData.fPosition;</span></div>
<div><span> ELSE</span></div>
<div><span> fRobotTargetPos:= GVL.aPathData.fRobot_Pos;</span></div>
<div><span> fRobotStartPos:= GVL.aPathData.fRobot_Pos;</span></div>
<div><span> fMotorTargetPos:= GVL.aPathData.fPosition;</span></div>
<div><span> fMotorStartPos:= GVL.aPathData.fPosition;</span></div>
<div><span> END_IF</span></div>
<div><span> END_IF</span></div>
<div>END_IF</div>
<div> </div>
<div>fbScanTimer(IN:= NOT fbScanTimer.Q, PT:= T#10MS);</div>
<div>IF fbScanTimer.Q THEN</div>
<div><span> fRobotTotalDist:= fRobotTargetPos - fRobotStartPos;</span></div>
<div><span> IF fRobotTotalDist &lt;&gt; 0 THEN</span></div>
<div><span> fRobotRemainRatio:= (fRobotTargetPos - fRelativePos) / fRobotTotalDist;</span></div>
<div><span> ELSE</span></div>
<div><span> fRobotRemainRatio:= 0.0;</span></div>
<div><span> END_IF</span></div>
<div> </div>
<div><span> IF fMotorTargetPos = 0 THEN</span></div>
<div><span> fMotorTargetPos:= 360;</span></div>
<div><span> END_IF</span></div>
<div><span> fMotorTotalDist:= fMotorTargetPos - fMotorStartPos;</span></div>
<div><span> fMotorVirtualTarget:= fMotorTargetPos - (fMotorTotalDist * fRobotRemainRatio);</span></div>
<div> </div>
<div><span> fSampledTargetPos:= fMotorVirtualTarget;</span></div>
<div><span> fSampledActualPos:= GVL.Axis1.NcToPlc.ModuloActPos;</span></div>
<div>END_IF</div>
<div> </div>
<div>fScaled_Kp:= fDrivePosLoopGain / 500.0;</div>
<div>fPositionError:= fSampledTargetPos - fSampledActualPos;</div>
<div> </div>
<div>fOutput:= fPositionError * fScaled_Kp;</div>
<div> </div>
<div>fCalculatedOverride:= LIMIT(0.5, (0.8 + fOutput), 1.0);<span> </span></div>
<div> </div>
<div>nRobotIdx.0:= Robot1._UO1.DO221;</div>
<div>nRobotIdx.1:= Robot1._UO1.DO222;</div>
<div>nRobotIdx.2:= Robot1._UO1.DO223;</div>
<div>nRobotIdx.3:= Robot1._UO1.DO224;</div>
<div>nRobotIdx.4:= Robot1._UO1.DO225;</div>
<div>nRobotIdx.5:= Robot1._UO1.DO226;</div>
<div>nRobotIdx.6:= Robot1._UO1.DO227;</div>
<div>nRobotIdx.7:= Robot1._UO1.DO228;</div>
<div>nRobotIdx.8:= Robot1._UO1.DO229;</div>
<div>nRobotIdx.9:= Robot1._UO1.DO230;</div>
<div>nRobotIdx.10:= Robot1._UO1.DO231;</div>
<div>nRobotIdx.11:= Robot1._UO1.DO232;</div>
<div>nRobotIdx.12:= Robot1._UO1.DO233;</div>
<div>nRobotIdx.13:= Robot1._UO1.DO234;</div>
<div>nRobotIdx.14:= Robot1._UO1.DO235;</div>
<div>nRobotIdx.15:= Robot1._UO1.DO236;</div>
<div> </div>
<div>nRobotIdx_int:= UDINT_TO_INT(nRobotIdx);</div>
<div>IF nRobotIdx_int &gt;= 1 AND nRobotIdx_int &lt;= GVL.nMaxPoints THEN</div>
<div>    frobot := GVL.aPathData.fRobot_Pos;</div>
<div>ELSE</div>
<div>    frobot := 0.0;</div>
<div>END_IF</div>
<div> </div>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>dxt123</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/inquiry-actual-position-leading-target-position-in-twincat-moveabsolute/</guid>
                    </item>
				                    <item>
                        <title>MC_CamIn - velocity of master axis not reaching maximal values</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/mc_camin-velocity-of-master-axis-not-reaching-maximal-values/</link>
                        <pubDate>Fri, 24 Apr 2026 10:11:03 +0000</pubDate>
                        <description><![CDATA[Hello,
We have a machine with spindle and a &#039;support&#039; axis. It was programmed to move coupled using MC_CamIn for the main automatic cycle and normal absolute movements for positioning and a...]]></description>
                        <content:encoded><![CDATA[<p>Hello,</p>
<p>We have a machine with spindle and a 'support' axis. It was programmed to move coupled using MC_CamIn for the main automatic cycle and normal absolute movements for positioning and auxilary movements.</p>
<p>When we position the spindle and/or the support X axis using the normal movements both reach our set/desired velocities i.e. 3000mm/s. </p>
<p>However when we run the 'main' automatic cycle using MC_CamIn where spindle is the master axis and X is our slave axis (using a table for positions for both) the spindle only reaches 719.36mm/s (always, if the movement is long enough it reaches it fast and caps at this specific value). </p>
<p>We cannot find how the MC_CamIn is calculating the velocity? From which settings does it get it?</p>
<p>The distance for Spindle is long enough it reaches the velocity in about 2 revolutions, and than runs 8 more revolutions with this specific yet low velocity. Our support axis X only makes small jumps of 1-2mm.</p>
<p>We tried different sets of maximum velocity/ reference velocity / acceleration /deceleration and jerk for both the spindle and x axis from the drive parameters. Even set it up 10x times higher, however the effect is always the same Spindle runs at 719.36 max.</p>
<p>This only occurs with MC_CamIn the normal motion works fine and spindle as well as X axis reach our set velocity i.e. 3000mm/s</p>
<p>Can anyone help with some insider info from where or how does the MC_CamIn calculate its movement velocity? We cannot find any place it would be declared or set. We have our position table for master and slave, the maximal velocity etc from drive parameters, so how can we increase master axis velocity?</p>
<p>&nbsp;</p>
<p>Thanks in advance!</p>
<p>&nbsp;</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>stavi</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/mc_camin-velocity-of-master-axis-not-reaching-maximal-values/</guid>
                    </item>
				                    <item>
                        <title>TwinCAT 3.1 (Build 4026) &amp; Git – Online Change fails after cloning project (mapping mismatch)</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/twincat-3-1-build-4026-git-online-change-fails-after-cloning-project-mapping-mismatch/</link>
                        <pubDate>Thu, 06 Nov 2025 21:02:29 +0000</pubDate>
                        <description><![CDATA[Hi everyone,
we’re currently running a TwinCAT 3.1 project (version 4026) with Git as our version control system, and we’ve run into a workflow issue that we can’t seem to solve.
Setup:
...]]></description>
                        <content:encoded><![CDATA[<p data-start="106" data-end="118">Hi everyone,</p>
<p data-start="120" data-end="285">we’re currently running a TwinCAT 3.1 project (version 4026) with Git as our version control system, and we’ve run into a workflow issue that we can’t seem to solve.</p>
<p data-start="287" data-end="297"><strong data-start="287" data-end="297">Setup:</strong></p>
<ul data-start="299" data-end="650">
<li data-start="299" data-end="335">
<p data-start="301" data-end="335">3 developers working in parallel</p>
</li>
<li data-start="336" data-end="396">
<p data-start="338" data-end="396">Multi-PLC project (separate PLC task for each developer)</p>
</li>
<li data-start="397" data-end="472">
<p data-start="399" data-end="472">One “main” development PC where the hardware configuration is activated</p>
</li>
<li data-start="473" data-end="544">
<p data-start="475" data-end="544">Each colleague clones the project from Git and works on <em data-start="531" data-end="538">their</em> PLC</p>
</li>
<li data-start="545" data-end="650">
<p data-start="547" data-end="650">The goal is that all of us can be logged into <em data-start="593" data-end="602">our own</em> PLC at the same time and perform Online Changes</p>
</li>
</ul>
<p data-start="652" data-end="668"><strong data-start="652" data-end="668">The problem:</strong></p>
<p data-start="670" data-end="953">After the hardware config is activated on the main PC and we all pull the project from Git, TwinCAT refuses Online Change on the other machines.<br data-start="814" data-end="817" />We get an error saying that the <strong data-start="849" data-end="875">mapping does not match</strong> or is invalid, even though nothing has been changed in the I/O configuration.</p>
<p data-start="955" data-end="1138">It seems like TwinCAT thinks the project is different from what’s running on the target, although everything (in theory) is identical – same commit, same configuration, same PLC code.</p>
<p data-start="1140" data-end="1158"><strong data-start="1140" data-end="1158">What we tried:</strong></p>
<ul data-start="1160" data-end="1529">
<li data-start="1160" data-end="1209">
<p data-start="1162" data-end="1209">Full rebuild on every workstation → no effect</p>
</li>
<li data-start="1210" data-end="1306">
<p data-start="1212" data-end="1306">Deleting the <code data-start="1225" data-end="1239">.compileinfo</code>, <code data-start="1241" data-end="1247">.tmc</code>, and generated build folders before building → no effect</p>
</li>
<li data-start="1307" data-end="1452">
<p data-start="1309" data-end="1452">Re-activating hardware locally on every PC → works, but then every developer ends up committing different hardware GUIDs to Git → merge chaos</p>
</li>
<li data-start="1453" data-end="1529">
<p data-start="1455" data-end="1529">Using “PLC only” activation → same mapping error when trying Online Change</p>
</li>
</ul>
<p data-start="1531" data-end="1562"><strong data-start="1531" data-end="1562">What we think is happening:</strong></p>
<p data-start="1564" data-end="1826">TwinCAT stores some hardware-related GUIDs / internal hashes locally, and after cloning the project, they don't match the target runtime, even if the code is identical.<br data-start="1732" data-end="1735" />As soon as one person re-activates the solution, the others can no longer do Online Change.</p>
<p data-start="1828" data-end="1841"><strong data-start="1828" data-end="1841">Question:</strong></p>
<p data-start="1843" data-end="1954">Has anyone found a clean workflow for <strong data-start="1881" data-end="1926">multi-developer TwinCAT projects with Git</strong>, where multiple people can:</p>
<ul data-start="1956" data-end="2098">
<li data-start="1956" data-end="1974">
<p data-start="1958" data-end="1974">clone the repo</p>
</li>
<li data-start="1975" data-end="2005">
<p data-start="1977" data-end="2005">go online with <em data-start="1992" data-end="1999">their</em> PLC</p>
</li>
<li data-start="2006" data-end="2026">
<p data-start="2008" data-end="2026">do Online Change</p>
</li>
<li data-start="2027" data-end="2098">
<p data-start="2029" data-end="2098"><strong data-start="2029" data-end="2040">without</strong> everyone having to re-activate the I/O tree individually?</p>
</li>
</ul>
<p data-start="2100" data-end="2276">Is there a recommended “.gitignore” setup to avoid committing machine-specific files?<br data-start="2185" data-end="2188" />Or is TwinCAT simply not made for true parallel development with shared hardware config?</p>
<p data-start="2278" data-end="2360">Any best practices, workarounds, or real-world experiences are highly appreciated!</p>
<p data-start="2362" data-end="2380" data-is-last-node="" data-is-only-node="">Thanks in advance!</p>
<p data-start="2362" data-end="2380" data-is-last-node="" data-is-only-node=""> </p>
<p data-start="2362" data-end="2380" data-is-last-node="" data-is-only-node="">Note: English is not my native language, so I used ChatGPT to help write this post. Hopefully everything is understandable – feel free to correct me if something sounds unclear.</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>funka84</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/twincat-3-1-build-4026-git-online-change-fails-after-cloning-project-mapping-mismatch/</guid>
                    </item>
				                    <item>
                        <title>Visual Studio Task List (Comment Tokens like TODO:) not showing in TwinCAT 3 XAE</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/visual-studio-task-list-comment-tokens-like-todo-not-showing-in-twincat-3-xae/</link>
                        <pubDate>Thu, 23 Oct 2025 07:54:30 +0000</pubDate>
                        <description><![CDATA[Hi everyone,
I&#039;m currently working with TwinCAT 3 XAE (2017) and I&#039;m trying to use the standard Visual Studio Task List feature to track comments like TODO:.
I&#039;ve confirmed that &quot;TODO&quot; is ...]]></description>
                        <content:encoded><![CDATA[<p>Hi everyone,</p>
<p>I'm currently working with TwinCAT 3 XAE (2017) and I'm trying to use the standard Visual Studio Task List feature to track comments like <code>TODO:</code>.</p>
<p>I've confirmed that "TODO" is listed under <code>Tools -&gt; Options -&gt; Environment -&gt; Task List</code>, and I can even add custom tokens there.</p>
<p>However, when I add comments in my code like:</p>
<pre contenteditable="false">// TODO: Refactor this section </pre>
<p>or</p>
<pre contenteditable="false">(* TODO: Check calculation logic *)</pre>
<p>These comments do not appear in the Task List window (View -&gt; Task List). <br />I understand that "Tasks" in TwinCAT usually refer to real-time execution tasks, which makes searching for this specific issue a bit difficult.</p>
<p>I'm explicitly asking about the Visual Studio feature that parses code comments for predefined tokens.<br /><br />Is this Task List comment functionality expected to work within the TwinCAT 3 XAE environment for PLC code? Are there any specific TwinCAT project settings or known limitations that might prevent it from working? Or perhaps a different syntax is required within PLC comments?<br /><br />Has anyone else encountered this and found a way to get comment tokens to show up in the Task List?</p>
<p><br /><br />Thanks in advance for any insights!</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>Jonas_R</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/visual-studio-task-list-comment-tokens-like-todo-not-showing-in-twincat-3-xae/</guid>
                    </item>
				                    <item>
                        <title>NC Camming - In desperate need of help</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/nc-camming-in-desperate-need-of-help/</link>
                        <pubDate>Sun, 21 Sep 2025 18:12:33 +0000</pubDate>
                        <description><![CDATA[I have a multi-axis NC Camming application. Kind of struggling to gain traction. I&#039;ve watched the Beckhoff webinar on the topic (Vimeo). The Infosys documentation is pretty lacking in terms ...]]></description>
                        <content:encoded><![CDATA[<p>I have a multi-axis NC Camming application. Kind of struggling to gain traction. I've watched the Beckhoff webinar on the topic (Vimeo). The Infosys documentation is pretty lacking in terms of application example. Went through a few plcOpen tutorials (thinking they might help things click), considering watching through Yaskawa's youtube videos on plcOpen to see if I can glean any additional insights (even though its demo'd in their software).</p>
<p>Read through the one post I could find on the topic here, and since it was more helpful than anything else I've found in the past several weeks, I figured I'd post looking for help. If anyone has some good resources for learning, or wouldn't mind downloading their knowledge/understanding into an example and post it as a reply to this thread, I'd be incredibly grateful.</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>mguido</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/nc-camming-in-desperate-need-of-help/</guid>
                    </item>
				                    <item>
                        <title>API to Interact with PLC/IDE?</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/api-to-interact-with-plc-ide/</link>
                        <pubDate>Thu, 04 Sep 2025 07:14:07 +0000</pubDate>
                        <description><![CDATA[I would like to write an application (preferably using .NET) that can trigger and save backup/restore of both source project files and binaries(?) published to hardware, e.g. a C9900-I627.
...]]></description>
                        <content:encoded><![CDATA[<p>I would like to write an application (preferably using .NET) that can trigger and save backup/restore of both source project files and binaries(?) published to hardware, e.g. a C9900-I627.</p>
<p>Is this possible? If so, any pointers and references would be greatly appreciated! </p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>henjoh</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/api-to-interact-with-plc-ide/</guid>
                    </item>
				                    <item>
                        <title>Running TwibCAT on a Virtual Box win10 Virtual Machine</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/running-twibcat-on-a-virtual-box-win10-virtual-machine/</link>
                        <pubDate>Wed, 27 Aug 2025 12:07:18 +0000</pubDate>
                        <description><![CDATA[Hello everybody, I&#039;m new member of twinControls and this my first Topic. I hope to be clear and using the right spirt of this Forum.
I&#039;m trying to use TwinCAT on a Virtual Machine created w...]]></description>
                        <content:encoded><![CDATA[<p>Hello everybody, I'm new member of twinControls and this my first Topic. I hope to be clear and using the right spirt of this Forum.</p>
<p>I'm trying to use TwinCAT on a Virtual Machine created with Virtual Box, but when I try to put TC in Run mode I get the following errors:<br /><br /></p>
935
936
<p>The first with the Previrtualization Interface set to "Hyper-V" and the second error when it is set to "None" (in the Virtual Box Settings --&gt; System).<br />I tried already many suggestion is possible to find on the Network, like: deactivation of Hyper-V, Virtual Machine Platform and Windows Hypervision Platform on the Host system, setting of shared CPUs leaving one Insulated and putting it as Default, running as administrator win8settick, etc...</p>
<p>From the second Error, I though that the Guest machine is not able to find an active virtualization (Intel VT-x) by nested virtualization.<br /><br />Indeed in the Setting of VM (in System --&gt; Processor) the setting of "Nested VT-x/AMD-V is not selectable, and I was not able to make the selection active.</p>
937
<p><strong>Here my system parameters:</strong></p>
<p><span style="text-decoration: underline">Host machine:</span></p>
<p>HP ZBook Power with processor Intel Ultra 9 185H</p>
<p>OS Win11 Pro</p>
<p>Virtualization Technology and Intel VT-x in the BIOS are active</p>
<p>Virtual Box version 7.2.0 r170228</p>
<p><span style="text-decoration: underline">Guest machine:</span></p>
<p>OS Win 10 Pro</p>
<p>TwinCAT 3.1 build 4024.67</p>
<p>In the following screenshot all the setting of the Virtual Machine:</p>
938
<p>I decided to use a virtual machine, thinking was a good idea to start using TwinCAT and perform testing and prototyping in a saparated part of my PC. I wanted in the end install TwinCAT directly in the win11 real machine , but I'm very worry these problem could happen also there.</p>
<p>I'm really close to be disparate, and I hope someone could know a solution for this issue.<br />I thank you in advance for every help and apologize if my post is not orthodox.</p>
<p>With best regards,</p>
<p>Simone</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>Simone71</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/running-twibcat-on-a-virtual-box-win10-virtual-machine/</guid>
                    </item>
				                    <item>
                        <title>Pull External OPC UA nested data structure into TC3 project</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/pull-external-opc-ua-nested-data-structure-into-tc3-project/</link>
                        <pubDate>Tue, 26 Aug 2025 21:42:40 +0000</pubDate>
                        <description><![CDATA[Wondering if anyone knows of a way to pull an existing external nested data structure into a TC3 project via OPC UA? For reference, UDT was set up in Rockwell&#039;s Studio 5000 and migrated to F...]]></description>
                        <content:encoded><![CDATA[<p>Wondering if anyone knows of a way to pull an existing external nested data structure into a TC3 project via OPC UA? For reference, UDT was set up in Rockwell's Studio 5000 and migrated to FactoryTalk Optix (which is heavily OPC UA based).</p>
<p>I have the object model for the UDT in FT Optix, and we pivoted to a Beckhoff platform for everything but the HMI (given it's a rather complex HMI project that wouldn't be realistic to redo given our project timeline for runoff). Given the size and scope of the existing UDT structure, I would love to avoid having to redo it from scratch. Every other PLC brand exports these in standard PLCOpen formats, except Rockwell. Was told from a Beckhoff AE that it might be possible to pull the structure in via OPC UA and generate the analogous Struct in TC3.</p>
<p>Anyone out there done this? If so, any pointers or instructions you've found that kind of spell this out?</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>mguido</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/pull-external-opc-ua-nested-data-structure-into-tc3-project/</guid>
                    </item>
				                    <item>
                        <title>twincat installation</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/twincat-installation/</link>
                        <pubDate>Thu, 14 Aug 2025 08:02:18 +0000</pubDate>
                        <description><![CDATA[During twincat standard instalation this occure]]></description>
                        <content:encoded><![CDATA[<p>During twincat standard instalation this occure</p>
933]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>kirsti</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/twincat-installation/</guid>
                    </item>
				                    <item>
                        <title>Change the default port of OPC UA in Twincat3</title>
                        <link>https://twincontrols.com/community/twincat-troubleshooting/change-the-default-port-of-opc-ua-in-twincat3/</link>
                        <pubDate>Fri, 08 Aug 2025 11:47:58 +0000</pubDate>
                        <description><![CDATA[Hi,
I’m working on a project where I want to connect two simulated PLCs (TwinCAT 3 and CODESYS) to a SCADA system (Ignition) via OPC UA. I already have a connection between Ignition and COD...]]></description>
                        <content:encoded><![CDATA[<p data-start="79" data-end="84">Hi,</p>
<p data-start="86" data-end="345">I’m working on a project where I want to connect two simulated PLCs (TwinCAT 3 and CODESYS) to a SCADA system (Ignition) via OPC UA. I already have a connection between Ignition and CODESYS, and now I want to add a connection between TwinCAT 3 and Ignition.</p>
<p data-start="347" data-end="524">In CODESYS, I’m using the default port 4840. I think using the same port in TwinCAT as in CODESYS could cause problems. Is it possible to change the default port in TwinCAT 3?</p>]]></content:encoded>
						                            <category domain="https://twincontrols.com/community/twincat-troubleshooting/">How-to &amp; Troubleshooting</category>                        <dc:creator>Weronika</dc:creator>
                        <guid isPermaLink="true">https://twincontrols.com/community/twincat-troubleshooting/change-the-default-port-of-opc-ua-in-twincat3/</guid>
                    </item>
							        </channel>
        </rss>
		