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:
- Wrong MB_UNIT background DB parameter block (wrong partner IP, port 502, or wrong connection ID).
- MB_CLIENT triggered too early (before connection state = established) or with REQ never re-triggered after DONE.
- Byte-swap or word-swap error when mapping Honeywell 32-bit floating-point registers (IEEE 754) into S7 REAL tags.
- 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).
- Firewall on the Honeywell side closing port 502 / wrong unit ID when the Honeywell server expects a non-zero Unit Identifier.
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).
Root Cause Analysis Workflow
- 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).
- Check the SF / BF LED state on the head module. SF lit + BF dark = internal/configuration issue. BF lit = link or partner not reachable.
-
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). -
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. - 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
- Install the Open Modbus/TCP library from the install medium or from the Siemens Online Software Delivery portal.
- Open SIMATIC Automation License Manager; drag and drop the license key to the IM 151-8 PN/DP node.
- 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
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).
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
- Open the online MB_CLIENT instance DB and confirm BUSY = 1 (transaction in progress) and DONE pulses each cycle.
- Confirm ERROR = 0 and STATUS = 0x0000 0000 after each DONE pulse.
- Verify in the watch table that DATA_PTR (e.g. DB100.DBW0..DB100.DBW14) updates each cycle to fresh values from the Honeywell server.
- 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.
- 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.