Resolving Siemens IM151-8 PN-DP Modbus TCP Data Exchange Failures

David Krause12 min read
ModbusSiemensTroubleshooting
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

On a Siemens ET 200S station built around the IM151-8 PN/DP interface module, an Open Modbus/TCP link to a Honeywell controller (e.g., a Honeywell HC900 or Experion C300 with embedded Modbus TCP server) reaches the TCP three-way handshake but the application never exchanges process data. No Modbus Request/Response frames are observed on Wireshark, and the input/output image area of the S7 station stays frozen even though the partner reports an active connection.

This is a configuration problem in approximately 9 of 10 cases, not a licensing problem. The TCP connection will come up without the Open Modbus/TCP license installed, but a diagnostic LED on the IM 151-8 PN/DP and entries in the diagnostic buffer are activated until the license is installed. The most common reasons an active TCP socket does not produce working Modbus transactions are:

  1. Wrong MB_UNIT background DB parameter block (wrong partner IP, port 502, or wrong connection ID).
  2. MB_CLIENT triggered too early (before connection state = established) or with REQ never re-triggered after DONE.
  3. Byte-swap or word-swap error when mapping Honeywell 32-bit floating-point registers (IEEE 754) into S7 REAL tags.
  4. Modbus function code mismatch (FC 3/4 vs FC 16) and wrong starting address (1-based Honeywell vs 0-based Modbus specification in the Siemens FB).
  5. Firewall on the Honeywell side closing port 502 / wrong unit ID when the Honeywell server expects a non-zero Unit Identifier.
Critical: An open TCP connection is necessary but not sufficient for Modbus TCP. A successful TCP SYN/SYN-ACK/ACK exchange proves only that the IP layer is reachable. The application layer (Modbus ADU) must still be polled by the client FB at the configured scan rate.

Hardware Reference: IM 151-8 PN/DP

The IM 151-8 PN/DP is the PROFINET-capable head module of the SIMATIC ET 200S distributed I/O system. It combines a PROFINET IO controller/interface, a PROFIBUS DP master (Class 1) on the lower DP port, and an integrated Ethernet port that is also used for Open Modbus/TCP communication via the S7 program.

Parameter Value
Article number (standard) 6ES7151-8AB00-0AB0
Article number (conformal coating) 6ES7151-8AB01-0AB0
Firmware range covered by library V3.x and V4.x of the IM 151-8 PN/DP (firmware must be ≥ 3.0 for Open Modbus/TCP PN/DP library ≥ V1.5)
PROFINET interface 3 × RJ45 (X1 PN, X1P1, X1P2; switch-mode)
Ethernet port for Modbus/TCP PROFINET X1 port (shared with PROFINET IO; logical separation via TCP port)
Number of Modbus/TCP connections Up to 8 simultaneous connections (library parameter CON_ID 1..8; CPU resource dependent)
Max. number of simultaneous Open Modbus/TCP partners 8 (8 different MB_UNIT DBs)
Diagnostic LED behavior without license SF (group fault) LED lit; diagnostic buffer entry 0xE0 0x12 "Modbus license missing"

Reference: SIMATIC ET 200S IM 151-8 PN/DP Interface Module Manual (entry ID 13542688).

Open Modbus/TCP Library: Article Numbers and License

Modbus/TCP is not native to the S7-300 / IM 151-8 instruction set. Siemens ships a separate "Open Modbus/TCP" library that you must install into STEP 7 (or TIA Portal where supported) and that is licensed.

Item Article Number Notes
Open Modbus/TCP library for ET 200S IM 151-8 PN/DP (as of library V1.5) 6ES7860-2AA01-0YX0 Replaces the older 6ES7860-2AA00-0YX0
Open Modbus/TCP license (single seat) 6ES7860-2AA00-2YX0 One per CPU/IM module; not per connection
Upgrade to library V1.5 (for FW ≥ 3.0) 6ES7860-2AA01-0YX1 Required for the IM 151-8 PN/DP V3.x

The license is a per-CPU/IM runtime license that is loaded via the SIMATIC Automation License Manager (ALM). It allows unlimited connections within the documented maximum (8 for the IM 151-8 PN/DP). Without the license:

  • The TCP connection is still established by the FB at runtime.
  • MB_CLIENT polls continue to be sent, but with a non-zero delay inserted by the firmware (one poll every 10 s is reduced/disabled, depending on firmware revision).
  • The SF LED on the IM 151-8 PN/DP is lit and the diagnostic buffer holds a license-related entry.

