Resolving SIMOTION Error 200012 Reason 2 on Axis Restart

David Krause13 min read
Motion ControlSiemensTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Problem Description: Intermittent 200012 Reason 2 on _ResetAxis

On a SIMOTION D425-2 (firmware V4.4) controller, the system function _ResetAxis is invoked with both option bits set:

  • activate configuration data (re-read TO configuration from the project)
  • activate restart (execute the technology object restart sequence)

The call succeeds in the majority of cycles, but approximately one execution in ten returns the technology alarm:

Error   : 200012
Reason  : 2
Message : "Restart not carried out (reason 2)"
Help    : "The technology object is not ready to be restarted."

Pre-conditions at the time of the failing call are confirmed by online diagnostics:

  • actormonitoring.power = INACTIVE (the axis is not enabled)
  • No active drive-side or TO-side error is pending
  • The axis is in a stationary state

The intermittent nature of the fault, combined with the message that the TO is "not ready to be restarted," indicates that a hidden internal pre-condition is not satisfied at the moment _ResetAxis is called. This article documents the full restart pre-condition model, the system variables that gate the restart, and the correct programming pattern that eliminates the spurious 200012 reason 2.

Scope: The diagnosis and remedies apply to all SIMOTION D, SIMOTION C, and SIMOTION P platforms running SCOUT TIA V4.4 / V4.5 / V5.x and the SIMOTION runtime kernel V4.4 / V4.5 / V5.x. The reference target is the D425-2 multi-axis controller; behavior is identical on D435-2, D445-2, D455-2 and on the SIMOTION C240/C240-PN with the same TO firmware.

Technology Object Restart Architecture

Every SIMOTION axis is built on a technology object (TO) that owns a state machine controlling the lifecycle of motion control. The TO can be in one of the following high-level states at any instant:

Internal State Description Restart Permitted?
CREATED TO instantiated, configuration not yet loaded No — use _loadConfiguration
INITIALIZED Configuration loaded, no runtime data Yes (cold start)
RUNNING Active motion control, homing possibly valid Conditional — see restartCondition
STOPPED Servo enable removed, TO in standby Yes (warm restart)
ERROR Alarm pending, motion blocked Only after _resetAxis with acknowledge
RESTART_PENDING Restart command accepted, internal cleanup in progress No — wait for completion

The state machine is not directly exposed to the user program, but is observed through the boolean system variable <axis>.reset and the enumerations <axis>.restartActivation and <axis>.restartCondition.

Root Cause of 200012 Reason 2

Reason 2 of technology alarm 200012 is generated when the TO state machine receives a restart command while it is still inside the RESTART_PENDING window of a previous restart. The window is short (typically 5 to 40 ms on a D425-2 at default task configuration) but non-zero, and the second _resetAxis call is rejected with "The technology object is not ready to be restarted."

Three practical scenarios trigger this:

  1. Double-trigger from the user program. The same restart command is issued from both an IPO/task level and an alarm context, or from two cooperating program sources that are not mutually exclusive.
  2. Restart before prior reset completed. The user program sets restartActivation = ACTIVATE_RESTART, observes a successful return code, and immediately re-invokes _resetAxis without waiting for the TO to deassert reset = ACTIVE.
  3. Configuration-data activation racing with restart activation. With the activate configuration data option bit set, the TO first reloads its dataset, then performs the restart. If the calling program polls for completion too early, the second call can land inside the internal gap.

The observed one-in-ten failure rate is consistent with scenario 2 or 3 on a machine where the user program runs on a 4 ms IPO1 task and the TO restart window is occasionally stretched by the data-image reload.

Why disabling the axis does not prevent the fault: The "axis not enabled" check (actormonitoring.power = INACTIVE) is a necessary but not sufficient condition. The TO is also not ready for a restart while it is internally flushing the homing status, the position setpoint generator, the cam data, and the synchronous operation relationships. Power-off the actuator alone does not complete that flush.

Pre-Conditions Required for a Valid Axis Restart

Before invoking _resetAxis, the user program must guarantee the following seven conditions. The order matters; a check should be performed top-to-bottom and the restart aborted if any condition fails.

  1. No active technology alarm on the TO. Confirm <axis>.error = FALSE. If an alarm is pending, call _resetAxis(axis := ..., errorAcknowledge := TRUE, restart := FALSE) first to acknowledge.
  2. No active drive-side fault. Inspect <axis>.drive.error and the drive telegram status word. A drive in S_ZSW1_3 fault_present state blocks the restart.
  3. Servo enable removed. <axis>.actormonitoring.power = INACTIVE. The TO will refuse a restart with power applied.
  4. Axis mechanically at standstill. ABS(actualVelocity) < standstillWindow. Default standstill window is configured under Axis → Mechanical system → Standstill signal.
  5. No active motion command. <axis>.motionState = INACTIVE or STANDSTILL. A positioning command still in execution prevents the restart even if velocity is zero.
  6. No synchronous operation in progress. If the axis is a slave in a cam or gearing relationship, that relationship must be disengaged (_disableSynchronousOperation or synchronousOperation.enable = FALSE).
  7. Prior restart fully completed. <axis>.reset = INACTIVE. This is the single check that most often prevents the 200012 reason 2 fault.

