Problem Description
A SIMODRIVE 611U servo drive equipped with the positioning module 6SN1118-1NH01-0AA1 on firmware 14.02, configured for MDI (Manual Data Input) mode 0x30 (relative, positive direction), exhibits the following fault behavior: when the PLC updates the MDI position setpoint and toggles control word bit 0.6 ("Start positioning task") while the axis is mid-motion, the drive first decelerates the motor toward the original target, then re-accelerates from near zero to the new target velocity. The expected engineering outcome is continuous path motion - equivalent to SINUMERIK G64 continuous-path mode - without the intermediate stop. The symptom is visible on the SimoComU trace as a sharp V-shaped velocity trough at the moment of the new trigger event.
Affected Hardware and Firmware
| Item | Value | Notes |
|---|---|---|
| Drive family | SIMODRIVE 611U | Siemens catalog, 6SN11xx series |
| Positioning module | 6SN1118-1NH01-0AA1 | MLFB / part number |
| Firmware version | 14.02 | Reported on drive display / SimoComU |
| Control platform | SIMATIC S7-300, CPU 319 | STEP 7 V5.x or TIA Portal |
| HMI | SIMATIC TP900 Comfort | Operator panel |
| MDI mode | 0x30 (relative, positive) | STW2 mode field |
| Axis type | Rotary (modulo) | P0170 = 1, P0171 = 360000 LU |
Root Cause Analysis
The deceleration/re-acceleration artifact originates from one of four independent causes. On a 611U the symptom rarely maps to a single parameter. Each must be verified before the on-the-fly behavior is restored.
1. Block-change condition is set to "exact stop"
The 611U positioning module interprets a new MDI setpoint plus a new rising edge of bit 0.6 according to the "block change condition" parameter. The factory default for firmware 14.x is exact-stop with ramp, meaning the axis must reach the previous setpoint within a positioning window before the new setpoint becomes active. When the bit is toggled mid-motion, the drive executes the deceleration ramp of the in-flight task, then the acceleration ramp of the new task. The two ramps touch at zero velocity and the velocity trace shows a V-shaped trough.
2. Acceleration and deceleration overrides are zero or too small
Parameters P0093 (MDI acceleration override) and P0094 (MDI deceleration override) scale the MDI acceleration/deceleration values defined in P0100 / P0101. If either override is 0% - for example because a previous commissioning session limited the override - the axis decelerates with the maximum allowed ramp (which appears as a very fast stop, not "zero"). More commonly, the override is left at 100% but the MDI acceleration itself was left at the conservative 100 ms factory default; the axis then has a soft ramp that visually mimics "smooth" motion but is still exact-stop.
3. Reference point / referencing is not complete
Writing 0 into P0160 (Reference point coordinate) is not equivalent to running the "Referencing" sequence. P0160 only stores the coordinate value the drive will assign to the reference cam position. The referencing sequence (search for reference cam switch, synchronise to zero marker, latch to P0160) must be executed at least once after power-up - otherwise the absolute position value is "unknown" / "not referenced", and the drive internally treats every new traversing task as a fresh start with full ramp-down of the prior motion. This is a documented firmware behavior of 611U from FW 13.x onward.
4. Telegram mapping does not match parameter bank
The position setpoints are written to PZD words 4 and 5 of the standard positioning telegram. If the HW Config telegram selected in STEP 7 (e.g., Siemens telegram 105) does not match the parameter bank assignment in P0875 (telegram selection) on the 611U, the words are interpreted as different quantities (e.g., velocity override instead of position), and the drive triggers an internal abort because the setpoint stream is inconsistent.
Telegram and Control Word Reference
For positioning tasks via PROFIBUS, the 611U expects one of the Siemens-specific telegrams 102, 103, 104, or 105. The bit 0.6 trigger ("Start positioning task") is bit 6 of control word 1 (STW1), in the PROFIdrive convention.
| PZD | Telegram 105 (Siemens) | Direction | Content |
|---|---|---|---|
| PZD1 | STW1 / ZSW1 | PLC -> Drive / Drive -> PLC | Control word 1 / Status word 1 |
| PZD2 | STW2 / ZSW2 | Bidirectional | Control/Status word 2 (MDI mode) |
| PZD3 | MDI_TARPOS / ACTPOS | PLC -> Drive / Drive -> PLC | MDI target position (high word) / Actual position (high) |
| PZD4 | MDI_TARPOS / ACTPOS | PLC -> Drive / Drive -> PLC | MDI target position (low word) / Actual position (low) |
| PZD5 | MDI_VEL / ACTVEL | PLC -> Drive / Drive -> PLC | MDI velocity setpoint / Actual velocity |
| PZD6 | MDI_ACC / MDI_DEC | PLC -> Drive | MDI acceleration / deceleration override |
Position format is 32-bit signed integer with 1 increment = 1 LU (length unit). The default LU for a rotary axis configured with P0170 = 1 and P0171 = 360000 is 0.001 degree per increment - i.e., 360000 LU per revolution.
Control word 1 (STW1) bit assignments
| Bit | Name | Function in positioning |
|---|---|---|
| 0 | ON / OFF1 | Drive enable |
| 1 | OFF2 | Coast stop (low active) |
| 2 | OFF3 | Quick stop (low active) |
| 3 | Enable operation | Inverter enable |
| 4 | Enable ramp generator | Ramp generator enable |
| 5 | Unfreeze ramp generator | Unfreeze |
| 6 | Enable setpoint / start positioning | Activates traversing task (0->1 = start) |
| 7 | Fault reset | 0->1 = acknowledge fault |
| 8-15 | Mode / reserved | MDI mode bits and additional functions |
Bit 0.6 is the rising-edge trigger the PLC toggles to start a new MDI task. The firmware samples this bit on the PROFIBUS cycle. The new task is accepted only if the bit was previously at 0 - a static 1 does not re-trigger.
Configuration Steps for Smooth On-the-Fly Position Changes
Perform the following sequence using SimoComU (commissioning tool, RS232 service port on the 611U) or via parameter download from STEP 7. The drive must be in the "Parameterise" state (no enable) during writes.
Step 1 - Select the correct MDI mode
Confirm the mode word the PLC writes. For absolute positioning in the positive direction (so a 359 degrees to 200 degrees move traverses the short way across the modulo boundary), use mode 0x10 or 0x50 instead of 0x30. With 0x30 (relative positive), the drive computes a delta from the live position and selects direction based on sign; this is fine for a fixed-delta move but causes wrap-around issues for arbitrary target jumps.
STW2 (PZD2) = 16#0010 // MDI absolute, positive direction
STW2 (PZD2) = 16#0050 // MDI absolute, positive direction with bit flags
Step 2 - Set block-change condition to "continue"
The block-change condition lives in the position-controller parameter set. On firmware 14.x it is parameter P0140 (block change condition for positioning).
| P0140 value | Behavior | Use case |
|---|---|---|
| 0 | Exact stop, fine | Holding fixtures, indexing tables |
| 1 | Exact stop, coarse | Indexing with reduced window |
| 2 | Continue with ramp (on-the-fly) | Continuous-path motion, registration |
| 3 | Continue without ramp | High-speed registration, only valid for short deltas |
For continuous-path motion analogous to SINUMERIK G64, set P0140 = 2. The axis will now accept a new traversing task mid-motion and transition the velocity profile continuously, without decelerating to zero.
Step 3 - Size the acceleration and deceleration overrides
The MDI acceleration/deceleration ramp times are defined in P0100 (acceleration ramp) and P0101 (deceleration ramp), with units of milliseconds for a velocity change from 0 to rated. The overrides P0093 and P0094 scale these ramps.
Override scaling formula:
P0093 = (P0100 / desired_MDI_accel_ms) * 100 [%]
P0094 = (P0101 / desired_MDI_decel_ms) * 100 [%]
For a continuous-path application, set both overrides to 100% and reduce P0100/P0101 directly until the velocity profile is smooth at the highest expected block-change frequency. A typical value for a packaging rotary axis is 200-500 ms for the full 0 to v_max ramp.
Step 4 - Configure the axis type for modulo motion
| Parameter | Value | Meaning |
|---|---|---|
| P0170 | 1 | Axis type = rotary |
| P0171 | 360000 | Modulo range in LU (0.001 degree resolution) |
| P0172 | 1 | Direction convention: positive = mathematical positive |
| P0173 | 1 | Position display in 0.001 degree |
With the rotary axis active, the drive automatically handles wrap-around at 0/360 degrees and selects the shortest path for absolute MDI moves by default. This is the behavior required for the 359 degrees to 200 degrees move described in the application: a 161 degrees positive move rather than a 199 degrees negative move.
Step 5 - Run the referencing sequence
Before any on-the-fly operation is attempted in production, complete the referencing sequence:
- Ensure the reference cam is wired to the positioning-module input.
- Start the reference-point travel via P0174 = 1 (start reference point travel in positive direction) or use the SIMATIC FB
POS_REFcall. - Wait for the status bit "Referenced" (ZSW1 bit 0.11 = "Reference point set") to assert.
- Verify the actual position reads the value stored in
P0160(default 0).
If the system is a single-turn rotary axis with an absolute encoder (e.g., Singleturn SSI), referencing is required only once after commissioning and is retained across power cycles. With a multi-turn encoder, no referencing is required.
PLC Programming Example (S7-300, Structured Text)
The following ST function block implements the on-the-fly MDI position change. The block runs in OB1 (cyclic) and writes to the I/O area of the positioning module via SFC14 / SFC15 (consistent data write).
FUNCTION_BLOCK FB850 "MDI_OnFly_Positioning"
VAR_INPUT
iAxisEnable : BOOL; // Master enable from safety chain
iNewTarget : BOOL; // Trigger: new target available
iTargetPos : DINT; // Target position in LU (rotary, 0..359999)
iVelocityLUps : DINT; // MDI velocity in LU/s
END_VAR
VAR_OUTPUT
oInMotion : BOOL; // ZSW1 bit 0.14 (motion status)
oAtTarget : BOOL; // ZSW1 bit 0.10 (target reached)
oFaulted : BOOL; // Fault active
END_VAR
VAR
sState : INT; // 0=idle, 1=await_edge, 2=ack
sTrigPrev : BOOL; // Edge memory
sSTW1 : WORD; // Control word 1
sSTW2 : WORD; // Control word 2 (MDI mode)
sTarPos : DWORD; // PZD3+PZD4 (32-bit position)
sVel : WORD; // PZD5 (velocity, N2 format)
sAccDec : WORD; // PZD6 (override)
sSendBuf : ARRAY[0..11] OF BYTE; // Telegram 105 output
END_VAR
BEGIN
// Build control word 1: enable drive, no fault, ramp enabled
sSTW1 := 16#004F; // bits 0,1,2,3,6 set => ON, no OFF2/OFF3, enable op, enable setpoint
// MDI absolute, positive direction (P0140=2 makes this on-the-fly capable)
sSTW2 := 16#0010;
// Override 100% on both acceleration and deceleration
sAccDec := 16#64; // 100 in low byte, 100 in high byte per telegram spec
// Convert velocity to N2 (Siemens normalized) format
sVel := WORD(iVelocityLUps / 100); // example scaling; tune per P0200
sTarPos := DWORD(iTargetPos);
// State machine for edge-triggered start
IF iAxisEnable THEN
CASE sState OF
0: // idle - bit 0.6 LOW, awaiting trigger
sSTW1 := sSTW1 AND (NOT 16#0040); // clear bit 6
IF iNewTarget AND NOT sTrigPrev THEN
sState := 1;
END_IF;
1: // bit 0.6 HIGH - drive starts new task
sSTW1 := sSTW1 OR 16#0040; // set bit 6
IF oInMotion THEN
sState := 2;
END_IF;
2: // motion active - release bit 0.6 immediately
sSTW1 := sSTW1 AND (NOT 16#0040); // clear bit 6
IF NOT iNewTarget THEN
sState := 0;
END_IF;
END_CASE;
END_IF;
sTrigPrev := iNewTarget;
// Fault latch
IF oFaulted THEN
sSTW1 := 16#0080; // only fault reset bit
END_IF;
// Pack telegram 105 into sSendBuf
sSendBuf[0] := LO(WORD_TO_BYTE(sSTW1));
sSendBuf[1] := HI(WORD_TO_BYTE(sSTW1));
sSendBuf[2] := LO(WORD_TO_BYTE(sSTW2));
sSendBuf[3] := HI(WORD_TO_BYTE(sSTW2));
sSendBuf[4] := BYTE(sTarPos);
sSendBuf[5] := BYTE(SHR(DWORD_TO_DINT(sTarPos),8));
sSendBuf[6] := BYTE(SHR(DWORD_TO_DINT(sTarPos),16));
sSendBuf[7] := BYTE(SHR(DWORD_TO_DINT(sTarPos),24));
sSendBuf[8] := LO(WORD_TO_BYTE(sVel));
sSendBuf[9] := HI(WORD_TO_BYTE(sVel));
sSendBuf[10] := LO(WORD_TO_BYTE(sAccDec));
sSendBuf[11] := HI(WORD_TO_BYTE(sAccDec));
// Write to drive via SFC15
// CALL SFC15 (LADDR := 256, RECORD := sSendBuf, RET_VAL := iRetVal);
END_FUNCTION_BLOCK
Verification Procedure
- Configure the trace in
SimoComUto record at 4 ms sample rate: actual position, actual velocity, control word 1 (STW1), status word 1 (ZSW1). - Start an MDI move from 190 degrees to 200 degrees at 2000 degrees/s with P0140 = 0 (baseline exact stop). Confirm a V-shaped velocity trough at the moment of trigger - this validates the trace setup.
- Change P0140 to 2, repeat the move. Confirm continuous velocity across the trigger event with no zero-crossing.
- Run a 359 degrees to 200 degrees absolute move across the modulo boundary. Confirm the drive selects the 161 degrees positive direction, not the 199 degrees negative direction.
- Verify ZSW1 bit 0.11 (referenced) = 1 before the on-the-fly test.
- Run the cycle 100 times. Confirm no F-class faults in the diagnostic buffer.
Diagnostic Buffer Entries to Watch
| Fault code | Meaning | Action |
|---|---|---|
| F021 | Setpoint step too large for block-change "continue without ramp" | Increase P0100/P0101 or use P0140 = 2 |
| F022 | Referencing not complete during absolute move | Run referencing sequence |
| F033 | Axis not enabled (OFF2/OFF3 active) | Check STW1 bits 1, 2 |
| F041 | Telegram configuration mismatch | Match STEP 7 HW Config to P0875 |
| F100 | Following error exceeded window | Increase P0321 or reduce acceleration |
Troubleshooting Matrix
| Symptom | Likely cause | First check | Fix |
|---|---|---|---|
| Velocity goes to zero between MDI tasks | Block-change condition = exact stop | Read P0140 | P0140 = 2 |
| Drive faults F022 at startup | Reference not set | Read ZSW1 bit 0.11 | Run referencing |
| Move direction reversed at 359 to 200 deg | Modulo handling wrong | Read P0170/P0171 | P0170 = 1, P0171 = 360000 |
| Position setpoint ignored after new trigger | Bit 0.6 toggled too fast | PLC trace | Add minimum high-time of 2 PLC cycles |
| Mechanical shock at block change | P0140 = 3 (continue without ramp) | Read P0140 | P0140 = 2, verify P0100/P0101 |
| Cycle time increases 50% on the fly | Drive reverts to ramp-down on each trigger | Read P0093, P0094 | Override 100% |
Engineering Notes and Field-Proven Caveats
On-the-fly changes and absolute encoders
If the axis uses a multi-turn absolute encoder (e.g., Heidenhain EQN 1325 connected via EnDat), referencing is required only once after battery replacement. However, an absolute encoder does not by itself enable on-the-fly changes - the firmware-level block-change condition (P0140) must still be set to "continue."
Velocity scaling for rotary axes
For a rotary axis with P0171 = 360000 LU/revolution, the MDI velocity is set in LU/s. Convert from RPM with:
v_LU_per_s = (RPM / 60) * 360000
For 2000 deg/s = 333.33 rpm = 200000 LU/s. The N2 scaling against reference speed P0200 (default 3000 rpm = 1800000 LU/s) yields N2 = 200000 / 1800000 x 16384 ~ 1819.
Acceleration ramp timing
The acceleration ramp P0100 is specified in ms for 0 to rated velocity. For a rotary axis rated at 3000 rpm and an MDI velocity of 2000 deg/s:
- Actual ramp time = P0100 x (2000 / 18000) ms (if 3000 rpm = 18000 deg/s)
- For 500 ms desired ramp at 2000 deg/s: P0100 = 500 x 18000 / 2000 = 4500 ms
Multi-block changes at high frequency
If the PLC must issue a new MDI task every 5-10 ms (registration correction), the PROFIBUS cycle time must be <= 4 ms. Set DP cycle in HW Config to 3 ms and ensure no other slaves share the bus segment.
Differences from SINUMERIK 840D
611U with positioning module does not interpret G-code. The equivalent of G60 (exact stop at block end) is P0140 = 0. The equivalent of G64 (continuous-path mode) is P0140 = 2. The equivalent of G64 with tolerance is P0140 = 3 plus P0321 (positioning window) for tolerance.
Related Parameters Quick Reference
| Parameter | Function | Typical value |
|---|---|---|
| P0093 | MDI acceleration override | 100 % |
| P0094 | MDI deceleration override | 100 % |
| P0100 | Acceleration ramp time (0 to rated) | 1000-4500 ms |
| P0101 | Deceleration ramp time | 1000-4500 ms |
| P0140 | Block change condition | 2 (continue, on-the-fly) |
| P0160 | Reference point coordinate (LU) | 0 |
| P0170 | Axis type | 1 (rotary) |
| P0171 | Modulo range (LU) | 360000 |
| P0200 | Reference speed for normalization | 3000 rpm (default) |
| P0321 | Positioning window (LU) | 100 (0.1 deg) |
| P0875 | Telegram selection | 105 |
Why does the drive decelerate to zero between two MDI tasks even though I just toggle bit 0.6?
The 611U positioning module defaults to exact-stop block change (P0140 = 0). Each new traversing task requires the previous one to reach its target before the next one starts, which produces a full deceleration to zero. Set P0140 = 2 ("continue with ramp") to enable on-the-fly transitions.
What is the difference between P0160 = 0 and "referencing complete"?
P0160 only stores the coordinate value that will be assigned to the reference point (default 0). It does not perform the referencing motion. The referencing sequence must be executed separately - search for the cam, latch to the encoder zero marker, then write the actual position to P0160. Until this completes, ZSW1 bit 0.11 = 0 and absolute MDI moves will fault F022.
Can I write Word 4 and Word 5 of the Siemens telegram as the new target position?
Yes, but only when the telegram selected on the drive (P0875) matches the telegram selected in STEP 7 HW Config. Telegram 105 places the 32-bit MDI target position in PZD3 (high word) and PZD4 (low word), and the MDI velocity in PZD5. After writing, toggle control word 1 bit 0.6 with a 0 to 1 rising edge of at least one PROFIBUS cycle.
What is the equivalent of SINUMERIK G60 and G64 on a 611U positioning module?
P0140 = 0 is equivalent to G60 (exact stop at block end). P0140 = 2 is equivalent to G64 (continuous-path mode, on-the-fly with ramp). P0140 = 3 is G64 with a hard velocity step - use only for small corrections where velocity continuity is not required.
Why does a 359 to 200 degree move take the long way around?
The drive is treating the move as a relative move (mode 0x30) and computing the delta from the live position. With mode 0x30, the drive does not apply modulo reduction. Switch to MDI absolute mode (STW2 = 16#0010) and confirm P0170 = 1 (rotary axis), P0171 = 360000 LU/rev. The drive will then automatically select the shortest 161 degree positive direction.