S7-1200 V90 Axis Position Error: Setting Fine Resolution

David Krause12 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 Overview

When commissioning a SINAMICS V90 servo drive with a SIMATIC S7-1200 CPU (for example, CPU 1214C DC/DC/DC, 6ES7214-1AG40-0XB0) using a TO_PositioningAxis technology object, the axis can be jogged in both directions and can execute MC_MoveAbsolute / MC_MoveRelative commands without faults. However, the position feedback reported by the technology object does not match the actual mechanical travel.

Typical symptom reported in the field:

  • Commanded movement (mechanical): 10 mm of linear travel
  • Reported value at TO_PositioningAxis.Position (or the "Position" tag in the technology object data block): 0.127 mm
  • Position does not change when the values of Steps per revolution or Load distance per motor revolution are modified in the axis configuration

The motion itself is mechanically correct; the reported feedback value is scaled incorrectly. The discrepancy originates inside the encoder configuration of the technology object, specifically in the Fine resolution parameter that is distinct from Increments per revolution.

Affected environment: S7-1200 CPU (firmware V4.2 and later, with TIA Portal V15 or higher for Motion Control V6.0), SINAMICS V90 PN with PROFINET telegram 3, incremental encoder variant (2500 S/R, 13-bit fine resolution), TO_PositioningAxis configured in the standard Positioning axis mode.

Affected System Configuration

The configuration that triggers this symptom is well-defined. Verify the system matches the table below before applying the fix.

Component Value / Catalog Number
CPU SIMATIC S7-1200 CPU 1214C DC/DC/DC, 6ES7214-1AG40-0XB0 (or 1215C / 1217C with FW ≥ V4.2)
TIA Portal V15 or higher (Motion Control V6.0 or later)
Drive SINAMICS V90 PN, e.g. 6SL3210-5FB10-4UA0
Encoder Incremental encoder TTL, 2500 S/R (13 bits) - V90 incremental variant
Standard telegram Telegram 3 (positioning mode, 32-bit position actual value G1_XIST1)
Technology object TO_PositioningAxis (Motion Control)
Communication PROFINET IRT, drive assigned via PROFINET device name, no shared device

Reference: Overview of technology objects and versions - TIA Portal V20 and the S7-1200 Motion Control V6.0 function manual.

Encoder Resolution Theory

The V90 incremental encoder reports two separate physical quantities that TIA Portal must combine correctly:

  1. Increments per revolution (mechanical): The number of analog sine/cosine periods the encoder emits per motor shaft revolution. For the V90 incremental variant this is 2500 S/R (sine/cosine per revolution). After the drive's internal interpolation, this is presented to PROFINET as a digital count per revolution.
  2. Fine resolution (electronic): The number of additional bits used to subdivide each analog period. For the V90 incremental encoder this is 13 bits, i.e. 213 = 8192 subdivisions per analog period.

The total feedback resolution per motor revolution that the drive exposes on the bus is therefore:

Total increments / rev = Increments_per_revolution × 2Fine_resolution

For 2500 S/R with 13-bit fine resolution:

2500 × 213 = 2500 × 8192 = 20,480,000 increments / rev

The technology object in TIA Portal splits this total into two independent configuration fields so the same encoder can be reused at different mechanical resolutions. Mis-setting either field produces either a scaled-too-large or scaled-too-small position feedback, but the symptom is the same: the reported value no longer matches mechanical reality.

Root Cause Analysis

The reported 0.127 mm for a real 10 mm travel represents a scaling error of roughly 78.7:1 (10 / 0.127). The cause is a misinterpretation of the encoder name in the data sheet:

"Incremental Encoder TTL, 2500 S / R (13 bits)"

An integrator entering this data sheet string verbatim into the technology object encoder configuration typically types:

Field Wrong value Effect
Increments per revolution 8192 (= 213) System believes the encoder has 8192 base increments per rev
Fine resolution (bits) 13 System multiplies by 213 = 8192 again

With both fields set this way, the internal position counter is interpreted as if it had 8192 × 213 = 67,108,864 increments per revolution, and the resulting load-side position is divided by the same factor. The axis moves correctly, but the reported position is too small by a factor of 2500/8192 × 2(13−13) at the load conversion step. Adjusting Steps per revolution or Load distance per motor revolution has no effect because the bug is upstream, in the encoder interpretation, before the load gearing stage.

The correct interpretation, per the S7-1200 Motion Control V6.0 function manual:

Field Correct value Meaning
Increments per revolution 2500 Number of analog periods per motor revolution from the data sheet ("2500 S/R")
Fine resolution (bits) 1 No additional bit-level interpolation; the drive has already multiplied the analog periods by 213 internally and delivers the 20,480,000 count on the bus

Setting Fine resolution = 1 (effectively a multiplier of 2) accounts for the fact that the drive exports a 32-bit count which is already pre-interpolated; the technology object only needs to apply a minimal fine resolution to align its internal scaling.

Why 1 and not 0 or 13? The technology object requires a minimum fine resolution of 1 bit to represent the 2× quadrature edge count that the drive's encoder interface always provides. Entering 0 is rejected; entering 13 would apply the 13-bit interpolation a second time, double-interpolating an already-interpolated count and producing a position reading that is far too small (such as the 0.127 mm reported).