System Variables Reference

The TO exposes three system variables that control and observe the restart sequence. All three are available on the axis data structure generated by SCOUT TIA or SCOUT V4.4/V5.x.

restartCondition (input, enumeration)

Located at <axis>.restartCondition.restartAxisCondition. Defines the user-defined gating logic. Only one value is active at a time:

Value Constant Meaning
1 NO_CONDITIONS Restart is always permitted when the TO is otherwise ready. Use only for cold commissioning.
2 STANDSTILL Restart only when actual velocity is within the standstill window and no motion command is active.
3 AXIS_DISABLED Restart only when actormonitoring.power = INACTIVE and all dependent conditions are satisfied.

Recommended value: 2 (STANDSTILL) for normal production operation; 3 (AXIS_DISABLED) for service mode. The value is read by the TO at the moment the restart command is latched, so it can be changed dynamically.

restartActivationSetting (input, bitmask)

Located at <axis>.restart.restartActivationSetting. Selects which subsystem the restart affects:

Bit Effect
Bit 0 — ACTIVATE_RESTART Restart of the runtime data of the TO (clears homing, command state, follow-up errors).
Bit 1 — ACTIVATE_CONFIGURATION Re-read the TO configuration from the project (datasets, limits, encoder assignment).
Bit 2 — ACTIVATE_CONFIGURATION_DATA Equivalent to activate configuration data option of _resetAxis.
Bit 3 — ACTIVATE_RESTART_FAST Reduced-cycle restart; bypasses dataset reload. Use for high-frequency restarts.

reset (output, boolean)

Located at <axis>.reset. Boolean observation of the internal restart state.

  • reset = ACTIVE: restart sequence in progress, TO is not yet ready for a new restart command.
  • reset = INACTIVE: TO is in a stable, restart-eligible state.

This is the primary feedback signal that eliminates the 200012 reason 2 fault. Wait for the falling edge ACTIVE → INACTIVE before considering the restart complete or before issuing a second _resetAxis.

_ResetAxis Function Programming

The library function declaration in the SIMOTION basic library (v4.4 / V5.x) is:

FUNCTION _resetAxis : BOOL
VAR_INPUT
    axis            : AxisRef;       // reference to the TO
    errorAcknowledge: BOOL := FALSE; // acknowledge pending alarms
    restart         : BOOL := FALSE; // execute restart after ack
END_VAR

The implementation pattern that prevents 200012 reason 2 is to issue the command and then block further restart activity until the TO has cleared the internal reset flag. A complete, safe call sequence in Structured Text (ST) is shown below.

Reference Implementation: ST Function Block

FUNCTION_BLOCK fbAxisRestart_Safe
VAR_INPUT
    bExecute        : BOOL;          // rising edge triggers restart
    eRestartMode   : DINT;          // 1=no_cond, 2=standstill, 3=axis_disabled
    bActivateConfig: BOOL;          // re-read TO configuration
END_VAR
VAR_OUTPUT
    bBusy           : BOOL;
    bDone           : BOOL;
    bError          : BOOL;
    dwErrorId       : DWORD;         // mirrors 200012 etc.
    iReason         : INT;           // mirrors alarm reason
END_VAR
VAR
    axisRef         : AxisRef;
    rtState         : DINT;          // 0=idle,1=pre-check,2=cmd-issued,3=wait,4=done
    tStart          : TIME;
    axisHandle      : AxisRef;
END_VAR
VAR CONSTANT
    TIMEOUT_MS      : TIME := T#2s;  // overall command watchdog
    PRECHECK_MS     : TIME := T#20ms;// settle time after disable
END_VAR

