Problem Overview
Integrating Endress+Hauser Picomag DMA magnetic-inductive flow meters into a Siemens S7-1200 1214C via the SM 1278 4-port IO-Link master (Siemens part number 6ES7 278-4BD32-0XB0) is a documented task, but field practice reveals three recurring failure modes that prevent correct acquisition of flow, temperature, and conductivity process variables:
- The IO-Link read request returns identical process data on every cycle, even when the connected Picomag display is showing dynamic measurements.
- The ISDU index typed from the Picomag documentation produces either a fault code from the IO-Link master or, worse, silently returns identification (Dataset 0) content instead of the intended process variable.
- The conductivity process variable is non-changing across all four ports even though the on-device HMI shows different conductivity values.
All three failures share a single root-cause family: the engineer is treating Index, Subindex, Dataset, and ISDU interchangeably and is converting between hexadecimal and decimal incorrectly when porting parameter addresses from the Picomag manual to the TIA Portal call interface of FB500001 "IOILINK_DEVICE". This article resolves each failure with a deterministic procedure and a verification recipe.
- Endress+Hauser Picomag DMA IO-Link Operating Manual (AutomationDirect mirror)
- Endress+Hauser SD03368SEN Special Documentation - IO-Link Devices for SIMATIC S7
- Siemens S7-1200 Programmable Controller System Manual (entry ID 109751826)
- Siemens "IO-Link Devices" library for STEP 7 / TIA Portal (FB500001 documentation)
System Architecture
The reference installation topology is a star-wired IO-Link network with one SM 1278 4-port master and four Picomag DMA flow meters.
| Component | Part / Order Number | Role |
|---|---|---|
| S7-1200 CPU | 6ES7 214-1AG40-0XB0 (CPU 1214C DC/DC/DC, FW 4.4) | IO-Link master controller |
| SM 1278 IO-Link master | 6ES7 278-4BD32-0XB0 (4-port, FW ≥ V2.0) | IO-Link master, port-power 200 mA/port |
| Flow meter | Endress+Hauser Picomag DMA (DN15-DN50 variants) | Magnetic-inductive flow, temperature, conductivity |
| Function block | FB500001 "IOILINK_DEVICE" from Siemens IO-Link Devices library | ISDU read/write service handler |
| Configuration tool | S7-PCT (Port Configuration Tool) V3.5+ / TIA V15+ integrated PCT | Port parameter assignment and IODD import |
Each Picomag DMA port consumes up to 120 bits of cyclic process data and supports 32-byte string transfer on the acyclic ISDU channel. With four ports the SM 1278 master is well within its 4-port × 32-byte acyclic buffer specification, but the legacy S7-PCT user interface limits visible process data mapping to 32 bytes per port in the dropdown selector — a UI constraint, not a hardware constraint.
IO-Link Communication Principles on S7-1200
IO-Link distinguishes two parallel data paths that must not be confused:
- Cyclic process data (PD) — 32 bits of input per Picomag port, refreshed on every IO-Link cycle (Picomas cycle ≈ 2.3 ms at COM3). Read directly into the PLC process-image via the SM 1278 input addresses.
- Acyclic service data (ISDU) — Indexed parameter access over the same single wire, used for parameterization and read of non-cyclic measured values such as totalizer counters, raw conductivity, and device identification.
The TIA Portal block FB500001 "IOILINK_DEVICE" from the Siemens "IO-Link Devices" library wraps the IOL_CALL / IOL_CALL_EXT primitives of the SM 1278 firmware. Each FB call consumes one IO-Link acyclic slot and must be re-armed (rising edge on REQ) for the next service. The block writes the request to the master at REQ = TRUE and latches completion at DONE / ERROR.
| FB500001 Input | Type | Description |
|---|---|---|
REQ |
BOOL | Rising edge triggers an ISDU read or write |
PORT |
BYTE / INT | IO-Link port number 1..4 on the SM 1278 |
IOL_INDEX |
WORD / INT | ISDU index, decimal-encoded |
IOL_SUBINDEX |
BYTE / INT | ISDU subindex, decimal-encoded |
WRITE_DATA |
VARIANT | Source buffer for write service |
READ_DATA |
VARIANT | Destination buffer for read service |
LEN |
BYTE | Byte length for variable-length access |
MODE |
BYTE | 0 = read, 1 = write, 2 = read subindex only |
The IOL_INDEX and IOL_SUBINDEX inputs are always interpreted as decimal integers by the FB. This is the source of the most common Picomag integration bug.
Root Cause: Hex-to-Decimal Index Conversion
The Picomag DMA IO-Link manual lists parameter addresses as Index (hex) and Subindex (hex). The E&H documentation displays these in standard 16-bit hexadecimal notation such as 0x0164, 0x0100, 0x0150, etc. When the values are transcribed into TIA Portal, two distinct error patterns occur:
- The decimal value of the hex digits is typed instead of the decimal value of the 16-bit word. Example: typing
164instead of356for0x0164. - The Picomag manual has at least one historical typo in the index column. A documented
0x0164reference has been mis-rendered as decimal365in some PDF print streams; the correct decimal equivalent of0x0164is 356.
Consequence: the FB transmits IOL_INDEX = 0164 (hex), which on the wire is the ISDU index for a different parameter — most commonly Device Access Locks or Vendor Name — both of which are static strings. The PLC therefore reads the same content on every cycle, which is the exact symptom reported.
| Picomag Parameter | Manual Index (hex) | Decimal IOL_INDEX value | Subindex (hex → dec) | Length (bytes) |
|---|---|---|---|---|
| Volume flow, current | 0x0100 |
256 | 0x01 → 1 | 4 (REAL) |
| Temperature, current | 0x0102 |
258 | 0x01 → 1 | 4 (REAL) |
| Conductivity, current | 0x0104 |
260 | 0x01 → 1 | 4 (REAL) |
| Totalizer 1 | 0x0150 |
336 | 0x01 → 1 | 8 (LREAL) |
| Totalizer 2 | 0x0151 |
337 | 0x01 → 1 | 8 (LREAL) |
| Totalizer 3 | 0x0152 |
338 | 0x01 → 1 | 8 (LREAL) |
| Process data configuration | 0x0164 |
356 (not 164, not 365) | 0x01 → 1 | 1 (BYTE) |
| Vendor Name | 0x0010 |
16 | 0x00 → 0 | ≤32 string |
| Vendor ID | 0x0011 |
17 | 0x00 → 0 | 2 (WORD) |
| Device ID | 0x0012 |
18 | 0x00 → 0 | 3 |
0x and interpret the remaining digits as decimal.
Why "Same Data Every Cycle" Appears
If IOL_INDEX is set to the wrong decimal value, one of three downstream symptoms is observed at the PLC:
-
Symptom A — Static identification string: the read buffer contains the ASCII text "Endress+Hauser" or a similar vendor string. This confirms that the master is reading Vendor Name (
IOL_INDEX= 16) on every cycle because the requested index is being interpreted as 16 (or because the wrong index happens to map onto a read-only static parameter). - Symptom B — Dataset 0 identification data: the read buffer contains a binary structure with Vendor ID in bytes 7-8 and Device ID in bytes 9-11. This corresponds to the IO-Link "Direct Parameter Page 0" / Dataset 0 readout.
-
Symptom C — Zero-length read with no error: the FB returns
DONE= TRUE,BUSY= FALSE,ERROR= FALSE, but the buffer is unchanged. This occurs when the requested index is reserved by the device.
The 4-second polling cadence in the original implementation is correct in principle — IO-Link acyclic services take 5-25 ms and a 4 s cycle provides ample headroom — but the cadence cannot compensate for a wrong index. The data path must be fixed at the parameter layer first.
Dataset 0 Identification Structure
Dataset 0 (Direct Parameter Page 0, DPP0) is the standard IO-Link device self-description returned on first contact or via the legacy read of IOL_INDEX = 0 with IOL_SUBINDEX = 0. On the Picomag DMA, the structure is:
| Byte Offset | Length | Field | Picomag DMA Value |
|---|---|---|---|
| 0-5 | 6 | Master cycle time, vendor text header | 0x00 0x00 "E+H" |
| 6 | 1 | Reserved | 0x00 |
| 7-8 | 2 | Vendor ID (little-endian) | 0x10 0x00 → 16 (Endress+Hauser) |
| 9-11 | 3 | Device ID | 0x01 0x01 0x01 (DMA15 family) |
| 12-15 | 4 | Function / variant tags | device-dependent |
| 16+ | varies | Application-specific tag (DPP0+1) | 0x00 |
Vendor ID 0x0010 = 16 decimal identifies the device family as Endress+Hauser. Device ID is the per-variant identifier. Confirm both values in the PLC online buffer before proceeding to process variable reads; this is a free-of-charge diagnostic that proves IO-Link wiring and master indexing are healthy.
Root Cause of the Non-Changing Conductivity
When flow and temperature update correctly but conductivity does not change across four meters, the most common root cause is not an IO-Link failure — it is a Picomag application-level setting. Conductivity requires the Picomag to be configured for "Conductivity measurement ON" in the application menu, and the medium must have sufficient ionic content (typically > 20 µS/cm). If conductivity is disabled in the Picomag menu, ISDU read of IOL_INDEX = 260 returns the last valid value or 0 indefinitely regardless of medium changes.
A secondary root cause is index reuse: the Picomag firmware exposes conductivity at index 0x0104 only when the meter variant has the conductivity option enabled. Some DN15/DN25 variants shipped without conductivity hardware return IOL_INDEX = 260 as a reserved slot. Check the device order code — the conductivity option is the fourth digit of the Picomag ordering code ("C" = conductivity enabled).
| Conductivity Symptom | Likely Root Cause | Corrective Action |
|---|---|---|
| Same raw value on all 4 ports, displays differ | Conductivity disabled in Picomag application menu | Enable on meter HMI: Menu → Application → Conductivity → ON |
| 0.0 on all ports, display shows real value | Variant does not support conductivity | Reorder meter with conductivity option; index 260 reserved |
| Stable non-zero value, display moves | IOL_INDEX wrong (e.g., 164 instead of 260) | Re-enter IOL_INDEX as decimal 260 |
| Value updates 1-2 s after display | Cyclic process data lag, acyclic polling too slow | Poll < 1 s or move conductivity to cyclic PD configuration |
Configuration Procedure (Step-by-Step)
Prerequisites
- TIA Portal V15.1 or later with S7-1200 HSP for the SM 1278 master (6ES7 278-4BD32-0XB0).
- Latest Picomag DMA IODD file from the E+H IODDfinder portal.
- Siemens "IO-Link Devices" library V1.x or later providing
FB500001. - SM 1278 firmware ≥ V2.0 (verify in TIA device properties → Module information → Firmware).
Procedure
-
Import the IODD into the SM 1278 port configuration. Open Devices & Networks → SM 1278 → Properties → IO-Link → Port n → IODD → Browse → Picomag DMA IODD. Selecting the IODD pre-populates port parameters with the correct Vendor ID
0x0010and Device ID. - Enable IO-Link on each port. Select "IO-Link" as the port mode. Leave cycle time at the default (Picomas-compatible, COM3, 2.3 ms).
- Configure cyclic process data for the variables that must update every cycle (typically volume flow). Drag the desired PD variables from the IODD tree into the process-image input table. The TIA address range is auto-assigned per port.
-
Use FB500001 for acyclic reads of variables that do not need to be cyclic (temperature, conductivity, totalizers, identification). Insert the FB once per logical ISDU channel. Example for volume flow on port 1 (use cyclic PD instead of FB for flow if < 1 s update is required):
// Instance DB: "IDB_Picomag_Port1_Flow" // IOL_INDEX = 256 // 0x0100 - Volume flow current // IOL_SUBIDX = 1 // 0x01 // MODE = 0 // Read // LEN = 4 // 4 bytes (REAL) // READ_DATA := P#DB200.DBX0.0 REAL // "Picomag1_FlowReal" // PORT := 1 -
Trigger FB500001 on a 4-second timer with a 200 ms inter-port stagger to avoid master-side queue contention. Use the
REQrising-edge discipline:REQ:=T_PortX.ET >= T#3.5sAND NOTBUSY. - Verify with PCT online view. Right-click the SM 1278 → "Go online" → "Show PLC addresses". The PCT reveals the byte-exact hex buffer that the master returns for each ISDU index. Compare the buffer content to the expected ASCII / REAL / string layout.
- Build the cross-reference table for your application using the conversion discipline described above. Save it to a project documentation DB so the next integrator does not re-discover the typo.
Verification Recipe
After re-typing the indices, validate the fix with the following three checks in order:
-
Identification read test. Read
IOL_INDEX= 17 (Vendor ID) on each port. Expect bytes 0-1 =0x10 0x00. If this fails, the wiring or master port power is the problem, not the index table. -
Static parameter test. Read
IOL_INDEX= 16 (Vendor Name) on each port. Expect the 8-character ASCII string "Endress+Hauser" in the read buffer (right-padded with 0x00). This validates the acyclic channel end-to-end. -
Dynamic parameter test. Read
IOL_INDEX= 256 (Volume Flow), 258 (Temperature), 260 (Conductivity), and confirm each value changes when the medium is varied. Use the watch table in TIA with "Monitor all" on the destination DB. With a 4 s cycle and 4 ports staggered 200 ms, a fresh value must appear within 5 s of a process change.
PCT Tool 32-Byte Limitation — Workaround
The legacy S7-PCT UI truncates the port configuration pane at 32 bytes of process data per port. With Picomag DMA's full process data layout (flow, temperature, conductivity, totalizers, status), the visible pane will not list all variables. Two workarounds:
- Use the TIA-integrated Port Configuration Tool (TIA V15+), which exposes the full IODD-defined PD structure with no 32-byte ceiling.
- Skip PCT entirely for process variable access and use FB500001 directly in the user program. PCT is only needed for port commissioning and online diagnostics.
The 32-byte figure is a UI buffer limit in the standalone PCT, not a limit of the SM 1278 master. The master supports up to 32 bytes of input and 32 bytes of output process data per port per the IO-Link v1.1 specification, and the Picomag never approaches either limit in normal use.
Fault Code Reference for FB500001
When ERROR = TRUE, the FB populates STATUS with one of the following. These are the standard SM 1278 IO-Link service status codes from the Siemens "IO-Link Devices" library documentation:
| STATUS (hex) | Meaning | Likely Cause in Picomag Context |
|---|---|---|
0x0000 |
No error | — |
0x8001 |
Master not reachable | PROFINET / backplane fault; check SM 1278 diagnostics |
0x8011 |
Port not configured as IO-Link | Port mode left as DI/DO; switch to IO-Link |
0x8012 |
Device not connected | Wiring, port power, cable length > 20 m |
0x8014 |
ISDU index not supported | Index wrong; verify against Picomag IODD/Manual |
0x8015 |
Subindex not supported | Subindex wrong; most Picomag params use Subindex = 1 |
0x8016 |
Service temporarily unavailable | Device busy (e.g., during parameter commit); retry with backoff |
0x8017 |
Read/write length mismatch | LEN input does not match parameter size in IODD |
0x8031 |
Application error in device | Conductivity option disabled, or device in fault state |
0x8040 |
Invalid parameter at FB input | PORT out of range, MODE out of range |
A status of 0x8014 in particular is the FB's loud version of the "index is wrong" failure — when this appears, double-check the hex-to-decimal conversion against the table above.
Recommended Cyclic vs Acyclic Allocation
Use the following split to minimize FB500001 polling load while preserving update rates:
| Variable | Path | Update Rate | Reasoning |
|---|---|---|---|
| Volume flow | Cyclic PD | ~2.3 ms (COM3) | Primary control variable, needs real-time update |
| Temperature | Cyclic PD or FB acyclic | 1-4 s | Slow-changing; acyclic acceptable |
| Conductivity | FB acyclic | 4 s | Diagnostics only; no control dependency |
| Totalizers (1, 2, 3) | FB acyclic | 10-60 s | Batched totals; high-rate not needed |
| Device ID / Vendor ID | FB acyclic at startup only | Once | Identification only |
Placing volume flow on cyclic PD eliminates one of the four FB500001 instances per port and reduces the per-port polling traffic from 25 acyclic cycles per second to 4 — leaving ample headroom for the three remaining acyclic slots.
Field-Proven Caveats
- Cable length: IO-Link standard cable (3-wire, shielded) is rated 20 m at COM3. The Picomag DMA ships with a 5 m M12-to-M12 cable; longer runs require the E+H remote-mounting cable variants or a vendor-approved extension. Exceeding 20 m is a frequent cause of intermittent identification reads with no errors.
- Port power: SM 1278 provides 200 mA per port. The Picomag DMA draws 150 mA peak during in-process parameterization, so a 4-port population is electrically safe but leaves no headroom for accessory lighting or external displays on the same port.
- Index 365 typo: the conversion 0x0164 → decimal is 356, not 365. If a colleague's project has 365 typed in, the next person to clone the DB will inherit the bug. Document the canonical IOL_INDEX values in the project PLC tag table with comments.
-
Function-block library version: FB500001 has had at least three minor revisions. Use the library version that ships with TIA V16 or later for the corrected STATUS code mapping; older versions rolled
0x8014and0x8015into a single generic "Index/Subindex invalid" code. -
Dataset confusion: "Dataset 0" in legacy IO-Link literature and the Picomag documentation refers to DPP0 (Direct Parameter Page 0). It is not the same as
IOL_INDEX= 0 in FB500001 input semantics — DPP0 is a master-side read at startup, whileIOL_INDEX= 0 in the FB is the standard "all parameters" ISDU call which most IO-Link devices reject.
Inline Reference: ISDU Index to Process Variable Cross-Reference
Paste this cross-reference into the PLC data block comments for each Picomag port to prevent regression:
// Picomag DMA ISDU index map (per E+H manual KA01531D/06)
// All decimal values MUST be derived from the hex column; do not type the hex digits.
//
// 0x0010 (16) - Vendor Name STRING
// 0x0011 (17) - Vendor ID WORD
// 0x0012 (18) - Device ID 3 bytes
// 0x0018 (24) - Product Name STRING
// 0x0100 (256) - Volume flow REAL
// 0x0102 (258) - Temperature REAL
// 0x0104 (260) - Conductivity REAL (only if option enabled)
// 0x0150 (336) - Totalizer 1 LREAL
// 0x0151 (337) - Totalizer 2 LREAL
// 0x0152 (338) - Totalizer 3 LREAL
// 0x0164 (356) - Process data config BYTE <-- 356, NOT 164, NOT 365
Frequently Asked Questions
Why does my S7-1200 IO-Link read return "Endress+Hauser" as the value every 4 seconds?
The most likely cause is that the IOL_INDEX input of FB500001 "IOILINK_DEVICE" is being interpreted as the Vendor Name index (16 / 0x0010) by the master because the typed decimal value happens to alias to a read-only identification slot. Verify the index against the hex value in the Picomag manual using Windows Calculator in Programmer mode and re-enter the decimal equivalent.
What is the correct decimal IOL_INDEX for Picomag Process Data Configuration?
The Picomag manual lists 0x0164 in hex. The correct decimal value to enter in TIA Portal is 356. Values of 164 or 365 are both wrong and will read back unrelated static identification data. Always convert the full 16-bit hex word to decimal, never strip the 0x prefix.
Does S7-PCT support all 120 bits of cyclic process data from four Picomag ports?
Yes, the SM 1278 master supports the full process data size. The 32-byte limit applies only to the standalone S7-PCT UI pane, not to the master hardware. Use the TIA-integrated Port Configuration Tool, or skip PCT for process variables and access them via FB500001 acyclic reads.
Why is the conductivity value not changing on all four Picomag meters even though the display shows different values?
Three possibilities in priority order: (1) conductivity is disabled in the Picomag application menu on one or more meters, (2) the meter variant does not have the conductivity hardware option (check the order code, 4th digit "C" = conductivity enabled), (3) IOL_INDEX is wrong (260 / 0x0104) so the FB is reading a reserved or unrelated slot.
What STATUS code does FB500001 return when the ISDU index is wrong?
Status 0x8014 indicates "ISDU index not supported" and status 0x8015 indicates "ISDU subindex not supported". If the index is silently read back as a different parameter (e.g., Vendor Name), no error is raised — instead the read completes with DONE = TRUE and a static string in the buffer. Always cross-check the buffer content against the expected parameter on the first commissioning pass.