S7-1200 Temperature Scaling: NORM_X and SCALE_X Error Fix

David Krause11 min read
S7-1200SiemensTroubleshooting
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 Summary

On a Siemens SIMATIC S7-1200 CPU 1214C AC/DC/Rly (catalog 6ES7214-1BG40-0XB0), a 0–10 V temperature transmitter is field-scaled to 0–200 °C inside a cyclic OB using NORM_X and SCALE_X. The PLC computes a temperature that disagrees with a hand-held reference thermometer by approximately 10 °C, sometimes drifting further when the process load changes. The block faceplate looks correct - NORM_X between 0 and 27648, SCALE_X between 0 and 200 - so the offset must come from outside the math: the transducer/signal conditioner, the field wiring, the reference instrument, or the CPU analog front-end.

Both NORM_X and SCALE_X are documented in the TIA Portal help and in the S7-1200 system manual at the Siemens Industry Online Support portal (support.industry.siemens.com). Use this article to localize which side of the loop the error is on before re-touching software.

Why ~10 °C Maps to a 0.5 V Offset

Span math is the first sanity check. With a 0–200 °C range and a 0–10 V output, every volt is exactly 20 °C. A 10 °C reading error therefore corresponds to ~0.5 V of systematic error. That magnitude is typical of one of the following:

  • A 5 % gain drift on the signal conditioner output stage (e.g., 9.55 V at 200 °C instead of 10.00 V).
  • A live-zero transmitter rated 0.5 V to 10 V (or 1 V to 10 V) being scaled as if it were 0 V to 10 V - a cold reading is shifted up by 0.5 V ≈ 10 °C.
  • A ground-potential difference between the transducer and the CPU's 0 V analog common that injects a constant bias when load equipment switches.
  • A thermocouple input stage with the wrong TC type selected (J vs K, K vs N), which changes the mV/°C slope.

CPU 1214C Onboard Analog Input - Electrical Limits

The CPU 1214C AC/DC/Rly integrates six onboard analog inputs (AI0 through AI5) that are software-selectable for 0–10 V or 0–20 mA mode. For voltage mode the relevant limits from the S7-1200 system manual are:

Parameter Value
Rated voltage range 0 V to 10 V (single-ended)
Raw count, rated 0 to 27648
Overrange counts 27649 to 32511
Wire-break / open circuit Count ≈ 32767 (out of range)
Effective resolution ≈ 2.44 mV / count (2.44 mV ≈ 0.05 °C at 20 °C/V)
Input impedance ≥ 100 kΩ
Common-mode voltage 0 V (non-isolated, single-ended)
Integration time Configurable 50 Hz or 60 Hz rejection (TIA Portal hardware view)

The transducer signal common must be tied to the same 0 V reference as the CPU analog input common. A floating common picks up the ground-potential difference as a constant offset - exactly the symptom reported.

NORM_X and SCALE_X - Reference Behavior

TIA Portal V13 introduced the IEC-standard scaled-value pair that replaced the legacy SCALE/NORM FBs. Use them as a pair on the S7-1200:

Block Inputs Output Equation (REAL)
NORM_X VALUE (REAL), MIN, MAX OUT (REAL, 0.0 to 1.0) OUT = (VALUE − MIN) / (MAX − MIN), clipped at 0.0 / 1.0
SCALE_X VALUE (REAL, 0.0 to 1.0), MIN, MAX OUT (REAL) OUT = VALUE × (MAX − MIN) + MIN, clipped at MIN / MAX

For a 0–10 V, 0–200 °C transmitter the canonical arrangement is:

  1. Read %IW64 (CPU 1214C onboard AI channel 0) into an INT/DINT tag.
  2. Convert INT → REAL with INT_TO_REAL (or DINT_TO_REAL for the 32-bit field %ID64). Forgetting this conversion is the single most common cause of an "always zero" reading.
  3. NORM_X with MIN = 0.0, MAX = 27648.0, VALUE = the REAL raw count.
  4. SCALE_X with MIN = 0.0, MAX = 200.0, VALUE = the normalized 0.0…1.0 result.
Do not feed SCALE_X directly from an INT word, and do not call the legacy SCALE/NORM FBs (FC105/FC106) on an S7-1200. Those blocks are S7-300/400 conventions and assume a bipolar raw range of −27648…+27648. Substituting FC105 in place of SCALE_X is the second-most-common cause of an apparent offset.

Likely Root Causes Ranked by Field Frequency