CASE rtState OF
    0: // IDLE — wait for execute
        IF bExecute AND NOT bBusy THEN
            bDone  := FALSE;
            bError := FALSE;
            tStart := CURRENT_TIME;
            rtState := 1;
        END_IF;

    1: // PRE-CHECK — verify gating conditions
        IF (axisRef.error = FALSE)
           AND (axisRef.drive.error = FALSE)
           AND (axisRef.actormonitoring.power = INACTIVE)
           AND (axisRef.motionState IN {STANDSTILL, INACTIVE})
           AND (axisRef.reset = INACTIVE)
        THEN
            // Set the restart condition the TO must observe
            axisRef.restartCondition.restartAxisCondition := eRestartMode;
            // Build the activation bitmask
            IF bActivateConfig THEN
                axisRef.restart.restartActivationSetting :=
                    ACTIVATE_RESTART OR ACTIVATE_CONFIGURATION_DATA;
            ELSE
                axisRef.restart.restartActivationSetting := ACTIVATE_RESTART;
            END_IF;
            // Latch the restart command
            axisRef.restartActivation := ACTIVATE_RESTART;
            rtState := 2;
        ELSIF (CURRENT_TIME - tStart) > PRECHECK_MS THEN
            bError    := TRUE;
            dwErrorId := 200012;
            iReason   := 2;
            rtState   := 4;
        END_IF;

    2: // COMMAND ISSUED — call the library function
        bBusy := TRUE;
        _resetAxis(axis := axisRef,
                   errorAcknowledge := TRUE,
                   restart := TRUE);
        rtState := 3;

    3: // WAIT FOR COMPLETION — observe reset going INACTIVE
        IF axisRef.reset = INACTIVE THEN
            bDone  := TRUE;
            bBusy  := FALSE;
            rtState := 4;
        ELSIF (CURRENT_TIME - tStart) > TIMEOUT_MS THEN
            bError    := TRUE;
            dwErrorId := 200012;
            iReason   := 99; // watchdog
            bBusy     := FALSE;
            rtState   := 4;
        END_IF;

    4: // DONE — hold result until bExecute clears
        IF NOT bExecute THEN
            rtState := 0;
        END_IF;

END_CASE;

The critical lines for eliminating 200012 reason 2 are:

  • State 1 — gating check that explicitly verifies axisRef.reset = INACTIVE before issuing the command.
  • State 3 — wait for the TO to lower the reset flag, which proves the internal restart sequence is finished.
Edge-triggered execution only: Always invoke the FB on a rising edge of bExecute. A level-triggered call re-enters the pre-check continuously and re-triggers the restart while the TO is still in RESTART_PENDING, producing the exact symptom the source poster described.

State Machine and Timing

The interaction between the user program and the TO during a successful restart follows the timing shown below. The 200012 reason 2 window is the t1..t2 interval during which the TO has accepted the command but has not yet deasserted reset.

bExecute restartActivation TO.reset TO.error t0 t1 t2 (200012 reason 2 window) t3
  • t0: bExecute rises; pre-checks begin.
  • t1: restartActivation = ACTIVATE_RESTART latched; TO.reset rises to ACTIVE.
  • t1..t2: TO is internally flushing homing and position setpoint. Any second _resetAxis call inside this window is rejected with 200012 reason 2.
  • t2: Internal flush complete; TO.reset falls to INACTIVE. TO is now ready for the next restart.
  • t3: Done flag set; FB returns to IDLE on falling edge of bExecute.

Common Programming Pitfalls

Pitfall Symptom Fix
Polling for done inside the same task that issues the restart 200012 reason 2 on every second call Move the poll to a slower task (background or IPO2)
Calling _resetAxis from both MotionTask and BackgroundTask Intermittent 200012 reason 2 Centralize the call in one task; gate with a semaphore bit
Setting restartActivation and calling _resetAxis in the same IPO cycle Restart accepted, homing status not reset Use the restartActivation field and let the TO process it on the next cycle; observe reset for confirmation
Re-arming bExecute on the falling edge of done within the same cycle Two restarts in two consecutive cycles Require the operator to drop bExecute for at least one full IPO cycle before re-asserting
Using NO_CONDITIONS in a running machine Restart attempted while motion still in progress, 200012 reason 1 instead Switch to STANDSTILL for production
Forgetting to clear restartActivation TO restarts again on the next configuration change Reset to NO_RESTART after reset = INACTIVE is observed

Verification Procedure

  1. Open the axis online in SCOUT TIA and force a known state (drive off, no error, standstill).
  2. Manually set <axis>.restartCondition.restartAxisCondition = 2 (STANDSTILL).
  3. Set a watchpoint on <axis>.reset.
  4. Execute the FB once. Verify in the online trace that reset goes ACTIVE for > 1 IPO cycle and then returns to INACTIVE.
  5. Execute the FB a second time within 100 ms. Verify the call still completes and no 200012 reason 2 is logged in the diagnostic buffer.
  6. Repeat step 5 ten times in succession. The historic failure rate of 1/10 should drop to 0/10.
  7. Check the diagnostic buffer (Target system → Diagnostic buffer) for any pending 200012 entries older than the test session.
  8. Verify that the homing status (<axis>.homingState) is reset to NOT_HOMED after each restart — this is the side-effect most often missed in the field.

