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 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:
- 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.
- 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.
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.
- In the TIA Portal project tree, expand Technology objects > TO_PositioningAxis > Configuration > Encoder.
- Open the Data exchange subsection (or the Encoder sub-node, depending on TIA Portal version).
- Set Increments per revolution = 2500.
- Set Fine resolution (bits) = 1.
- Compile the project and download to the CPU.
- 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.
- Add a new technology object: Add new object > Motion Control > Positioning axis (TO_PositioningAxis).
- Select the Drive connection: choose the V90 PN device from the PROFINET topology and assign telegram 3 (Standard telegram 3, PZD-5/9).
- 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
- In Configuration > Position monitoring, leave default tolerances; commissioning is easier with a permissive limit (e.g. 10 mm / 720° default) and tightened later.
- 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.
- 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).
- Set the axis to Enable and bring it to a known reference position (mechanical end stop or a mark on the load).
- Record the current
Positionvalue, e.g. 0.000 mm. - Jog the motor exactly one mechanical revolution (or a controlled MC_MoveRelative of Load distance per motor revolution).
- Read
Positionagain. 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.