Problem Overview
Engineers deploying two autonomous machines—each built around a Siemens ET 200S CPU with its own dedicated PROFINET network—frequently need to couple the two controllers temporarily so they can exchange status, hand off product, or coordinate shared resources. Because the units are mobile, the PROFINET cable between the two CPUs is only present intermittently. The recurring engineering question is: "If I download a hardware configuration that references the partner CPU, won't the PROFINET controller raise a station failure alarm on every power-up when the partner CPU is not reachable?"
The answer is: it depends on how the connection is modeled. A direct PROFINET IO controller-to-controller relationship (where one CPU acts as a PROFINET IO device of the other) does indeed raise diagnostics, because the IO controller polls its IO devices cyclically and any absent device produces a station-fault message. A pure PN/PN coupler, an S7 connection over PROFINET, or an Open Communication (TCP/ISO-on-TCP) link does not produce that fault, because the connection is established and released programmatically through the user program rather than by the PROFINET IO system.
ET 200S CPU Variants and PROFINET Capability
The "ET 200S CPU" is the IM 151-8 PN/DP interface module with an integrated CPU, used as a distributed automation station. Variants in the ET 200S family relevant to PROFINET communication include:
| Module | Order Number (MLFB) | PROFINET Interfaces | Work Memory | Typical Use |
|---|---|---|---|---|
| IM 151-8 PN/DP | 6ES7151-8AB01-0AB0 | 1× PN (X1), 1× PN/DP combo (X2) | 128 KB code / 128 KB data | Standalone sub-CPU with PROFINET I/O controller |
| IM 151-8F PN/DP | 6ES7151-8FB01-0AB0 | 1× PN (X1), 1× PN/DP combo (X2) | 192 KB code / 256 KB data | Fail-safe distributed CPU |
| ET 200S with CPU on S7-1200 host | 6ES7151-... (ET 200S as distributed I/O) | PROFINET device on host S7-1200 PN interface | Inherits host CPU | Remote I/O for S7-1200 |
The IM 151-8 PN/DP supports the PROFINET IO controller role on its X1 port and provides standard PROFINET communication services including S7 communication, open TCP/UDP, ISO-on-TCP, and PROFINET CBA (where licensed). The X2 port can be configured for either PROFINET or PROFIBUS DP master operation.
PROFINET Communication Services Available
Siemens SIMATIC controllers expose several communication services that can ride on a PROFINET physical connection. The relevant subset for the two-CPU scenario is:
| Service | Transport | Blocks / System Resources | Connection Type Field | Best Use Case |
|---|---|---|---|---|
| S7 Communication | ISO-on-TCP (port 102) / PROFINET | PUT/GET, BSEND/BRCV, USEND/URCV, AR_SEND | 0x11 (PG) / 0x12 (OP) / 0x13 (S7) | Block-oriented data exchange with partner CPU |
| Open Communication (TCP) | TCP/IP | TCON (FB 65), TDISCON (FB 66), TSEND (FB 63), TRCV (FB 64) | 0x0B (TCP) | Free-form byte/word exchange over any IP network |
| Open Communication (ISO-on-TCP) | ISO Transport over TCP | TCON, TDISCON, TSEND, TRCV | 0x0C (ISO-on-TCP) | Connection-oriented, length-prefixed frames |
| Open Communication (UDP) | UDP/IP | TCON, TDISCON, TSEND, TRCV | 0x0D (UDP) | Broadcast/multicast, low overhead, no connect handshake |
| PROFINET IO (controller-device) | Real-time PROFINET | Hardware configuration in TIA Portal / STEP 7 | — | Cyclic I/O data exchange |
For an intermittent mobile link, S7 communication (PUT/GET or BSEND/BRCV) or Open Communication (TCON/TDISCON) is the right choice. PROFINET IO controller-to-controller would lock out the partner whenever the cable is missing, so it should not be used for this scenario.
Why the "Missing Device" Fault Happens
When a PROFINET IO controller is configured with an IO device, the controller's PROFINET stack runs a cyclic device watchdog. The default behavior in STEP 7 / TIA Portal is:
- Controller sends
AR (Application Relationship)setup request to device IP. - Device responds with its real-time slot configuration.
- Controller begins cyclic IRT/RT frame exchange on the configured send clock (typically 1 ms).
- If the controller does not receive valid responses for the configured number of failed update cycles (default 3), it raises station failure (SF) and stops updating the process image for that device.
The SF LED on the CPU, the diagnostic buffer entry "Station failure", and the system error in OB 82 / OB 86 are all consequences. Even if you suppress the OB 86 call, the I/O data simply stops updating. This is unacceptable for safety or coordination functions, and the diagnostic noise is unacceptable for commissioning.
Network Topology for the Mobile Link
The recommended topology separates the two machine networks and brings them together only through a dedicated patch cable or industrial wireless link:
Inline SVG (ASCII representation; replace with rendered SVG in production):
[Machine A ET200S CPU #1] [Machine B ET200S CPU #2]
| |
| PROFINET Subnet A | PROFINET Subnet B
| (192.168.0.0/24) | (192.168.1.0/24)
| |
| X1 PN port (IO controller) | X1 PN port (IO controller)
| |
+---- Mobile / patch cable (when docked) ----+
^
|
Plugged only when units are
physically connected
When the cable is absent, the second network interface on each CPU (or a dedicated X2 port configured for cross-machine communication) is the one that loses its neighbor. The standard PROFINET IO on subnet A or B is unaffected.
Hardware and Software Prerequisites
- Two IM 151-8 PN/DP (or compatible) CPUs with firmware ≥ V3.0 (V3.0 is the first firmware that supports the full TCON family in the ET 200S family).
- STEP 7 V5.5 + SP4 (or later) for the ET 200S CPU configuration, or TIA Portal V13 SP1 or later (V20 referenced in the official TIA Portal V20 ET 200S configuration documentation).
- Available Standard library blocks (SFB/FB for TCON, TDISCON, TSEND, TRCV) — these are in the Standard Library / Communication Blocks under "Open Communication".
- IP addresses assigned to the cross-link port on each CPU. Static addresses are strongly recommended for deterministic behavior. PROFINET DCP-based naming is acceptable if the partner's PROFINET device name is preserved in the project.
- A PROFINET cable (or industrial Ethernet cable, since the cross-link uses standard Ethernet framing) long enough to span the docked distance, or a wireless bridge pair with PROFINET-compatible behavior (note: PROFINET IO over wireless is not officially supported; open communication is).
Step-by-Step: TCON/TDISCON Implementation
The TCON family gives the application program explicit control over the connection lifecycle. This is the cleanest solution because the absence of a connection is handled in OB 1 / OB 100 logic, not by the PROFINET IO subsystem.
Step 1 — Configure the Cross-Link Port
In HW Config (STEP 7 V5.5) or the Devices & Networks editor (TIA Portal), open the IM 151-8 PN/DP properties. On the X1 port (or the second PN interface if you have a 2-port CPU), assign a fixed IP address in a separate subnet that is unique to the inter-CPU link:
CPU #1 cross-link port: 192.168.200.1 / 255.255.255.252
CPU #2 cross-link port: 192.168.200.2 / 255.255.255.252
Do not place any PROFINET IO device in this subnet. Leave it strictly as an "Ethernet" subnet for Open Communication. The PROFINET diagnostic system will not poll for IO devices on a plain Ethernet subnet.
Step 2 — Declare the Connection in the Hardware Configuration
In NetPro (STEP 7) or the Connections editor (TIA Portal), insert a new Open Communication (TCP) connection. The connection description stored in the connection DB (generated by NetPro or the Connections editor) contains the partner IP, local TSAP, and remote TSAP. For TCP, the local and remote ports are usually any free port > 1024; the TSAP concept is not used for raw TCP, but is used for ISO-on-TCP.
| Field | CPU #1 (Active) | CPU #2 (Passive) |
|---|---|---|
| Connection type | TCP (0x0B) | TCP (0x0B) |
| Local IP | 192.168.200.1 | 192.168.200.2 |
| Remote IP | 192.168.200.2 | 192.168.200.1 |
| Local port | 2000 | 2000 |
| Remote port | 2000 | 2000 |
| Active / Passive | Active (initiates connect) | Passive (listens) |
Step 3 — Add the Open Communication Blocks to the Symbol Table
From the Standard Library > Communication Blocks folder, copy the following FBs into your project (STEP 7 V5.x: copy from "Standard Library > Communication Blocks > Open Communication". TIA Portal: they ship in the system library and you instantiate them directly):
-
FB 65 TCON — Establish connection.
REQrising edge triggers connect.ID= connection ID from NetPro.CONNECT= pointer to the generated connection DB (UDT 65 for TCP).DONE/BUSY/ERRORindicate status. - FB 66 TDISCON — Terminate an established connection. Idempotent — calling on an already-disconnected connection returns ERROR=1 with STATUS=W#16#80A3 but does not crash the CPU.
- FB 63 TSEND — Send data over an established connection.
-
FB 64 TRCV — Receive data.
EN_Renables reception;RCVD_LENreports the bytes actually received (important for variable-length protocols).
Step 4 — Write the Connection Lifecycle in OB 1
The pattern below shows an SCL/FB implementation that periodically attempts to connect, monitors the link, and tears down cleanly when the partner is gone. The key insight is to call TCON in OB 100 (warm restart) and on a cyclic retry timer; call TDISCON whenever the receive watchdog expires.
// Periodic retry timer — try to (re)establish link every 2 s
IF "retry_2Hz" AND NOT "link_active" THEN
"TCON_DB".REQ := TRUE;
END_IF;
// Latch connection result
IF "TCON_DB".DONE AND NOT "TCON_DB".ERROR THEN
"link_active" := TRUE;
"link_state" := 1; // CONNECTED
END_IF;
IF "TCON_DB".ERROR THEN
"link_active" := FALSE;
"link_state" := 0; // DISCONNECTED
// Optional: log STATUS word to diagnostic DB
"diag_db".last_tcon_status := "TCON_DB".STATUS;
END_IF;
// Watchdog: if no data received for > 5 s, tear down
IF "rcv_watchdog_q" THEN
"TDISCON_DB".REQ := TRUE;
"link_active" := FALSE;
"link_state" := 0;
END_IF;
// Send / receive on healthy link
IF "link_active" THEN
IF send_trigger THEN
"TSEND_DB".REQ := TRUE;
"TSEND_DB".DATA := "payload_db";
"TSEND_DB".LEN := "payload_len";
END_IF;
"TRCV_DB".EN_R := TRUE;
END_IF;
Step 5 — Suppress the IO-Device-Fault Path (If You Do Use PROFINET IO Cross-Link)
If a project constraint forces you to expose the partner CPU as a PROFINET IO device, you must handle OB 82 (diagnostic interrupt) and OB 86 (rack failure) gracefully. Insert the following "do-nothing" OBs to prevent the CPU from going into STOP:
// OB 86 — Rack / station failure
// Place a "BE" (block end) instruction in OB 86
// Optionally: set a flag to record the failure time
// OB 82 — Diagnostic interrupt
// Same: "BE" at the start
// OB 122 — I/O access error
// Same: "BE" at the start
Even with the OBs suppressed, the input process image for the missing IO device will hold its last value, so any safety or control function that depends on it will see stale data. The TCON-based approach above is the correct engineering solution; this OB-suppression approach is a workaround, not a fix.
Step 6 — Download and Commission
- Compile the project. Resolve any "connection partner not assigned" warnings — these typically mean the IP routing between the two subnets is incomplete.
- Download to CPU #1, then to CPU #2. Do not power-cycle during download.
- Verify the cross-link port LEDs: Link (green, steady) and Activity (yellow, flashing) should both illuminate within 5 s of plugging the cable.
- From CPU #1, monitor the diagnostic buffer (Online & Diagnostics > Diagnostic Buffer) for any "Connection established" / "Connection terminated" entries that match the TCON/TDISCON calls.
- From CPU #2, do the same; the connection status must be visible in both directions.
Handling the "Cable Unplugged Mid-Session" Case
When the mobile units are undocked while a TCON connection is open, the following sequence happens inside the PROFINET stack:
- Physical link drops (Link LED goes dark on both ports).
- TCP keep-alive timer expires (default 30 s on SIMATIC, configurable). The CPU raises a connection-error event.
- FB 64 TRCV returns
RCVD_LEN = 0andSTATUS = W#16#80A1(connection terminated by remote, or by the stack due to link loss). - Your application must call
TDISCON_DB.REQ := TRUEon the next scan to clear the stack resources, then a TCON retry timer can begin a new establish attempt when the cable is reconnected.
link_active flag in Step 4.
TCON Status Word Reference
Diagnose issues by reading the STATUS output of TCON / TDISCON / TSEND / TRCV. Common values for the ET 200S CPU on PROFINET:
| STATUS (hex) | Block | Meaning | Engineering Action |
|---|---|---|---|
| 0000 | all | No error, no active job | Normal — proceed |
| 7000 | all | No job active | Normal — wait for REQ |
| 7001 | all | Job in progress (first call) | Normal — call again |
| 7002 | all | Job in progress (subsequent call) | Normal — call again |
| 80A1 | TSEND / TRCV | Connection terminated | Call TDISCON, then TCON to re-establish |
| 80A3 | TCON / TDISCON | Connection already established / already disconnected | Idempotent — log and continue |
| 80A7 | TSEND | Remote partner not yet ready (TCP RST received) | Retry with back-off timer |
| 80C3 | TCON | Remote partner unreachable (no SYN-ACK) | Verify cable / IP / partner firewall |
| 80C4 | TCON | Temporary resource shortage | Reduce active connection count |
| 80B1 | TCON | Connection ID invalid or already in use | Check connection DB in NetPro |
| 80B3 | TSEND | Data pointer / length error | Verify ANY-pointer in TSEND.DATA and LEN > 0 |
Alternative: S7 PUT/GET Communication
If the data exchange is purely a few variables (state, position, hand-off request), S7 communication may be simpler than open TCP. S7 PUT/GET rides on ISO-on-TCP (connection type 0x12) and is initiated by one side via SFB 14 / SFB 15 or the PUT / GET blocks (FB 14 / FB 15 in STEP 7 V5.x). The advantage is the S7 connection editor in NetPro handles the partner's slot and rack automatically. The disadvantage is the connection is more rigid: you cannot easily buffer a payload, and PUT/GET will not auto-retry on link loss. Apply the same lifecycle pattern: call PUT/GET only when the connection is "established".
To configure PUT/GET access rights on the partner CPU, the partner's "Permit access with PUT/GET from remote partner" option in the CPU properties > Protection > Connection mechanisms must be enabled. Without this, the S7 communication attempt returns STATUS W#16#80A1 with a partner-side rejection.
Verification Checklist
After commissioning, perform the following verification sequence on both CPUs:
| Check | Expected Result | How to Verify |
|---|---|---|
| TCON completes after cable is plugged | STATUS 0000 on DONE, link_active = TRUE within 2 s | Monitor "link_active" tag in VAT table |
| TSEND transfers a test payload | DONE = TRUE, partner receives matching bytes | Watch TRCV RCVD_LEN on partner |
| Cable removed: link drops gracefully | TRCV returns 80A1 within 30 s, link_active clears | Unplug cable; monitor STATUS word |
| Cable restored: TCON re-establishes | DONE = TRUE, link_active = TRUE within 2 s | Plug cable back in |
| No SF LED on either CPU | SF off; diagnostic buffer clean of station-failure entries | Online & Diagnostics > Diagnostic Buffer |
| CPU remains in RUN | Mode selector stays in RUN after repeated undocking | Visual check on CPU front |
| PROFINET IO on each subnet undisturbed | Local I/O continues updating throughout | Force a local input, watch process image |
Troubleshooting Matrix
| Symptom | Likely Cause | Fix |
|---|---|---|
| TCON returns 80C3 immediately | Wrong IP or subnet mismatch on partner | Verify IP, mask, default gateway. Ping partner from PG. |
| TCON returns 80A7 then 80A1 | Partner not in RUN, or partner's connection table missing the entry | Check partner CPU mode; recompile and download to partner |
| SF LED on at least one CPU | PROFINET IO relationship exists to missing device | Remove the IO-device reference; use TCON instead |
| CPU goes to STOP on undock | OB 86 missing | Insert empty OB 86 (or fix the root cause by removing IO-device relationship) |
| TSEND never completes | REQ not pulsed, or LEN = 0, or DATA pointer invalid | Verify LEN > 0, DATA points to a DB with sufficient size |
| Link works for a few minutes then drops | TCP keep-alive too aggressive, or wireless bridge drops association | Increase keep-alive time; check wireless RSSI |
| Truncated payloads | TRCV.RECVD_LEN smaller than TSEND.LEN; multi-frame protocol assumed | Implement length-prefixed framing or use BSEND/BRCV for S7 communication |
| Connection works, but data is from "yesterday" | Stale data after link loss not cleared on application side | Zero payload DB on TDISCON completion; do not trust last value |
Key Field-Proven Caveats
- When the ET 200S CPU's PROFINET port is shared between the local subnet and the cross-link, disable PROFINET IO on the cross-link port in the port properties. Otherwise the port will try to be an IO controller on the cross-link subnet, defeating the purpose of the isolated link.
- If the two CPUs sit on machines with different ground references, use an industrial Ethernet cable with built-in isolation, or insert a PROFINET switch with galvanic isolation on each side of the cross-link.
- For PROFINET IO controller-to-controller via a PN/PN coupler (6ES7158-3AD10-0XA0), the link is deterministic but the coupler itself must be powered and present. A PN/PN coupler is therefore a poor choice for a mobile link.
- Do not assign the cross-link port a PROFINET device name via DCP if you intend to use plain TCP. The DCP name lookup is irrelevant to TCP and may confuse the diagnostic tools.
- Update the IM 151-8 PN/DP firmware to at least V3.0.3 if you observe sporadic STATUS W#16#80C3 events under heavy PROFINET IO load; Siemens firmware notes for the IM 151-8 confirm the V3.0.3 release stabilized the TCP connection-establishment path.
- If you need PROFINET IO over a wireless bridge, confirm the bridge supports PROFINET IRT cut-through; a generic Wi-Fi bridge will not provide deterministic cycle times and the IO subsystem will fail on every scan.
Frequently Asked Questions
Do I need to place the partner CPU in my PROFINET IO topology if I only need to exchange data?
No. Use S7 communication (PUT/GET) or Open Communication (TCON / TDISCON) instead. Adding the partner CPU as a PROFINET IO device creates a station-failure alarm every time the cable is unplugged, which forces OB 86 handling and freezes the I/O data.
What is the difference between TCON (FB 65) and TDISCON (FB 66)?
TCON establishes a connection in the user program; it requires a generated connection description DB (UDT 65 for TCP) and a rising edge on REQ. TDISCON cleanly tears down an established connection. Both blocks are idempotent — calling them on the wrong state returns a non-zero STATUS without stopping the CPU.
How fast does the link re-establish after the cable is plugged back in?
For a TCP connection in the ET 200S CPU, TCON typically completes within one to two scan cycles after the physical link is up, provided the retry timer in the application fires at 1 Hz or faster. The TCP three-way handshake adds about 10–50 ms of latency in a local network.
Can I use PROFINET IO controller-to-controller for the mobile link?
Technically yes, but not recommended. The IO controller will raise a station failure (SF) and OB 86 every time the partner disappears, and the I/O data goes stale. Use TCON-based Open Communication for any link that is intermittent.
Which firmware is recommended for the IM 151-8 PN/DP when using TCON?
Use V3.0.3 or newer. Earlier V3.0 firmware had edge cases in the TCP state machine that surfaced as STATUS W#16#80C3 under heavy PROFINET IO load. Always check the official Siemens firmware release notes for the latest update.
Can I put a managed PROFINET switch in the middle of the mobile link?
Yes, but only use managed switches that support PROFINET LLDP forwarding and that are themselves PROFINET devices (e.g., SCALANCE XC-200). Unmanaged switches work for Open Communication but do not pass PROFINET IO cyclic frames cleanly and may cause diagnostic noise.