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.
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:
- 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.
-
Restart before prior reset completed. The user program sets
restartActivation = ACTIVATE_RESTART, observes a successful return code, and immediately re-invokes_resetAxiswithout waiting for the TO to deassertreset = ACTIVE. - 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.
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.
-
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. -
No active drive-side fault. Inspect
<axis>.drive.errorand the drive telegram status word. A drive inS_ZSW1_3 fault_presentstate blocks the restart. -
Servo enable removed.
<axis>.actormonitoring.power = INACTIVE. The TO will refuse a restart with power applied. -
Axis mechanically at standstill.
ABS(actualVelocity) < standstillWindow. Default standstill window is configured under Axis → Mechanical system → Standstill signal. -
No active motion command.
<axis>.motionState = INACTIVEorSTANDSTILL. A positioning command still in execution prevents the restart even if velocity is zero. -
No synchronous operation in progress. If the axis is a slave in a cam or gearing relationship, that relationship must be disengaged (
_disableSynchronousOperationorsynchronousOperation.enable = FALSE). -
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 = INACTIVEbefore issuing the command. - State 3 — wait for the TO to lower the
resetflag, which proves the internal restart sequence is finished.
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.
-
t0:
bExecuterises; pre-checks begin. -
t1:
restartActivation = ACTIVATE_RESTARTlatched;TO.resetrises toACTIVE. -
t1..t2: TO is internally flushing homing and position setpoint. Any second
_resetAxiscall inside this window is rejected with 200012 reason 2. -
t2: Internal flush complete;
TO.resetfalls toINACTIVE. 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
- Open the axis online in SCOUT TIA and force a known state (drive off, no error, standstill).
- Manually set
<axis>.restartCondition.restartAxisCondition = 2 (STANDSTILL). - Set a watchpoint on
<axis>.reset. - Execute the FB once. Verify in the online trace that
resetgoesACTIVEfor > 1 IPO cycle and then returns toINACTIVE. - 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.
- Repeat step 5 ten times in succession. The historic failure rate of 1/10 should drop to 0/10.
- Check the diagnostic buffer (Target system → Diagnostic buffer) for any pending 200012 entries older than the test session.
- Verify that the homing status (
<axis>.homingState) is reset toNOT_HOMEDafter 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 = INACTIVEtransition; 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.