Overview
The Siemens MICROMASTER 440 (MM440) variable frequency drive accepts speed setpoints over PROFIBUS DP as a 16-bit normalized word. Two recurring application errors occur when commissioning this interface. First, engineers frequently confuse hexadecimal values with decimal arithmetic and end up with values such as 1334 (decimal) instead of 0x1999. Second, they assume the PROFIBUS setpoint word directly accepts an engineering-unit value such as Hz or rpm, when in fact the word carries a normalized percentage of the configured rated speed. This reference documents the PROFIdrive normalization used by MM440 (16#0000 to 16#4000 = 0 to 100 %), the conversion formula 16384 × (desired / rated), and the role of the STEP 7 NORM_X and SCALE_X blocks when the HMI presents the setpoint as Hz.
The same principles apply to the SINAMICS G110, G120, G120C, V20 and ET 200S FC frequency converters because they all implement the standard PROFIdrive application class 1 setpoint profile. The MM440 sample application downloaded from the Siemens support site uses exactly this convention, which is why the 20 Hz → 0x1999 mapping shown in the worked examples below is the canonical answer rather than the 0x0534 value that arises from naive arithmetic.
MM440 Setpoint Architecture on PROFIBUS
The MM440 talks to a SIMATIC S7 PLC over PROFIBUS DP using one of the standard PPO (Parameter Process Data Object) types defined by the PROFIdrive profile. The PZD (Process Data) area of the PPO carries two cyclic words from the PLC to the drive:
- Word 1 – STW1 (Control Word 1): bit-coded commands such as ON/OFF1, OFF2, OFF3, Enable, Fault Acknowledge, and Ramp-Generator-Enable.
- Word 2 – NSOLL_A (Speed Setpoint, A side): a 16-bit normalized speed demand.
NSOLL_A is not an absolute Hz value. It is a fraction of the drive's configured rated speed, expressed as an integer between 0 (0 %) and 16384 (100 %). Rated speed itself is the value the drive was parameterized with — typically 50 Hz for IEC 50/60 Hz mains in Europe or 60 Hz for North-American installations. The mapping is summarised below.
| NSOLL_A (hex) | NSOLL_A (decimal) | Fraction of rated speed | Equivalent Hz @ 50 Hz rated | Equivalent Hz @ 60 Hz rated |
|---|---|---|---|---|
| 16#0000 | 0 | 0 % | 0.0 Hz | 0.0 Hz |
| 16#0CCD | 3277 | 20 % | 10.0 Hz | 12.0 Hz |
| 16#199A | 6554 | 40 % | 20.0 Hz | 24.0 Hz |
| 16#2666 | 9830 | 60 % | 30.0 Hz | 36.0 Hz |
| 16#4000 | 16384 | 100 % | 50.0 Hz | 60.0 Hz |
Writing 16#4000 to NSOLL_A does not produce 16 384 Hz, nor does it produce 4000 Hz; it produces the value the drive interprets as rated speed. If you need the motor to run above nameplate speed, the upper normalization point is still 16#4000 — the rated parameter itself must be raised to 100 Hz or whatever value is desired.
Why 0x4000 and Not 4000: Hexadecimal vs Decimal Pitfalls
The most common mistake when reading MM440 sample code is treating 0x4000 as if it were a decimal value. Hexadecimal is positional: each digit represents four bits, and each place value is a power of 16 rather than a power of 10. The decimal conversion of 0x4000 is:
0x4000 = 4×16³ + 0×16² + 0×16¹ + 0×16⁰ = 4×4096 = 16384
Other useful conversions that come up during drive commissioning are:
| Hex | Binary | Decimal |
|---|---|---|
| 0x0000 | 0000 0000 0000 0000 | 0 |
| 0x1999 | 0001 1001 1001 1001 | 6553 |
| 0x199A | 0001 1001 1001 1010 | 6554 |
| 0x4000 | 0100 0000 0000 0000 | 16384 |
The decomposition of 16#4000 into bits is 0100 0000 0000 0000. There is no implicit multiplication by ten anywhere. When a user enters 1334 from an HMI they almost certainly computed 4000 × 20 / 60 and rounded, but they did it by treating the hex string 0x4000 as if it were the decimal number 4000. The arithmetic then becomes:
4000 (decimal) × 20 / 60 = 1333.33... ≈ 1334 (decimal) = 0x0536
This value is roughly 8 % of rated, not 33 % (20 / 60). The motor consequently creeps instead of reaching 20 Hz. Two corrections are needed simultaneously:
- Use 16384 in place of 4000 so the multiplication is dimensionally consistent.
- Use the actual rated speed of this drive (50, 60, 87, 100 Hz …) in the denominator.
STEP 7 NORM_X and SCALE_X Block Behaviour
In the Siemens sample application the HMI sends a REAL setpoint in Hz into the PLC. The PLC must convert that engineering value into the integer that the MM440 expects on the PZD word. There are two common constructs, one using the legacy FC105 / FC106 functions and one using the IEC 61131-3 NORM_X and SCALE_X blocks from the standard library. Both end up at the same 16#0 → 16#4000 integer range; only the intermediate type and rounding rules differ.
NORM_X (Normalization) — IEC variant
NORM_X maps a REAL input range into the REAL interval [0.0, 1.0]. When the sample shows NORM_X wired with MIN = -200 and MAX = +200, the block is operating in its bipolar configuration, equivalent to ±200 % of rated. This bipolar view is useful when an analog signal is being routed through the same code path, but it is not the conversion you want for the PROFIBUS setpoint when the HMI presents Hz. For PROFIBUS, convert the raw Hz value to a fraction of rated speed first, then use SCALE_X to write the integer on the output word.
SCALE_X (Scaling) — IEC variant
SCALE_X performs the inverse: it takes the normalized [0.0, 1.0] value and rescales it into a target range. The standard PROFIdrive mapping uses MIN = 0 and MAX = 16384 (or 27648.0 if you want IEC 61131-3 analog headroom, but 16384 must still be used as the 100 % point).
Legacy FC105 / FC106
FC105 (SCALE) accepts an INT input range — typically 0 to 27648 for unipolar and -27648 to +27648 for bipolar — and is matched by FC106 (UNSCALE) on the output. The MM440 sample uses FC105/FC106 only when the setpoint is arriving on an analog channel. For the PROFIBUS PZD setpoint, write the scaled integer directly to the output word (QW or %QW) on the cyclic I/O area. Do not reapply FC105/FC106 to the PROFIBUS word, because that would re-interpret the value against a 27648 reference instead of 16384.
Frequency-to-Setpoint Conversion Formula
The PROFIdrive profile generalises the conversion to one equation:
NSOLL_A = ROUND ( 16384 × desired_speed / rated_speed )
All three quantities are integers in the application code; the conversion is mathematical, not a string-format operation. 16384 is the fixed 100 % point; rated_speed comes from the drive parameter that defines what 100 % means (Hz, rpm or custom user unit); desired_speed is the value typed at the HMI. The result is rounded to the nearest integer because NSOLL_A is a 16-bit word with unit LSB.
Edge cases:
- 0 Hz: 16384 × 0 / rated = 0 → write 16#0000.
- Rated Hz: 16384 × rated / rated = 16384 → write 16#4000.
- Reverse direction (negative speed): many MM440 applications enable bipolar operation by writing negative values to NSOLL_A; the same formula is used with the appropriate sign.
-
Fractional results: round to the nearest integer. The LSB is worth approximately
rated / 16384Hz, so for a 50 Hz drive this is roughly 3 mHz — well below any mechanical resolution. -
Clipping: the driver code MUST clamp the result to
[0, 16384](or the bipolar range) before the word is written. Out-of-range values can latch fault F0090 or be interpreted as drive commands depending on firmware.
Worked Examples at Common Rated Frequencies
The same formula applies regardless of the rated-frequency parameter. The table below is the field reference for the three most common mains systems and covers the 20 Hz target that started this discussion. Use it as a quick lookup until the conversion becomes second nature.
| Desired speed (Hz) | Rated = 50 Hz setpoint (dec) | Rated = 50 Hz hex | Rated = 60 Hz setpoint (dec) | Rated = 60 Hz hex | Rated = 87 Hz setpoint (dec) | Rated = 87 Hz hex |
|---|---|---|---|---|---|---|
| 0 | 0 | 0x0000 | 0 | 0x0000 | 0 | 0x0000 |
| 10 | 3277 | 0x0CCD | 2731 | 0x0AAB | 1883 | 0x075B |
| 20 | 6554 | 0x199A | 5461 | 0x1555 | 3766 | 0x0EB6 |
| 25 | 8192 | 0x2000 | 6827 | 0x1AAB | 4708 | 0x1264 |
| 30 | 9830 | 0x2666 | 8192 | 0x2000 | 5650 | 0x1612 |
| 40 | 13107 | 0x3333 | 10923 | 0x2AAB | 7533 | 0x1D6D |
| 50 | 16384 | 0x4000 | 13653 | 0x3555 | 9416 | 0x24C8 |
| 60 | — | — | 16384 | 0x4000 | 11299 | 0x2C23 |
| 87 | — | — | — | — | 16384 | 0x4000 |
| 100 | — | — | — | — | — | (requires raising rated) |
0x4000 as if it were the decimal number 4000 while using 60 Hz rated. The correct value of 5461 (decimal) = 0x1555 at 60 Hz rated is the value the drive will accept as 20 Hz.
HMI Engineering Workflow
The end-user typically does not need to know that 16#199A means anything; they type 20 into a numeric field and expect 20 Hz. The PLC hides the conversion in three STEP 7 blocks. The reference ladder below is the same structure as the Siemens MM440 sample application and is portable to TIA Portal with no source change.
- HMI tag DB100.DBD0 (REAL, units Hz). Bound to a WinCC / TIA Panel input field with one decimal place.
- RATIO block divides the HMI value by the configured rated speed stored in DB100.DBD4 (REAL). Output REAL 0.0 to 1.0 range represents the fraction of rated speed. Insert saturation to enforce [0.0, 1.0].
- SCALE_X block maps [0.0, 1.0] → [0.0, 16384.0] at the REAL level; the result is then converted to INT and latched to the cyclic output word assigned to NSOLL_A in the PPO.
STEP 7 sample code on the engineering workstation typically draws NORM_X with the bipolar ±200 inputs because the example has to be reusable for analog as well as PROFIBUS control. When you fork that example, replace the bipolar MIN/MAX with the unipolar 0.0 / 1.0 configuration described above; do not start the scaling at -200 because that assumption breaks for any HMI value below zero.
Best practice for HMI ergonomics: scale the field 0.0 to 100.0 % across the input box and convert to Hz inside the PLC against the drive-rated parameter. This way the same DB and panel layout works for any motor — 50, 60 or 87 Hz — without rewriting the screen.
Drive-Side Parameter Configuration
Although the bulk of this reference is concerned with the PLC side, two drive parameters must agree with the scaling above, otherwise the setpoint word produces the wrong output frequency. The MM440 stores these in its parameter set (P0xxx or P1xxx prefix depending on firmware generation). Refer to the Siemens Industry Online Support portal for the firmware-specific manual for the exact parameter numbers.
- Rated motor frequency (P0300 / motor data): defines what 100 % rated speed means to the drive's V/Hz or vector control loop. This is the value used as the denominator in the conversion formula. If the parameter is 50 Hz and the setpoint word holds 16#4000, the drive outputs 50 Hz at its terminals.
- Setpoint source (control word source / NSOLL_A source): the MM440 must be told to take its speed reference from the PROFIBUS PZD word, not from an analog input, fixed setpoint or keypad entry. The wrong source is the second most common reason a new PROFIBUS application produces no movement.
Verification Procedure
Before loading the project to the plant, the following checks verify that the setpoint mapping is correct. Each step is intended to be run in sequence on the commissioning laptop with the PLC in stop, then with the drive enabled but the motor uncoupled.
-
Online → Monitor & Force the NSOLL_A word on the S7. Type the value
16384(decimal) or16#4000directly into the variable table and observe the drive display or STARTER trace — it should report 50 Hz (or whatever rated speed is configured) immediately on the next bus cycle. - Force a 50 % value by entering 8192 (decimal) or 16#2000 into the same word. The drive should report 25 Hz on a 50 Hz rated system and 30 Hz on a 60 Hz rated system.
- From the HMI, enter 20.0 in the Hz field. Use the VAT monitor to confirm the value written to NSOLL_A is 16#199A (6554 dec) for a 50 Hz rated drive or 16#1555 (5461 dec) for a 60 Hz rated drive. Anything else means the scaling math is wrong in the PLC.
- Trace the actual speed via the drive feedback word (NIST_A) and verify it matches the requested setpoint. The PROFIdrive profile reports actual speed in the same 16#0 – 16#4000 format, so the loop is symmetrical.
- Ramp test: linearly ramp the HMI value from 0 to rated in 5 s. Watch the drive's actual Hz ramp in STARTER. There must be no step or saturation; any flat top means the SCALE_X output has hit its clamp.
Troubleshooting Matrix
| Observed symptom | Most likely cause | Verification | Corrective action |
|---|---|---|---|
| Motor runs only at ~8 % of rated when HMI = 20 Hz on a 60 Hz drive | Setpoint calculation mixed hex and decimal: 4000 × 20 / 60 = 1334 (dec) | Inspect NSOLL_A in the VAT — should be 5461 dec on a 60 Hz rated drive | Rewrite the scaling block to use 16384 × 20 / 60 |
| Motor runs at 200 % of rated when HMI = 50 Hz | Setpoint is 32767 (word all ones) because the wrong output is selected | Check which PZD word NSOLL_A is bound to in HW Config | Re-map the second PZD word in the slave configuration to the speed setpoint, not the control word |
| Motor does not run, drive shows F0090 or no command | Control word (STW1) is not toggling the ON bit; drive is in OFF1 state | Watch STW1 (PZD word 1) — bit 0 must be 1 | Add the cyclic logic that sets bit 0 in STW1 and the On/Off1 sequencing per PROFIdrive state machine |
| Motor reverses unexpectedly when HMI value is increased | Negative sign leaking into NSOLL_A, or motor leads are reversed | Read NSOLL_A in monitor; if negative, trace the SCALE_X input | Clamp the saturated value to [0, 16384] for unipolar applications; if clamped value is correct then swap motor leads |
| Setpoint steps from 16#0000 to 16#4000 at the lowest HMI digit | SCALE_X input is going negative through the bipolar configuration | Inspect the input to NORM_X — if MIN/MAX are -200/+200 then the function ramps from -200 to +200 | Change NORM_X MIN = 0.0, MAX = rated_Hz_unipolar for the PROFIBUS code path |
| Drive accepts setpoint but actual speed reads zero on the trace | Ramp-up ramp time is configured to zero, or output stage is open | Use STARTER / Drive ES trace with NSOLL_A and NIST_A overlaid | Check ramp parameters and enable signals; verify encoder-less operation supports the chosen motor control mode |
| PLC reports DP slave diagnostic interrupt "Configuration error" | PPO type mismatch between S7 hardware config and MM440 firmware | Cross-check PPO type field in Step 7 HW Config and on the MM440 | Set both ends to a matching PPO type — typically PPO type 1 (4 PKW + 2 PZD) for MM440 |
| HMI shows Hz but motor speed reads RPM | Display word (NIST_A) interpreted as rpm instead of Hz by the HMI script | Compute NIST_A % × rated speed, compare with drive display | Convert NIST_A in the HMI script with the same 16384 × (actual / rated) formula |
Adjacent Profile Notes: PROFIsafe, Param Channel and PKW
Beyond NSOLL_A and STW1, the MM440 PPO contains the PKW (Parameter Channel) words, which allow the PLC to read/write individual drive parameters (e.g., fault memory, ramp times, motor identification results). The PKW contains a parameter number, an index and a value field. PKW arithmetic is entirely decimal and uses parameter numbers, not NSOLL_A — it is therefore a common source of confusion when engineers mix PKW traffic with the PZD scaling discussed above. The PKW data is irrelevant for the runtime speed setpoint and is normally only used during commissioning.
PROFIsafe applications such as STO via PROFIBUS add a second cyclic word carrying the safety telegram. STO must be wired before NSOLL_A in the PZD — that is, on a lower-offset word — and must be reset via the PROFIsafe host before motion is possible. Refer to the Siemens Functional Safety manuals and the PROFIdrive V4.2 specification for the exact word layout per safety class.
Frequently Asked Questions
Why does 20 Hz not become 0x0534 or 1334 hex on a 50 Hz MM440?
Because 0x4000 hex equals 16384 decimal, not 4000 decimal. The correct setpoint for 20 Hz on a 50 Hz rated drive is 0x199A = 6554 decimal, computed as 16384 × 20 / 50. Multiplying 4000 (dec) by 20 / 60 yields an incorrect 1334 (decimal), which the drive interprets as about 8 % of rated speed, not 20 Hz. Use 16384 in the formula and the rated speed of the drive you actually have.
Do I have to use NORM_X with -200 / +200 inputs?
No. The ±200 range is only correct when the upstream value is bipolar (for example an analog -10 V to +10 V signal expressed in percent). For a PROFIBUS HMI that sends a unipolar Hz setpoint you must use NORM_X with MIN = 0.0 and MAX = rated_Hz, or — preferably — scale the field 0–100 % and apply SCALE_X from 0.0 to 16384.0, then write directly to the PZD output word.
What formula should I write in STEP 7 to convert an HMI Hz tag to a 16#0–16#4000 word?
Use NSOLL := REAL_TO_INT( HMI_Hz / Rated_Hz × 16384.0 ), then clamp the result to LIMIT( 0, NSOLL, 16384 ). The same expression written with NORM_X + SCALE_X is preferred because it preserves the engineering range readably. Both produce the integer that the drive interprets as a fraction of rated speed.
Does the value 16384 (decimal) automatically become 16#4000 when written to the output word?
Yes. 16384 decimal and 0x4000 hex are the same 16-bit pattern (0100 0000 0000 0000). There is no conversion step performed by the PLC, the PROFINET / PROFIBUS stack or the drive; what matters is that you enter the number in the correct notation at design time. Use a hexadecimal literal such as W#16#4000 or the integer literal 16384 — both put the same bits on the wire.
Can I send 100 Hz on a drive whose rated speed is 50 Hz by writing 16#8000?
No. 16#4000 is the maximum the PROFIdrive setpoint word accepts; values above it are clipped or flagged as invalid by the drive. To command a frequency above rated speed you must first raise the drive's rated-speed parameter to the new maximum (for example 100 Hz) and then write 16#4000 to command that new rated value. Halving the rated and doubling the setpoint will produce a non-linear response and is not supported.
Is the same scaling used by SINAMICS G120, V20 and SIMOVERT Masterdrives?
Yes. All Siemens drives that implement the PROFIdrive application class 1 profile normalise NSOLL_A to 0 – 100 % over 16#0000 – 16#4000 = 0 – 16384 decimal. The actual frequency produced at 100 % is whatever the drive is configured for as rated speed. This makes code portable between MM440, SINAMICS G110/G120/G120C/G130, SIMOVERT and SIMATIC ET 200S FC without rewriting the PLC scaling logic.
My motor runs forward when I write 16#4000 but reverses at 16#0000 — what is happening?
Either the motor leads are phased against the encoder direction or the speed setpoint is not being clamped at zero in the SCALE_X output. After 16#0000 (true 0 Hz) the drive should hold zero. Investigate the SCALE_X lower bound and the sign of the integer division; if it is allowed to go slightly negative (below zero) some firmware versions interpret it as a reverse command. Clamp the final integer with LIMIT(MN, NSOLL, MX) where MN = 0 and MX = 16384.