S7-1200 PLC-to-PLC I/O Exchange Over PROFINET: PUT/GET vs IO Device
Exchanging discrete input and output states between two identical SIMATIC S7-1200 1212C DC/DC/DC controllers over PROFINET is a routine application in panel-to-panel and line-to-line architectures. This reference covers both the PUT/GET S7 communication path and the PROFINET IO Device path, then shows how to extend the same model to a LOGO! 8 smart relay acting as a third node. The goal is to keep the on-CPU program logic identical to a single-CPU design while the network takes care of mirroring physical inputs to remote outputs (and vice versa) with deterministic timing.
1. Overview of PLC-to-PLC I/O Architectures on S7-1200
The S7-1200 family acts as a PROFINET IO Controller by default. Starting with firmware V4.0, an S7-1200 CPU can also be configured as a PROFINET IO Device, which is the basis for two common PLC-to-PLC patterns:
-
PUT/GET S7 Communication – Both CPUs remain IO Controllers. They exchange data through the Siemens S7 protocol on top of TCP/IP. The TIA Portal block pair
PUTandGETreads/writes a data area on the partner CPU. - IO Controller / IO Device with virtual slots – One CPU keeps the controller role; the other CPU is configured as an IO Device and exposes its process image as submodules. The controller CPU sees the partner I/O as if it were a distributed ET 200 station.
For the 1212C DC/DC/DC (article number 6ES7212-1AE40-0XB0 and earlier 6ES7212-1AE31-0XB0 / 6ES7212-1AE34-0XB0 releases), both methods are supported. Choose PUT/GET when the project is small, asymmetric, and benefits from tag-level access; choose the IO Device method when reaction time, deterministic update, and cyclic I/O semantics are priorities.
2. Prerequisites
| Item | Requirement |
|---|---|
| CPU hardware | Two identical SIMATIC S7-1200 1212C DC/DC/DC, firmware V4.2 or later (recommended V4.5 or V4.6) |
| Ethernet | Industrial switch (e.g., SCALANCE XC-100) or direct crossover/cable. Both CPUs have a single PROFINET port (X1 P1) |
| Engineering | TIA Portal V17 / V18 / V19 / V20 with STEP 7 Basic |
| IP plan | CPU_A: 192.168.0.10, CPU_B: 192.168.0.11, Subnet 255.255.255.0, no router |
| Device configuration | Both CPUs configured as IO Controller (default) for PUT/GET; CPU_B reconfigured as IO Device for the second method |
| Access rights | "Permit access with PUT/GET communication from remote partner" enabled on the partner CPU's protection properties |
0x8084.
3. Method 1 — PUT/GET S7 Communication
The PUT instruction writes data from this CPU to a partner CPU. The GET instruction reads data from the partner CPU into this CPU. Both blocks trigger an asynchronous job that is reported through DONE, ERROR, and STATUS outputs.
3.1 PUT/GET Block Interface
| Parameter | Declaration | Type | Description |
|---|---|---|---|
REQ |
Input | BOOL | Rising edge starts the transfer |
ID |
Input | WORD | Connection identifier (matches the configured S7 connection) |
ADDR_1 |
Input | VARIANT | Pointer to source area on local CPU (PUT) or partner CPU (GET) |
ADDR_2 |
Input | VARIANT | Optional second area (mixed-area transfers) |
ADDR_3 |
Input | VARIANT | Optional third area |
ADDR_4 |
Input | VARIANT | Optional fourth area |
RD_1 / SD_1
|
InOut | VARIANT | Pointer to receive (GET) / send (PUT) area on local CPU |
DONE |
Output | BOOL | TRUE for one cycle on successful completion |
ERROR |
Output | BOOL | TRUE if an error occurred |
STATUS |
Output | WORD | Error / status code; 0x0000 = no error |
3.2 Configuration Steps in TIA Portal
- Open the project that contains both PLC_A and PLC_B devices.
- Select Devices & Networks > Networks view > Connections and add a new S7 connection between PLC_A and PLC_B.
- On the connection properties, set the partner's IP address (e.g., 192.168.0.11) and the local ID (e.g., W#16#0001).
- On PLC_B's properties, open Protection & Security > Connection mechanisms and tick Permit access with PUT/GET communication from remote partner.
- Download hardware configuration to both CPUs.
- In PLC_A's Main [OB1], insert a
PUTinstance. The instance DB is created automatically.
3.3 Example: PLC_A writes to PLC_B outputs
// PLC_A: tag %MW100 = 8 bytes of mirrored outputs going to PLC_B
// Triggered every 50 ms by a cyclic interrupt OB
"PUT_DB".REQ := "Clock_50ms"; // BOOL, rising edge
"PUT_DB".ID := W#16#0001; // matches S7 connection ID
"PUT_DB".ADDR_1 := P#M100.0 BYTE 8; // partner CPU source pointer (remote M area)
"PUT_DB".SD_1 := P#M200.0 BYTE 8; // local send area
IF "PUT_DB".DONE THEN
"PUT_Done_Cnt" := "PUT_Done_Cnt" + 1;
END_IF;
IF "PUT_DB".ERROR THEN
"LastPutStatus" := "PUT_DB".STATUS; // capture 0x80xx codes
END_IF;
3.4 Example: PLC_A reads PLC_B inputs
// PLC_A: receive 8 bytes from PLC_B and place into local %M300
"GET_DB".REQ := "Clock_50ms";
"GET_DB".ID := W#16#0001;
"GET_DB".ADDR_1 := P#M400.0 BYTE 8; // partner CPU source pointer (remote M area)
"GET_DB".RD_1 := P#M300.0 BYTE 8; // local receive area
3.5 Common PUT/GET STATUS Codes
| STATUS | Meaning | Remedy |
|---|---|---|
0x0000 |
Job completed without error | — |
0x7000 |
Job active, no request in progress | Normal idle state |
0x7001 |
Request accepted, transfer running | Wait for DONE |
0x8084 |
PUT/GET not permitted on partner | Enable the protection checkbox on partner CPU |
0x80A1 |
Connection / resource error | Check connection ID, number of S7 connections, partner reachable |
0x80B0 |
Pointer access error | Validate ADDR_x / RD_x / SD_x variants; byte count must be ≥1 |
0x80C3 |
Temporary resource shortage | Reduce call rate or number of overlapping jobs |
0x80D0 / 0x80D1 / 0x80D2 |
Address/area/range error on partner | Verify partner pointer does not cross an area boundary |
4. Method 2 — PROFINET IO Controller / IO Device with Virtual Slots
This method makes CPU_B look like a distributed I/O station. The benefit is that CPU_A reads and writes to standard I/O addresses (e.g., %I0.0 – %I7.7, %Q0.0 – %Q7.7) just as it would for an ET 200SP. The latency is deterministic and bounded by the configured send clock, not by user program scan time.
4.1 Hardware View Configuration
- Open Devices & Networks and add the second S7-1200 as a real device (do not start from the catalog stub). It must be the same article number so the device view matches.
- Right-click the PROFINET interface X1 of CPU_B and choose Properties > General > PROFINET interface > Operating mode. Tick IO Device and clear IO Controller.
- In the same dialog, add a new transfer area under Transfer areas for the partner:
- Type: DI (inputs to controller) and/or DQ (outputs from controller)
- Length: 1, 2, 4, 8, or 16 bytes per slot
-
Address: the local I/O address on CPU_A (e.g.,
I 0..7)
- Assign CPU_A as the IO Controller for CPU_B by dragging the PROFINET cable from CPU_A.X1 to CPU_B.X1. TIA Portal automatically allocates the device name (default
io-device-1). - Assign the PROFINET device name to CPU_B through the Online > Accessible devices > Assign PROFINET device name function. The MAC address on the CPU front panel matches the assignment.
4.2 Address Mapping Table
| CPU_B slot | Direction | Length | CPU_A address | CPU_B address | Use |
|---|---|---|---|---|---|
| 0 | DI | 1 byte | IB0 | QB0 (transmitted) | CPU_B virtual inputs ← CPU_A virtual outputs |
| 1 | DQ | 1 byte | QB0 | IB0 (received) | CPU_B outputs ← CPU_A outputs |
| 2 | DI | 2 bytes | IW2 | QW2 (transmitted) | 8 inputs → mirrored status |
| 3 | DQ | 2 bytes | QW4 | IW4 (received) | 8 outputs ← remote command |
4.3 CPU_B Program Pattern
CPU_B needs a simple copy program. The on-CPU process image still contains the local physical terminals; the partner's words must be copied into a separate memory area to avoid aliasing between the controller-side view and the local physical I/O view.
// CPU_B is configured as IO Device of CPU_A
// "I_Image" is the process input image of the CPU (e.g., %IB0)
// "Q_Image" is the process output image (e.g., %QB0)
// Mirror physical inputs into the DI slot that CPU_A reads
%QB0 := "I_Image".Input_Byte_0; // sent to CPU_A.IB0
// Apply the DQ slot received from CPU_A to physical outputs
"Q_Image".Output_Byte_0 := %IB0; // %IB0 is CPU_B's view of CPU_A's slot 1
4.4 Send Clock and Watchdog
| Parameter | Typical value (S7-1200) | Effect |
|---|---|---|
| Send clock | 1 ms (fastest for 1212C) | Update period of cyclic I/O |
| Watchdog time | 3 × send clock (e.g., 3 ms) | Maximum tolerated update miss before partner goes to fail-safe |
| Reduction ratio | 1, 2, 4, 8, 16, 32, 64, 128, 256 | Number of send clocks per I/O update |
| Number of IO Devices per IO Controller | 16 max (CPU 1212C) | Hardware limit; check if other PROFINET nodes exist |
5. Method 3 — Bridging an S7-1200 with a LOGO! 8
The same two patterns extend to a LOGO! 8BM (e.g., 6ED1052-1MD08-0BA0) as the partner. Two options exist:
- LOGO! 8 as S7 server: Use PUT/GET from the S7-1200. LOGO! 8 firmware 8.0 and later exposes a fixed set of variable areas (V areas, I/Q markers) over the S7 protocol. Up to 8 S7 connections are allowed on LOGO! 8.
- LOGO! 8 as PROFINET IO Device: Configure the LOGO! as an IO Device of the S7-1200 IO Controller. The LOGO! automatically exposes its onboard DI/DQ as input and output submodules. No user code is required on the LOGO! beyond standard ladder logic.
5.1 LOGO! 8 Variable Mapping (S7 Server)
| LOGO! area | Siemens S7 address | Size | Direction |
|---|---|---|---|
| VB 0 … VB 850 | DB 1, byte 0 … 850 | 851 bytes | Read/Write |
| Inputs (I) | DB 1, byte 1024+ | 24 bytes | Read only |
| Outputs (Q) | DB 1, byte 1024+ | 20 bytes | Read only |
| Flags (M) | DB 1, byte 1100+ | 64 bytes | Read/Write |
| Analog inputs (AI) | DB 1, byte 1200+ | 8 words | Read only |
5.2 Example: S7-1200 PUT to LOGO! 8
// Send 4 bytes of command data from S7-1200 to LOGO! 8 VB0..VB3
"PUT_LOGO".REQ := "Send_Cmd";
"PUT_LOGO".ID := W#16#0002; // separate S7 connection to LOGO!
"PUT_LOGO".ADDR_1 := P#DB1.DBX0.0 BYTE 4; // LOGO! VB0..VB3
"PUT_LOGO".SD_1 := P#M500.0 BYTE 4; // local command area
The S7-1200 side keeps its own program untouched; the LOGO! simply appears as a small data table. The deterministic latency of PROFINET IO Device mode is generally faster than the S7-server approach on the LOGO!, but the S7-server approach requires no GSD import and works for asymmetric, multi-byte exchanges that exceed the LOGO!'s native I/O count.
6. Method Comparison
| Criterion | PUT/GET | PROFINET IO Device |
|---|---|---|
| Update model | Asynchronous, triggered by program edge or interrupt | Cyclic, deterministic, configured send clock |
| Typical latency | 1 – 4 × OB1 scan time (50 – 200 ms typical) | 1 – 2 × send clock (1 – 10 ms typical) |
| Address space on partner | Any S7 area (M, DB, I, Q) with pointer | Process image only (I/Q), fixed size per slot |
| Required firmware on 1212C | V1.0 or later | V4.0 or later |
| Programming complexity | Add PUT/GET blocks; manage REQ edges | Almost none; just compile and download |
| Configuration complexity | Low — one S7 connection | Medium — transfer areas, device name assignment |
| Watchdog handling | Handled in user code via STATUS | Automatic — partner slot fails to substitute value if configured |
| Connection resources | 1 S7 connection per partner direction pair | 1 PROFINET AR (Application Relationship) per IO Device |
| Maximum data per call / slot | PUT: up to 462 bytes; GET: up to 462 bytes | Up to 16 bytes per input/output slot, 256 slots max |
| Side-effect on partner program | None — just data exchange | Requires explicit copy in partner to avoid aliasing |
| Suitable with LOGO! 8 | Yes, S7 server on LOGO! 8 | Yes, LOGO! is a native PROFINET device |
7. Verification & Diagnostics
7.1 Online Watch Tables
Create one watch table per CPU. Add the mirrored tags and force (or monitor) the following diagnostics:
-
Local inputs:
%I0.0…%I1.7 -
Local outputs:
%Q0.0…%Q1.7 -
Mirrored M area:
%MW200…%MW214 -
Connection status:
PUT_DB.STATUS,GET_DB.STATUS
7.2 LED Diagnostics
| LED | State | Meaning |
|---|---|---|
| LK (link) | ON, green | Physical Ethernet link up |
| RX/TX | Blinking yellow | Live PROFINET traffic |
| MAINT | Blinking yellow | Maintenance demanded — open online diagnostics for slot detail |
| ERROR / SF | Solid red | Connection or configuration fault |
| BF (Bus fault) | Flashing red | PROFINET device name mismatch or partner missing |
7.3 PROFINET Diagnostics in TIA Portal
- Right-click the IO Device in the project tree → Online & diagnostics.
- Open PROFINET diagnostics > Port statistics — check discarded frames and CRC errors.
- Open Diagnostics buffer on both CPUs. Look for entries with ID
0x01E2(connection established),0x01E3(connection terminated),0x013C(IO Device failure),0x015B(substitute value active).
8. Troubleshooting Matrix
| Symptom | Likely cause | Resolution |
|---|---|---|
| PUT/GET STATUS = 0x8084 | Access protection enabled on partner | Tick Permit access with PUT/GET on partner CPU properties |
| BF LED flashing, partner not found | PROFINET device name not assigned | Use Assign PROFINET device name with the correct MAC |
| IO Device shows "No connection to controller" | Controller and device on different subnets or VLAN | Verify IP, subnet mask, no router between |
| IO Device keeps going to substitute values | Send clock too fast for total IO data | Increase send clock or reduce number of slots |
| Data updates stutter / one scan late | PUT/GET called once per OB1 only | Trigger from a cyclic interrupt OB at the desired rate |
| GET returns all zeros | Wrong ADDR_x pointer or wrong DB number | Inspect variant at runtime; confirm partner pointer is to a populated area |
| IO Device slot is grey in the device view | Slot length unsupported by CPU | Use 1, 2, 4, 8, or 16 bytes per slot only |
| LOGO! 8 rejects S7 connection | Older firmware or wrong connection count | Update to LOGO! 8 firmware 8.3 or later; max 8 S7 connections |
| No traffic, LK LED dark | Bad cable or wrong port | Confirm 100 Mbit link, try a known-good patch cable, use the X1 P1 port |
9. Field-Commissioning Checklist
- Power the 1212C CPUs with 24 V DC on terminals 1L and 2L. Verify PWR LED steady green.
- Connect a managed switch between X1 P1 of both CPUs (or use a direct cable for a two-node setup).
- Verify the LK LED on each port — must be solid green before continuing.
- Set distinct IP addresses and identical subnet mask on both CPUs.
- Download the hardware configuration and program to each CPU individually.
- Use Online > Accessible devices to verify the partner is reachable.
- For PUT/GET: trigger a known pattern (e.g., toggle a single bit in the source M area) and watch the partner's mirrored M area update in the watch table.
- For IO Device: assign the PROFINET device name, then use PROFINET topology editor to confirm the port interconnections match the physical wiring.
- Force a partner failure (unplug the Ethernet cable) and verify the fail-safe behaviour configured in the partner's program.
- Restore the connection and verify automatic reconnection without restart.
10. Safety and Operational Notes
- Distributed I/O across two CPUs that control moving parts is not a safety-rated architecture. If the application requires SIL or PL classification, evaluate the SIMATIC S7-1200F variants (1214FC / 1215FC) and the S7-1200F manual for the F-CPU pairing rules.
- For machines covered by functional safety standards, the cabling between the two CPUs must follow the same segregation rules as any other safety-relevant signal; the network itself does not provide a safety layer.
- Always confirm the worst-case cycle time (OB1 + interrupt OBs + communication load) before sizing the send clock. The 1212C has a single PROFINET port shared with engineering traffic; isolate commissioning laptops on a managed switch port with VLAN if interference is observed.
- Document the IP, PROFINET device name, and slot assignment on the cabinet label so future maintenance engineers can re-establish the link without a full project download.
11. Quick Reference — Block Summary
| Goal | Block | Direction | Trigger | Status check |
|---|---|---|---|---|
| Send local M area to remote M area | PUT |
Out | Cyclic OB or one-shot | STATUS = 0x0000 |
| Read remote M area into local M area | GET |
In | Cyclic OB or one-shot | STATUS = 0x0000 |
| Mirror 1 byte each direction (cyclic) | PROFINET IO Device slot 0/1 | Bi | Hardware cyclic | Online diagnostics, no substitute |
| Bridge to LOGO! 8 variable table |
PUT to DB1 of LOGO! |
Out | Cyclic OB | LOGO! BM diagnostic Web server |
What is the fastest way to mirror a single byte between two S7-1200 CPUs?
Configure the second CPU as a PROFINET IO Device with a 1-byte DI and 1-byte DQ transfer area. The IO Controller reads and writes the byte from its standard process image. Latency is the configured send clock, typically 1–2 ms on a 1212C, faster than any PUT/GET implementation triggered by OB1.
Why does PUT/GET return STATUS 0x8084 even when both CPUs are online?
Error 0x8084 means the partner CPU has access protection enabled. Open the partner CPU's properties in TIA Portal, navigate to Protection & Security > Connection mechanisms, and enable Permit access with PUT/GET communication from remote partner. Re-download the partner's hardware configuration and the connection will establish on the next REQ edge.
Can a 1212C DC/DC/DC act as a PROFINET IO Device?
Yes, but only from firmware V4.0 onward. Article numbers 6ES7212-1AE40-0XB0 ship with V4.4; earlier releases such as 6ES7212-1AE31-0XB0 may need a firmware update via the SIMATIC Automation Tool or TIA Portal before IO Device mode is available.
How do I exchange data with a LOGO! 8 from an S7-1200?
Two paths are supported. For tag-level exchange, use PUT/GET on an S7 connection to the LOGO! 8's internal DB1 (VB0..VB850 are read/write, I/Q are read-only). For cyclic I/O, configure the LOGO! 8 as a PROFINET IO Device of the S7-1200 and drag the LOGO! into the device view. The S7-1200 then reads and writes the LOGO!'s onboard DI/DQ directly through the process image.
What happens if the network between the two CPUs drops during operation?
With PUT/GET, the ERROR output rises, STATUS reports a connection error such as 0x80A1, and the last successful data remains in the partner's memory area until overwritten. With PROFINET IO Device, the controller applies substitute values to the affected slots (or holds last value, depending on the slot's configured behaviour) and the IO Device enters a fail-safe state. The application program must decide whether to de-energize outputs during the outage.