S7-1200 PLC-to-PLC I/O Exchange Over PROFINET PUT/GET vs IO

David Krause15 min read
SiemensTIA PortalTutorial / How-to
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

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.

Determinism matters. Real-time control of individual machines or processes makes low, deterministic latency a key factor. Choose the integration method based on the worst-case scan-to-actuation time the application tolerates, not on programming convenience. The NXP PLC and Remote I/O applications page summarizes the latency expectations for distributed I/O designs that are mirrored in the architecture choices below.

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:

  1. 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 PUT and GET reads/writes a data area on the partner CPU.
  2. 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
The Permit access with PUT/GET checkbox is the most common reason PUT/GET fails silently. It is found in the CPU properties under Protection & Security > Connection mechanisms in TIA Portal. Without it, the partner CPU rejects the connection with an SDO / SF LED pattern or returns connection resource error 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

  1. Open the project that contains both PLC_A and PLC_B devices.
  2. Select Devices & Networks > Networks view > Connections and add a new S7 connection between PLC_A and PLC_B.
  3. 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).
  4. On PLC_B's properties, open Protection & Security > Connection mechanisms and tick Permit access with PUT/GET communication from remote partner.
  5. Download hardware configuration to both CPUs.
  6. In PLC_A's Main [OB1], insert a PUT instance. 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

  1. 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.
  2. Right-click the PROFINET interface X1 of CPU_B and choose Properties > General > PROFINET interface > Operating mode. Tick IO Device and clear IO Controller.
  3. 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)
  4. 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).
  5. 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
A faster send clock consumes more of the PROFINET bandwidth. The 1212C supports a minimum of 1 ms, but only if the number of slots and total payload are small (a few bytes per direction). Start with 1 ms and increase if any device shows a "Reduction ratio not supported" diagnostic.

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:

  1. 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.
  2. 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

  1. Right-click the IO Device in the project tree → Online & diagnostics.
  2. Open PROFINET diagnostics > Port statistics — check discarded frames and CRC errors.
  3. 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

  1. Power the 1212C CPUs with 24 V DC on terminals 1L and 2L. Verify PWR LED steady green.
  2. Connect a managed switch between X1 P1 of both CPUs (or use a direct cable for a two-node setup).
  3. Verify the LK LED on each port — must be solid green before continuing.
  4. Set distinct IP addresses and identical subnet mask on both CPUs.
  5. Download the hardware configuration and program to each CPU individually.
  6. Use Online > Accessible devices to verify the partner is reachable.
  7. 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.
  8. For IO Device: assign the PROFINET device name, then use PROFINET topology editor to confirm the port interconnections match the physical wiring.
  9. Force a partner failure (unplug the Ethernet cable) and verify the fail-safe behaviour configured in the partner's program.
  10. 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.

Back to blog