Solution: Correct the Fine Resolution Parameter

The fix is performed entirely in the TIA Portal project tree on the TO_PositioningAxis encoder configuration. No firmware change on the V90 is required, and no hardware swap is required.

  1. In the TIA Portal project tree, expand Technology objects > TO_PositioningAxis > Configuration > Encoder.
  2. Open the Data exchange subsection (or the Encoder sub-node, depending on TIA Portal version).
  3. Set Increments per revolution = 2500.
  4. Set Fine resolution (bits) = 1.
  5. Compile the project and download to the CPU.
  6. Power-cycle the drive or issue an MC_Reset so the technology object re-reads the encoder configuration.

For users of the new S7-1200 G2 generation, the procedure is identical but the configuration dialog is reached via the TIA Portal project documentation referenced in Technology Objects for SIMATIC S7-1200 G2. For S200 PN drives on S7-1200 G2, see also the S7-1200 G2 positioning axis configuration manual.

Step-by-Step TIA Portal Configuration

Use this procedure to build the technology object from scratch in TIA Portal V15 or V20. The screenshots and menu paths correspond to the standard S7-1200 Motion Control V6.0 dialog set.

  1. Add a new technology object: Add new object > Motion Control > Positioning axis (TO_PositioningAxis).
  2. Select the Drive connection: choose the V90 PN device from the PROFINET topology and assign telegram 3 (Standard telegram 3, PZD-5/9).
  3. In Configuration > Mechanics, set:
    • Motor type: Servo (synchronous)
    • Increments per revolution: 2500
    • Fine resolution: 1 bit
    • Load distance per motor revolution: enter the real mechanical travel of the load per motor revolution, e.g. 10 mm
    • Load direction of rotation / motor direction of rotation: set so positive MC_MoveRelative = positive load direction
  4. In Configuration > Position monitoring, leave default tolerances; commissioning is easier with a permissive limit (e.g. 10 mm / 720° default) and tightened later.
  5. In Configuration > Dynamics, enter realistic maximum velocity / acceleration / jerk for the application. Start with 100 mm/s and 1000 mm/s² to keep a low mechanical stress during commissioning.
  6. Compile, download, and go online.

V90 Drive Side Configuration

The encoder data sheet field the S7-1200 reads is delivered by the V90. The drive must therefore be configured to expose the incremental encoder count over PROFINET telegram 3. Use SINAMICS V-ASSISTANT or the V90 web server to set:

V90 parameter Value Meaning
p29003 1 Control mode: position control (IPos via telegram 3)
p0922 3 Standard telegram 3 selection (PZD-5/9)
p29020[0] application value (e.g. 10 mm) Load distance per motor revolution (mechanical)
p29021[0] application value Load revolutions per motor revolution (gear ratio)
p29023 0 / 1 Direction of rotation (invert if MC_MovePositive is mechanically negative)
p29025 encoder type = 1 Incremental encoder selected (matches 2500 S/R, 13 bits)

Note that the S7-1200 technology object parameters for Load distance per motor revolution and the V90 p29020/p29021 parameters can be used independently, but they should be set consistently to avoid confusion. If the load gearing is defined in the drive (p29020/p29021), set the technology object's Load distance per motor revolution to 1 to avoid double-scaling.

Telegram 3 Layout

Standard telegram 3 is required for position-controlled operation with the S7-1200 technology object. The setpoints from PLC to drive (PZD-5) and the actual values from drive to PLC (PZD-9) are mapped as follows:

Word Direction Signal Description
PZD1 PLC → Drive STW1 (control word 1) ON/OFF1/OFF2/OFF3, enable, ramp, jog bits
PZD2 PLC → Drive NSOLL_A (position setpoint, 32-bit) Position demand in LU (load units) for IPos
PZD3 PLC → Drive High word of NSOLL_A
PZD4 PLC → Drive STW2 (control word 2) Acknowledgement, technology selection
PZD5 PLC → Drive MOMRED / Kp adaptation Optional torque reduction
PZD6 Drive → PLC ZSW1 (status word 1) Ready, fault, status bits
PZD7 Drive → PLC G1_XIST1 (position actual, 32-bit) Position feedback from drive
PZD8 Drive → PLC High word of G1_XIST1
PZD9 Drive → PLC ZSW2 / actual values Following error / position state

The technology object reads G1_XIST1 as the raw count, applies the Increments per revolution and Fine resolution factors to convert to motor revolutions, then applies the load distance to convert to load units. If the Fine resolution is wrong, the conversion at the first stage is wrong and all downstream values are wrong.

Verification Procedure

After applying the fix, verify with these checks in online mode. The position tag is the technology object DB tag <TO_PositioningAxis>.Position (for the standard TO; on S7-1200 G2 / S200 the tag may be exposed in the IO data).

  1. Set the axis to Enable and bring it to a known reference position (mechanical end stop or a mark on the load).
  2. Record the current Position value, e.g. 0.000 mm.
  3. Jog the motor exactly one mechanical revolution (or a controlled MC_MoveRelative of Load distance per motor revolution).
  4. Read Position again. It should equal Load distance per motor revolution within 1 LU (load unit).