SIMOTION D425-2 Platform Notes

The D425-2 (6AU1425-2AD00-0AA0, firmware V4.4 SPx) is a multi-axis controller with 16 maximum axes. Relevant points for restart behavior:

  • Default IPO1 task is 4 ms. The internal restart window spans 1 to 2 IPO cycles plus dataset reload overhead.
  • Servo clock (current controller) is 125 µs. The TO uses this clock to schedule the reset = INACTIVE transition; reduce cycle jitter on PROFINET IRT if intermittent 200012 reason 2 faults persist after the FB fix.
  • Cross-axis restart dependencies exist: if axis A is the master of axis B via a cam, restarting A while B is enabled propagates the 200012 reason 2 to B. Always stop and disable all slaves first.
  • The D425-2 maintains the configuration data in non-volatile memory. The activate configuration data option is mandatory after a project download to apply changes to the TO — but it is not necessary for a runtime-only restart of an unmodified configuration.

Comparison: SIMOTION vs. S7-1500T Axis Restart

For migration or parallel use, the equivalent S7-1500 / S7-1500T axis restart uses the PLC open block MC_Reset from the MotionControl library. The pre-condition model is similar but the API surface differs.

Aspect SIMOTION (D425-2, V4.4) S7-1500 / S7-1500T
Restart function _resetAxis or <axis>.restartActivation MC_Reset (with Restart = TRUE)
Configuration reload Option bit on _resetAxis Mode bit on MC_Reset or project download
Pre-condition gating restartCondition.restartAxisCondition Implicit in MC_Reset state machine
Completion feedback <axis>.reset = INACTIVE MC_Reset.Done rising edge
Intermittent rejection code 200012 reason 2 16#8001 (axis not ready) on MC_Reset.Busy
Cold start after download Automatic on RUN-to-RUN Requires MC_Reset with Restart bit

The official S7-1500T reference for axis restart is documented in the S7-1500T Restart of Technology Object section of the TIA Portal help portal.

Troubleshooting Matrix

Alarm Reason Likely Cause Remediation
200012 1 Drive not in standby, telegram status word ZSW1.13 not zero Disable drive via STW1.0; wait for ZSW1.13 = 0
200012 2 TO in RESTART_PENDING from prior call Wait for reset = INACTIVE before re-issuing; gate with edge-triggered FB
200012 3 Axis is being used as a synchronous slave Call _disableSynchronousOperation first
200012 4 A following axis is referencing this axis as its leading axis Detach all following axes; restart from the master outward
200012 5 Configuration data activation in progress Wait for configurationState = APPLIED
200012 6 Encoder configuration inconsistent (e.g. SSI multiturn overflow) Re-home with explicit absolute encoder preset
200012 7 TO is currently in a controller stop (firmware V5.x safety integration) Resolve the safety stop first via PROFIsafe host
200012 8 Internal data inconsistency after RUN-to-RUN Power-cycle the D425-2 module

FAQ

What does SIMOTION error 200012 reason 2 mean?

It means the technology object received a restart command while it was still inside the internal RESTART_PENDING window of a previous restart. The TO is "not ready to be restarted" because it has not yet finished flushing homing status, position setpoint, and synchronous-operation relationships.

How long is the RESTART_PENDING window on a D425-2?

Typically 1 to 2 IPO1 cycles (4 to 8 ms at the default 4 ms task) plus the time to reload the configuration dataset if the activate configuration data option is set. On a heavily loaded PROFINET IRT network, expect up to 40 ms.

Which system variable tells me the TO has finished restarting?

<axis>.reset. It rises to ACTIVE when the restart command is latched and returns to INACTIVE when the TO has fully completed the restart. Do not issue a second restart until you observe the falling edge.

Should I use NO_CONDITIONS, STANDSTILL, or AXIS_DISABLED?

For production, use STANDSTILL (value 2). It enforces both velocity and motion-state checks. AXIS_DISABLED (value 3) is appropriate for service mode. NO_CONDITIONS (value 1) is for cold commissioning only and should not be left active in a running machine.

Does the fix also apply to S7-1500T axis restarts?

The principle is the same — wait for completion feedback before re-issuing. On S7-1500T use the MC_Reset block and wait for the Done rising edge rather than the Busy falling edge; the block internally manages the equivalent of reset = INACTIVE. See the S7-1500T Restart of Technology Object documentation for the exact block parameters.

Back to blog