Rank Cause Symptom Diagnostic
1 Signal conditioner ZERO/SPAN not trimmed Constant offset (e.g., +10 °C) over the whole range Measure output with multimeter at 0 °C and 200 °C inputs
2 Live-zero output (0.5–10 V or 1–10 V) assumed to be 0–10 V Reads ~10 °C at true 0 °C, then climbs correctly Measure output at true 0 °C reference
3 Ground-potential difference / single-ended ground loop Reading drifts when boiler/heater load switches Measure analog common vs PLC ground during operation
4 Wrong thermocouple type in conditioner (J vs K, K vs N) Slope appears too low across full span Verify TC type on device nameplate vs. signal conditioner config
5 Reference thermometer uncalibrated or different immersion depth Reads ~10 °C consistently vs. PLC, but PLC matches a third calibrated reference Compare against a third instrument or an ice-bath reference
6 Wrong AI channel or voltage/current mode configuration Reading is half, one-fifth, or one-tenth of expected Re-check device configuration in TIA Portal hardware view
7 Legacy SCALE FB (FC105) used instead of SCALE_X Reading is approximately right but biased Inspect block name in program; convert to SCALE_X
8 CPU firmware too old for NORM_X / SCALE_X Compiler error or block behaves as if MIN/MAX swapped Check TIA Portal version (≥ V13) and CPU firmware (≥ V4.0)

Diagnostic Workflow

Walk through this decision flow with the process offline (cyclic OB stopped or AI channel forced) before touching the program:

PLC reads ~10 °C high; check scaling Inject known V at AI; read %IW64 V × 2764.8 ≈ %IW64 ? CPU analog front-end fault YES NO NORM_X / SCALE_X math correct Measure transducer output at PLC Signal conditioner is faulty / live-zero Wiring / grounding fault Trim conditioner or fix wiring; re-test