Test Commanded Expected Position Result
1 motor rev 10 mm 10.000 mm ± 0.001 mm OK if within tolerance
10 motor revs 100 mm 100.000 mm ± 0.001 mm OK if linear scaling
Reverse direction −10 mm −10.000 mm OK if sign matches
MC_Home with mode 0 — Position = 0.000 mm at mechanical home OK if repeatable

If the reported position is still wrong, the second-most-common cause is double-scaling between the drive's p29020/p29021 and the technology object's Load distance per motor revolution. Set the technology object's Load distance per motor revolution to 1 if the drive already does the conversion.

Common Configuration Errors

The following table maps observed field failures to the parameter to check. Use it as a diagnostic matrix after the Fine resolution fix has been applied.

Observed symptom Most likely cause Fix
Reported position ≈ 1/79 of real (e.g. 0.127 mm vs 10 mm) Fine resolution = 13, Increments per revolution = 8192 Set Increments per revolution = 2500, Fine resolution = 1
Reported position ≈ 8192× too large Increments per revolution = 20,480,000 and Fine resolution = 13 Set Increments per revolution = 2500, Fine resolution = 1
Reported position correct, but wrong direction Motor / load direction inverted Toggle Invert direction in Mechanics, or swap two motor phases
Reported position correct, but homing offset accumulates Encoder type selected as "Absolute" instead of "Incremental" Set encoder type to Incremental in TO configuration
Position follows command, but following error fault at high speed Positioning monitoring tolerance too tight Increase Following error tolerance in Position monitoring, or raise Kv in V90
Jog works, MC_MoveAbsolute returns no error but axis does not move Software limit switches not configured, default 0/-0 blocks travel Set SW limit positive/negative to ±load range
Axis enables, then immediately drops with F19102 / F7452 Encoder wiring or telegram mismatch Verify telegram 3 selected on drive (p0922 = 3) and same number on TIA Portal device configuration

Diagnostic Tags on the Technology Object

The following tags in the TO DB are useful to confirm a correct scaling. Watch them in the TIA Portal Watch table or in HMI:

Tag Data type Meaning
<TO>.Position LREAL Current actual position in load units
<TO>.Velocity LREAL Current actual velocity in load units / s
<TO>.StatusWord DWORD Axis status bit field; bit 1 = homed
<TO>.ErrorWord DWORD Error bit field; bit 0 = SW limit, bit 1 = HW limit, bit 7 = following error
<TO>.Actor.Drive.Encoder.IncrementsPerRevolution DINT Configured increments per motor rev (debug visible in online/offline compare)
<TO>.Sensor[1].Interface.Encoder.FineResolution UINT Configured fine resolution in bits

FAQ

What is the correct Fine Resolution value for a V90 incremental encoder on an S7-1200?

For the V90 incremental variant (2500 S/R, 13-bit fine interpolation), set Increments per revolution = 2500 and Fine resolution (bits) = 1. The drive has already pre-interpolated the 13-bit resolution into the 32-bit G1_XIST1 count, so the technology object should not apply the 13-bit factor again.

Why does 0.127 mm appear when I move 10 mm on a V90 + S7-1200?

That ratio (10 / 0.127 ≈ 78.7) is the symptom of Fine resolution being set to 13 while the encoder was entered as 2500 S/R. The technology object applies 213 = 8192 to a count that is already pre-interpolated, producing a position reading 1/8192 of the real value at the encoder stage. Setting Fine resolution = 1 corrects it.

Do I also need to change the Load distance per motor revolution?

No. The Fine resolution error is upstream of the load gearing stage. Steps per revolution (or Load distance per motor revolution) only converts motor revolutions into load units; it cannot fix a mis-scaled encoder count. After correcting the Fine resolution, the load distance value should be left at the application's mechanical truth (e.g. 10 mm per motor rev).

Does this also apply to the absolute encoder variant of the V90?

For the V90 absolute encoder (single-turn 20-bit + multi-turn 12-bit), the technology object configuration differs: the encoder type is set to Absolute, and the Increments per revolution is 1048576 (= 220) with Fine resolution = 0. The 0.127 mm symptom is specific to the incremental variant being mis-configured.

Which TIA Portal version introduced the Fine resolution parameter on the encoder node?

The Fine resolution parameter on the TO encoder was introduced with Motion Control V6.0 in TIA Portal V15. Earlier versions (V4.x / V5.x with TIA Portal V13/V14) used a single Steps per revolution field and required the user to compute the final increments count manually. The V6.0 split into Increments per revolution + Fine resolution is what enables this two-field fix.

What Telegram should I select for V90 + S7-1200 position control?

Use Standard telegram 3 (PZD-5/9). It provides the 32-bit G1_XIST1 position actual value and the NSOLL_A position setpoint needed by the S7-1200 technology object. Avoid telegram 1 (speed control) and telegram 111 (vendor-specific) unless you have a documented reason. Configure the same telegram on the V90 via p0922 = 3 and in the TIA Portal device configuration under PROFINET interface > Telegram configuration.

Back to blog