Reference: Open Modbus/TCP PN/DP Function Manual (entry ID 30828737).

Rule of thumb: If the SF LED is lit and a license-related diagnostic buffer entry is present, install/transfer the license using the Automation License Manager and re-evaluate. If the SF LED is dark and no license entry exists, the issue is configuration, not licensing.

Root Cause Analysis Workflow

  1. Read the IM 151-8 PN/DP diagnostic buffer (STEP 7 → PLC → Diagnostic Buffer). Filter on event IDs related to Modbus (E012, E013, E014 in the ET 200S firmware).
  2. Check the SF / BF LED state on the head module. SF lit + BF dark = internal/configuration issue. BF lit = link or partner not reachable.
  3. Run Wireshark on the PROFINET segment (mirror port on the managed switch) with filter tcp.port == 502. Confirm the request PDU and observe the response (or absence).
  4. Read MB_CLIENT output parameters in the instance DB: DONE, ERROR, STATUS, MB_DATA_PTR, MB_DATA_LEN. STATUS values are documented in the Open Modbus/TCP manual entry ID 30828737.
  5. Verify partner unit identifier. Honeywell servers typically expect Unit ID = 1 (or 255) - if the wrong identifier is sent, the server will discard the request silently.

Step-by-Step Configuration

Step 1 - Install and License the Open Modbus/TCP Library

  1. Install the Open Modbus/TCP library from the install medium or from the Siemens Online Software Delivery portal.
  2. Open SIMATIC Automation License Manager; drag and drop the license key to the IM 151-8 PN/DP node.
  3. Power-cycle the IM 151-8 PN/DP; verify in the diagnostic buffer that the "license missing" entry is cleared.

Step 2 - Allocate the MB_UNIT Background Data Block

The MB_UNIT DB holds the static connection parameters. Create one DB per partner (Honeywell server) with the following structure (offsets match library V1.5):

DATA_BLOCK "DB_HW_MODBUS"
  STRUCT
    CON_ID      : INT  := 1;          // Connection ID, 1..8
    IP_REMOTE   : DWORD := DW#16#0A0A0A0A; // Honeywell IP, e.g. 10.10.10.10
    IP_LOCAL    : DWORD := DW#16#0A0A0A64; // Local IM 151 IP, e.g. 10.10.10.100
    TSAP_REMOTE : WORD  := W#16#0100;       // Port 502 high byte (always 0x01), low byte 0x00 = 502
    TSAP_LOCAL  : WORD  := W#16#0100;       // Local port 502 if fixed; usually dynamic
    UNIT_ID     : BYTE  := B#16#01;         // Honeywell unit identifier; verify on partner side
    TIMEOUT     : TIME  := T#5S;            // TCP connect/response timeout
    RESERVED    : ARRAY[1..6] OF BYTE := B#16#0;
  END_STRUCT;
END_DATA_BLOCK

Step 3 - Call MB_CLIENT in OB1

CALL "MB_CLIENT" , "DB_HW_CLIENT"
  REQ          := M 10.0          // Edge-triggered request
  DISCONNECT   := FALSE
  MB_UNIT_DB   := "DB_HW_MODBUS"  // Background DB with IP/port/unit
  READ_WRITE   := 0               // 0 = read (FC 3 holding or FC 4 input)
  FUNCTION     := 3               // FC 3 = read holding registers
  DATA_ADDR    := 40001           // 1-based starting address (Honeywell convention)
  DATA_LEN     := 8               // Number of 16-bit registers to read
  DATA_PTR     := P#DB100.DBX0.0 BYTE 16 // S7 destination (8 words = 16 bytes)
  DONE         := M 20.0          // Pulse: transaction complete
  BUSY         := M 20.1
  ERROR        := M 20.2
  STATUS       := MW 22
Address translation: The Open Modbus/TCP library expects the Modbus PDU starting address (0-based). To read Honeywell register 40001, set DATA_ADDR = 0. To read 40001 in the library's "1-based" view (used by older revisions), set DATA_ADDR = 40001. Check the library revision's manual page "Address Mapping" - this is the most common commissioning error.

Step 4 - Map the Words into REAL (Float) Values

Honeywell process variables often come as IEEE 754 floats, occupying two consecutive 16-bit registers. If the byte order is high-word-first (Honeywell default for some HC900 firmware), swap the words before calling a block move into a S7 REAL tag.