Step-by-Step Verification Procedure

  1. Inject a known voltage at the AI terminal block. Stop the cyclic OB or use a watch table to monitor %IW64. Disconnect the field wiring and apply a calibrated DC source (e.g., 0.000 V, 5.000 V, 10.000 V) directly to the AI+ and M terminals.
  2. Read the raw count. Record %IW64. Apply the formula count ≈ V × 2764.8 (because 27648 counts span 10 V). 0 V should read 0 ± 3 counts, 5.000 V should read 13 824 ± 3 counts, 10.000 V should read 27 648 ± 3 counts.
  3. If raw counts match: the CPU scaling block chain is correct. The fault is in the signal conditioner output, the field wiring, or the reference thermometer.
  4. If raw counts do not match: the analog front-end is suspect. Move the wiring to a different onboard channel (AI1…AI5) and retest. If a second channel also drifts, evaluate the SM 1231 RTD/AI module as a sanity reference or replace the CPU base unit.
  5. Measure at the transducer end. With the field cable reconnected, place a multimeter across the transducer output terminals while the PLC is reading. Walk the value from 0 °C to 200 °C using the calibrator. The multimeter voltage × 2764.8 should track %IW64 within tolerance.
  6. Cross-check with a true 0 °C reference. Place the thermocouple in a melting-ice bath (or have the calibrator output 0.000 V / 0.000 mV). Confirm the PLC now reads exactly 0.0 °C. If it does, the hand-held thermometer was the uncalibrated instrument.
  7. Trim the signal conditioner. Adjust ZERO with the sensor at a real 0 °C reference (not at the trim-pot's labelled detent), then adjust SPAN at 200 °C. Repeat 2–3 times to converge. Most industrial conditioners have both trim pots accessible behind a sealed cover.
  8. Re-verify across the full span. Sweep 0, 50, 100, 150, 200 °C and confirm ±0.5 °C before handing the panel back to operations.

Hardware Wiring and Signal Conditioner Checks

A 0–10 V single-ended input requires three wiring decisions that all manifest as a constant offset when wrong:

  • Common reference. The transducer GND / 0 V terminal must connect to the CPU's analog M terminal. A floating input reads the ground-potential difference between the cabinet and the field device, which shows up as a constant bias.
  • Single-point shield ground. Earth the cable shield at one end only - typically at the cabinet entry gland, not at the field device - to break ground loops that often shift the reading 0.3–0.7 V when heavy loads switch.
  • Channel mode. On S7-1200 onboard AIs the voltage vs. current mode is software-selected in the device configuration view under "AI configuration → Inputs". A mismatch presents a 2:1 or 5:1 ratio (not a constant offset); rule this out first before returning to the offset diagnosis.

If the transducer is bipolar (±10 V) and the signal conditioner is set for that range, the 0–10 V intermediate will clip at 0 V when the process is below the mid-span. The PLC then sees 0 °C at any sub-zero temperature, masking the offset diagnosis. Verify the conditioner output range with a manual volt-meter sweep before condemning the scaling.

Software Adjustments When the Hardware Is Acceptable

If a software trim must ship before the transducer can be re-calibrated, compensate the SCALE_X limits with a linear correction. Compute it from two calibration points (T_low_meas, V_low_meas) and (T_high_meas, V_high_meas):

Tcorrected = a × Tmeasured + b

where:

a = (Thigh_real − Tlow_real) / (Thigh_meas − Tlow_meas)

b = Tlow_real − a × Tlow_meas

Implement the linear block in SCL inside the same FB that hosts NORM_X / SCALE_X. Keep a and b in a separate global DB so the HMI can re-tune them after each maintenance visit without re-compiling the program.

Firmware and Library Version Considerations

NORM_X and SCALE_X require TIA Portal V13 (released 2014) and CPU firmware V4.0 or later. If the project was migrated from an older STEP 7 Basic release, or the CPU was swapped for a V3.x spare while the project targets V4.x, the legacy SCALE FB is sometimes resurrected by the migration. Open the cyclic OB and confirm the block types:

Symptom Legacy block to look for Fix
Reading at half scale, off by 27648 when input is positive FC105 used as SCALE (assumes −27648…+27648 raw range) Replace with SCALE_X, with NORM_X upstream to convert the raw word to a normalized REAL
Compiler reports "block not found" for NORM_X Program targets an outdated library Update "Options → Global libraries" or import "Standard library → Basic → Blocks" version V13+
Output is always 0.0 even though %IW64 is non-zero INT directly fed into SCALE_X Insert INT_TO_REAL or WORD_TO_INT + WORD_TO_REAL conversion before NORM_X.VALUE

Check the installed library version in TIA Portal under "Options → Support packages…" or "Project information → History". Siemens maintains backward compatibility notes for the S7-1200 in the public release notes at support.industry.siemens.com; cross-check the firmware-version release notes for the exact NORM_X / SCALE_X availability before deploying.

Field-Proven Code Snippet

This SCL function block reads %IW64 (CPU 1214C onboard AI channel 0), normalizes it to 0.0…1.0, scales it to °C, and applies a software trim stored in a global DB so the HMI can re-tune it at runtime:

FUNCTION_BLOCK "Temp_RTD_Scale"
VAR_INPUT
  iRaw : WORD;        // bound to %IW64
END_VAR
VAR_OUTPUT
  oCelsius : REAL;
  oValid : BOOL;
END_VAR
VAR
  sNorm : REAL;
  sScale : REAL;
END_VAR
BEGIN
  IF iRaw = 0 THEN
    sScale := 0.0;
    oValid := FALSE;
  ELSE
    sNorm := NORM_X(MIN := 0.0,
                    MAX := 27648.0,
                    VALUE := WORD_TO_INT(iRaw));
    sScale := SCALE_X(MIN := 0.0,
                      MAX := 200.0,
                      VALUE := sNorm);
    oValid := TRUE;
  END_IF;

  oCelsius := "cal_gain" * sScale + "cal_offset";
END_FUNCTION_BLOCK

Bind cal_gain to 1.0 and cal_offset to 0.0 initially, then refine from a two-point ice-bath / 200 °C calibration sweep.

Verification and Acceptance Test

After correcting either the wiring, the signal conditioner, or the scaling constants, run the following acceptance test and sign off only when each step passes:

  1. Injector = 0 °C, PLC reads 0.0 ± 0.5 °C, stable for ≥ 60 s.
  2. Injector = 100 °C, PLC reads 100.0 ± 0.5 °C.
  3. Injector = 200 °C, PLC reads 200.0 ± 0.5 °C.
  4. Apply a step from 0 °C to 200 °C and confirm the PLC follows within the configured AI integration time.
  5. Repeat steps 1–3 on the spare/backup AI channel if the installation is redundant.
  6. Record the calibration coefficients (a, b, or cal_gain / cal_offset) in the maintenance log alongside the as-left %IW64 value for traceability.

FAQ

Why does my S7-1200 read ~10 °C too high with a 0–10 V temperature transducer?

The most common cause is a non-zero live-zero output from the signal conditioner (e.g., 0.5–10 V or 1–10 V) being scaled as if it were 0–10 V. Measure the transducer output with a multimeter at a known 0 °C reference and compare to the PLC's raw count using V × 2764.8; a 0.5 V bias corresponds to a 10 °C reading shift.

Can I use the legacy SCALE / NORM FB (FC105/FC106) on the CPU 1214C?

FC105 and FC106 assume a bipolar raw range of −27648…+27648 that does not match the S7-1200 onboard AI's 0–27648 unipolar range. Use the TIA Portal V13+ NORM_X / SCALE_X pair on an S7-1200 and reserve FC105/FC106 for S7-300/400 projects.

My SCALE_X output is always 0.0 even though %IW64 is changing - why?

SCALE_X and NORM_X operate on REAL values. If you feed the raw input word in directly without an INT_TO_REAL (or WORD_TO_INT → WORD_TO_REAL) conversion, the compiler either errors or the block treats the input as a corrupted real. Insert a real conversion before NORM_X.VALUE and the reading will appear.

How do I verify the analog input hardware without a calibrator?

Use a fresh 9 V battery through a precision 10 kΩ / 10 kΩ divider to present a known low-voltage source, or stack two equal-precision resistors to land close to 5 V. Inject at the AI terminal, monitor %IW64 online, and confirm that raw counts match V × 2764.8 within one least-significant bit.

What tolerance is acceptable for industrial temperature scaling?

For most process loops targeting ±1 °C accuracy, accept ±0.5 °C over the 0–200 °C span after trim. If the loop demands tighter performance, fit an RTD-input 4-wire class-A transmitter (±0.1 % of span) rather than compensate in software for an inherently 1 % device.

Back to blog