// 8 registers (16 bytes) read into DB100.DBD0..DBD14
// Honeywell float is at registers 40003-40004 (DB100.DBW4..DB100.DBW7)
L  DB100.DBW 4    // high word
T  DB110.DBW 2    // high word in target
L  DB100.DBW 6    // low word
T  DB110.DBW 0    // low word in target
// DB110.DBD0 now contains the REAL value (verify in VAT)

Diagnostic Indicators and Status Codes

STATUS (hex) Meaning Corrective Action
0x0000 0000 No error, transaction complete None
0x0001 0002 TCP connect in progress Wait for DONE or ERROR
0x0001 8001 Connection not established (timeout) Verify partner IP, routing, and that Honeywell port 502 is open
0x0001 8002 Connection terminated by partner Check partner Max-Connections; check whether Honeywell CPU is in program mode (some controllers drop TCP while stopped)
0x0001 8003 Invalid parameter Verify MB_UNIT_DB and DATA_PTR alignment (byte/word boundary)
0x0001 8006 Partner returned Modbus exception 01 (illegal function) Honeywell does not support the FC you are using - try FC 3 vs FC 4
0x0001 8007 Partner returned Modbus exception 02 (illegal data address) Check DATA_ADDR and DATA_LEN against the Honeywell Modbus map
0x0001 8008 Partner returned Modbus exception 03 (illegal data value) Too many registers requested at once; reduce DATA_LEN
0x0001 8100 TCP socket layer error Reboot IM 151-8 PN/DP; check network
0x0001 8200 License error (no license present) Install/transfer license; power-cycle

Reference: Open Modbus/TCP function manual - STATUS word description.

Common Configuration Errors and Their Signatures

Symptom Likely Root Cause Action
TCP connection opens, no Modbus PDU appears in Wireshark MB_CLIENT REQ edge is missed; OB1 cycle is too long; or no call at all Cross-reference REQ trigger; check OB1 runtime
TCP opens, request sent, no response Wrong Unit Identifier; partner expects different value Test with Unit ID = 0, 1, and 255; see Honeywell manual
TCP opens, response arrives but DATA_PTR stays zero DATA_PTR points to a non-existent / read-only DB Verify DB exists, is not optimized (for classic S7), and is not in load memory
Values read but reading 4x the expected number (e.g. 40001, 40002 empty, value in 40003) Address base mismatch (0-based vs 1-based) Subtract 1 from DATA_ADDR (0-based) or align to Honeywell documentation (1-based)
Floating-point values off by 8 decades (e.g. 124.5 read as 0.001245) Byte-swap missing in 32-bit REAL conversion Apply word-swap as shown in Step 4
SF LED on, diagnostic buffer entry "Modbus license missing" No license on IM 151-8 PN/DP Transfer license via ALM; power-cycle

Honeywell-Specific Considerations

Honeywell controllers expose process data through a Modbus server with a device-specific address map. Common entry points:

  • HC900: Modbus TCP server on port 502. Holding registers at addresses 4xxxxx. The HC900 Workbench configuration determines the mapping.
  • Experion C300 / C200: Modbus TCP exposed via the ELCN/TCP gateway. Each controller has a defined "Node ID" that is used as the Modbus Unit Identifier.
  • Honeywell XYR 5000 / XYR 6000: Modbus TCP server; some firmware revisions support only FC 3 (not FC 4 or FC 16). Verify with the device-specific manual.

Reference: Honeywell HC900 Modbus Manual (Honeywell Process Solutions).

Field note: Some Honeywell controllers (notably older HC900 firmware) do not increment the transaction ID per request when the request is a broadcast (Unit ID = 0). The Siemens library increments it correctly per request, so leave the Unit ID as configured for the partner device rather than using 0.

Network Topology and Diagnostic Capture

The recommended capture setup is to mirror the switch port that the IM 151-8 PN/DP is connected to, then filter Wireshark on tcp.port == 502 and ip.addr == 10.10.10.10. A healthy exchange looks like:

Frame 1: 10.10.10.100 → 10.10.10.10 [SYN]         (TCP open)
Frame 2: 10.10.10.10  → 10.10.10.100 [SYN, ACK]
Frame 3: 10.10.10.100 → 10.10.10.10 [ACK]
Frame 4: 10.10.10.100 → 10.10.10.10 [PSH, ACK] MB Request:  FC 3, addr 0, qty 8
Frame 5: 10.10.10.10  → 10.10.10.100 [PSH, ACK] MB Response: 16 bytes of data

If Frame 4 is missing, the S7 program is not polling. If Frame 5 is missing or arrives with a Modbus exception, the partner is rejecting the request and you must correct the FC, address, or Unit ID.

Sample Project Location in STEP 7

The Open Modbus/TCP library ships with a complete sample project for the IM 151-8 PN/DP. It is installed under:

FILE → OPEN → SAMPLE → BROWSE
Folder:  ...\Siemens\Automation\S7\S7libs\ModbusTcpPN\Example

The sample project includes:

  • Two MB_UNIT DBs (one for partner 1, one for partner 2)
  • One MB_CLIENT FB instance
  • One MB_SERVER FB instance (if you also need to expose S7 data to other Modbus TCP clients)
  • A watch table (VAT) for runtime monitoring

Verification Procedure

  1. Open the online MB_CLIENT instance DB and confirm BUSY = 1 (transaction in progress) and DONE pulses each cycle.
  2. Confirm ERROR = 0 and STATUS = 0x0000 0000 after each DONE pulse.
  3. Verify in the watch table that DATA_PTR (e.g. DB100.DBW0..DB100.DBW14) updates each cycle to fresh values from the Honeywell server.
  4. Cross-check by reading the same registers from a third-party Modbus master (e.g., Modbus Poll tool) to confirm the Honeywell server is producing the values you expect.
  5. Read the IM 151-8 PN/DP diagnostic buffer. No license entry, no communication error entry, no parameter error entry. SF LED dark.

Troubleshooting Matrix

SF LED BF LED Diagnostic Buffer Wireshark Diagnosis
On Off License entry No traffic Install license via ALM
Off On Link-down / partner-unreachable No traffic Cable, switch, partner IP
Off Off No entries TCP open only, no Modbus PDU MB_CLIENT REQ not triggered
Off Off No entries Modbus request, no response Partner not responding (Unit ID / FC / address)
Off Off No entries Modbus exception 02/03 Address or length error
Off Off Parameter error No traffic MB_UNIT DB is misconfigured

FAQ

Is an Open Modbus/TCP license required for the IM 151-8 PN/DP?

Yes - Siemens requires license article 6ES7860-2AA00-2YX0 per IM module. Without the license, the TCP connection is still established and basic FBs run, but the SF LED is lit, a license diagnostic buffer entry is present, and data exchange is interrupted after a short period. Install the license and power-cycle to clear the diagnostic entry.

Why is the Modbus TCP connection opened but no data is exchanged?

The TCP open (SYN/SYN-ACK/ACK) is purely a transport-layer handshake. If no Modbus request frame is observed in Wireshark, the S7 application is not calling MB_CLIENT properly. Check the REQ edge, OB1 cycle, and that MB_UNIT_DB points to a valid background DB. If a request is sent but no response arrives, the partner is rejecting it - verify Unit Identifier, FC code, and starting address against the Honeywell Modbus map.

Does the IM 151-8 PN/DP support Modbus TCP on TIA Portal?

As of the Open Modbus/TCP library V1.5, the library is STEP 7 (Classic) oriented. For TIA Portal, the equivalent functionality is delivered through the MODBUS TCP library blocks (MB_CLIENT, MB_SERVER) included in TIA Portal V15.1 and later, but they target S7-1200/S7-1500. The IM 151-8 PN/DP remains a STEP 7 (Classic) target; commissioning is done in STEP 7 V5.5 SP4 or STEP 7 Professional V16 with the legacy library.

What is the maximum number of Modbus TCP partners on one IM 151-8 PN/DP?

Up to 8 simultaneous partners, each requiring a separate MB_UNIT background DB. The CPU cycle load scales with the number of FBs and the DATA_LEN of each transaction. Typical S7-300 CPU cycles tolerate 8 partners at 100 ms poll rate each without exceeding 50% scan time; verify with the CPU 315/317 cycle-time monitor.

How do I read Honeywell 32-bit float values correctly?

Honeywell exposes floats as two consecutive 16-bit Modbus registers in big-endian word order. The Siemens library writes them into the destination DATA_PTR in little-endian byte order. You must apply a word-swap (high word first, low word second) before interpreting the 4 bytes as an S7 REAL. Use the example conversion shown above or call the BLKMOV with byte-reversal flag in TIA Portal.

Back to blog