Configuring S7-1200 to S7-1500 PUT/GET Communication in TIA Portal
S7 Communication between an S7-1200 and an S7-1500 using the PUT and GET instructions is one of the most common data exchange patterns in SIMATIC automation cells. Despite the simplicity of the instruction interface, engineers frequently report a working Ethernet connection yet zero data movement, often accompanied by STATUS = 0 and a clear ERROR bit. This guide consolidates the official Siemens configuration path, the protection flags that block remote access, the data block accessibility rules, and the diagnostic workflow that isolates the root cause in the field.
1. Overview of S7 PUT/GET Communication
The PUT instruction writes data from a local source area to a partner CPU. The GET instruction reads data from a partner CPU into a local destination area. Both instructions operate on top of the S7 Communication protocol, which is transported over ISO-on-TCP (port 102) on the PROFINET interface. No additional hardware is required beyond the onboard Ethernet port of each CPU; no CP is necessary unless the application requires routing through a different subnet or a media converter.
Because the protocol is connection-oriented, every PUT or GET call must be bound to an S7 connection that has been engineered in TIA Portal. The CPU that owns the instruction is the active end of the connection; the partner CPU only has to allow the connection. This is the architectural reason the "Permit access with PUT/GET" flag exists in the S7-1500 protection properties — it is a one-way permission that turns the S7-1500 into an S7 server capable of accepting PUT and GET requests from any reachable active partner.
Refer to the official Siemens documentation for the full instruction semantics and the supported data types:
- PUT and GET (Write and read from a remote CPU) — TIA Portal Manual Collection
- S7 Communication with PUT/GET — Siemens Industry Online Support (PDF application example)
2. Prerequisites and Component Selection
Confirm the following before opening TIA Portal:
| Component | Minimum / Recommended | Notes |
|---|---|---|
| S7-1200 CPU | Firmware V4.2 or higher (V4.4+ for S7-1500 partners) | Firmware V4.0 supports PUT/GET; V4.2+ adds improved status reporting. |
| S7-1500 CPU | Firmware V1.8 or higher (V2.0+ recommended) | V1.8 is the first firmware with the unified protection dialog. |
| TIA Portal | V15.1 or higher (V17/V18 recommended for current firmware) | Match the TIA Portal version to the highest CPU firmware installed. |
| Ethernet topology | Direct crossover, switch, or routed subnet | Both CPUs must be on the same IP subnet, or routing must be configured. |
| IP addressing | Static addresses on both CPUs | DHCP is not allowed for S7-1200/1500 partner roles. |
STATUS codes are only emitted on the V2.x firmware. Always update the S7-1200 to V4.4 or higher before commissioning if the S7-1500 is recent.
3. Step 1 — Configure Static IP Addresses
Assign a unique IP address to each CPU on the same subnet. The PROFINET interface of the S7-1200 is configured under Device view > PROFINET interface > Ethernet addresses. The S7-1500 uses the same dialog in its Device configuration.
Recommended addressing for the example referenced in the field reports:
- S7-1200:
192.168.0.1— subnet mask255.255.255.0 - S7-1500:
192.168.0.2— subnet mask255.255.255.0 - Engineering PG/PC:
192.168.0.100(do not place on the same address as either PLC)
A common commissioning defect is leaving the PG on the default subnet and accidentally forcing an address collision with one of the PLCs. When TIA Portal reports "Online — different IP, accessible," the IP of the CPU itself has been overwritten; reset the CPU to factory defaults and re-assign the intended address.
4. Step 2 — Enable PUT/GET Access on the S7-1500
The S7-1500 CPU ships with remote PUT/GET access disabled. Without this flag, the CPU will accept the S7 connection establishment but will return a negative acknowledgment to every PUT / GET request, leaving the active partner reporting STATUS = 0x80A0 or 0x8188 depending on the firmware.
Enable the flag at:
- Open the S7-1500 device in the project tree.
- Select Properties > Protection & Security in the Inspector window.
- Expand Connection mechanisms.
- Tick Permit access with PUT/GET communication from remote partner (PLC, HMI, OPC, ...).
- Compile and download the hardware configuration to the S7-1500.
Refer to the protection dialog in the TIA Portal help: Properties > Protection & Security > Connection mechanisms > Permit access with PUT/GET communication from remote partner. The same checkbox exists on the S7-1200 when it plays the server role in a different project topology.
5. Step 3 — Engineer the S7 Connection
The S7 connection is the runtime object that binds the local instruction to the partner CPU. Without it, the PUT/GET block has no valid ID to use.
- In the project tree, select the local CPU (e.g. the S7-1200) and open Devices & Networks.
- Switch to the Connections tab at the top of the network view.
- Choose S7 Connection from the drop-down, then click the local PROFINET interface.
- Drag the connection line to the partner PROFINET interface.
- Open the connection properties and confirm the partner IP address matches the S7-1500
192.168.0.2. - Note the Connection ID — by convention this is
1for the first connection but TIA Portal may assign any free ID. The active CPU's instruction must use this exact ID.
Compile the project and download the connection configuration to both CPUs. A connection that exists only in the project tree of the active CPU will not work because the S7 server side must also know the local TSAPs.
6. Step 4 — Create Non-Optimized Data Blocks
On a CPU with optimized block access (the default for newly created DBs in S7-1500 firmware V2.0+), the PUT/GET request can read or write the data only if the block properties allow it. For absolute addressing from a partner, two conditions must be met:
- Open the DB in the project tree.
- Open Properties > Attributes.
- Uncheck Optimized block access (this is the S7-1500 default only when the block is created from an S7-1200 template; S7-1500 always defaults to optimized).
- Confirm the Accessible from HMI/OPC UA checkbox under Attributes > Accessibility is enabled if the block must remain optimized but reachable by S7 Communication — on S7-1500 firmware V2.0+, this single checkbox is sufficient and the block can stay optimized.
The simplest, most portable configuration is: disable optimized access, then reference the data by absolute address in the PUT/GET instruction. Define the data as a plain structure, for example DB20.DataToSend : ARRAY[0..9] OF BYTE, and let the compiler assign it to DB20.DBX0.0 (byte 0) onwards.
| Configuration | Optimized DB | Non-Optimized DB |
|---|---|---|
| S7-1200 PUT/GET | Allowed if "Accessible from HMI/OPC UA" is on | Allowed — use absolute addressing |
| S7-1500 PUT/GET | Allowed if "Accessible from HMI/OPC UA" is on (V2.0+) | Allowed — use absolute addressing |
| Default for new S7-1500 DBs | Yes | No (manual change required) |
7. Step 5 — Program the PUT/GET Blocks
The blocks live in Instructions > Communication > S7 Communication. In the local CPU's main OB (typically OB1 or a cyclic OB), add a PUT and a GET instance, and assign them a multi-instance data block so they retain their static parameters across scans.
PUT block parameters
| Parameter | Type | Meaning | Example value |
|---|---|---|---|
REQ |
BOOL | Rising edge starts the write |
Tag_StartWrite or Clock_1Hz
|
ID |
WORD | Connection ID from step 3 | W#16#1 |
ADDR_1 |
REMOTE | Pointer to partner DB area | P#DB20.DBX0.0 BYTE 10 |
SD_1 |
VARIANT | Local source area | P#DB10.DBX0.0 BYTE 10 |
LEN |
UINT | Length in bits/bytes/words per the SD_1 pointer | 10 (bytes) |
DONE |
BOOL | Set for one scan on success | PUT_Done |
ERROR |
BOOL | Set for one scan on failure | PUT_Err |
STATUS |
WORD | Detailed error or progress code | PUT_Status |
BUSY |
BOOL | 1 while a write job is in progress | PUT_Busy |
GET block parameters
| Parameter | Type | Meaning | Example value |
|---|---|---|---|
REQ |
BOOL | Rising edge starts the read | Tag_StartRead |
ID |
WORD | Connection ID from step 3 | W#16#1 |
ADDR_1 |
REMOTE | Pointer to partner DB area | P#DB30.DBX0.0 BYTE 10 |
RD_1 |
VARIANT | Local destination area | P#DB11.DBX0.0 BYTE 10 |
LEN |
UINT | Length in bits/bytes/words per the RD_1 pointer | 10 (bytes) |
NDR |
BOOL | New data received (success) | GET_NewData |
ERROR |
BOOL | Set for one scan on failure | GET_Err |
STATUS |
WORD | Detailed error or progress code | GET_Status |
BUSY |
BOOL | 1 while a read job is in progress | GET_Busy |
A robust cyclic pattern is to use a 1 Hz clock from the local CPU's system clock (e.g. Clock_1Hz in the S7-1200/1500 system DB) to drive REQ, so the transfer runs on a fixed cadence without any code from the user. Avoid calling the block in OB1 on every scan — the connection is busy and the REQ edge is ignored; calling it more frequently than the cycle can mask legitimate error events.
8. Step 6 — Download and Go Online
- Select the local CPU in the project tree, click Download to device, and choose Hardware and software (only changes).
- After the local CPU is updated, right-click the partner CPU and choose Download to device > Hardware configuration so the connection is registered on the server side as well.
- Go online with the local CPU and open the Watch table that contains the instruction status tags.
- Force
REQby toggling the trigger tag, or wait for the clock pulse.
9. Diagnosing "Communication Established but No Data"
The most reported field failure is: TIA Portal's Online & Diagnostics > Connections shows the S7 connection as Established, yet PUT.DONE never sets and PUT.STATUS returns 0, or PUT.ERROR sets immediately with a non-zero STATUS. The STATUS = 0 symptom with ERROR = FALSE is the signature of a never-issued job — the trigger tag never produced a rising edge, or the connection ID is wrong. The ERROR = TRUE symptom with a non-zero STATUS is the signature of an issued job that the partner rejected.
Use the following decision tree before changing code:
-
Confirm the trigger. Place a watch on
REQ. If the bit never goes high, the instruction is not being called with a rising edge. Add a set/reset latch or use a clock bit. -
Confirm the connection ID. Open the connection in Connections, read the ID, and compare it byte-for-byte to the constant in the block. The most common mistake is to specify
W#16#1in the block but leave the connection at the auto-assigned IDW#16#100. - Confirm the partner IP. In the connection properties, expand Addresses and check the Partner IP address. An IP that points at the engineering PC rather than the partner CPU will not return a clear error — TIA Portal simply shows the connection as established to the local CPU's loopback.
- Confirm PUT/GET access on the server. On the S7-1500, open Properties > Protection & Security > Connection mechanisms and verify the flag is still set. A subsequent download of a different configuration can silently overwrite the protection flags.
-
Confirm the data block accessibility. If the partner DB is optimized and "Accessible from HMI/OPC UA" is off, the server returns a resource error. The active partner sees
STATUS = 0x80B1or0x80A0depending on firmware. -
Confirm the length and pointer types.
SD_1/RD_1andADDR_1must use the same length unit. A common mistake isBYTE 10on the local side andWORD 5on the remote side — the instruction uses the partner length for the actual read, but TIA Portal warns only at compile time.
10. PUT/GET Status Code Reference
The STATUS word uses two 8-bit fields: the high byte is a general class, the low byte is a detailed code. The most frequently observed values during PUT/GET commissioning are:
| STATUS (hex) | Meaning | Recommended action |
|---|---|---|
0x0000 |
Job has not been issued or has just completed with no new error | Verify REQ edge, connection ID, partner IP. |
0x7000 |
First call, no job active | Normal — no action. |
0x7001 |
Job is being processed | Wait for DONE/NDR. |
0x7002 |
Job complete (DONE/NDR pending) | Normal — no action. |
0x8188 |
Wrong parameter (e.g. ID, ADDR_1 type) | Check pointer syntax and connection ID. |
0x80A0 |
Negative acknowledgment from partner (server rejected) | Check PUT/GET flag and DB accessibility on partner. |
0x80A1 |
Connection aborted by partner | Check partner CPU operating state; check partner resource errors. |
0x80B1 |
Requested DB/area does not exist on partner | Confirm DB number and length match on both sides. |
0x80C3 |
Resource bottleneck on partner (too many jobs) | Reduce job frequency on active side. |
0x80D0 |
Partner CPU is in STOP or startup | Run the partner CPU. |
STATUS = 0 on every scan almost always means the REQ input never produced a rising edge, the block is called on every scan with a continuous TRUE (which is a level, not an edge), or the block is in a multi-instance DB that was never opened. Insert a rising-edge detector (POS instruction) in front of REQ if you do not want to use a clock.11. Verification Procedure
After completing the configuration, perform the following checks to certify the data path:
- Online > Connections. The S7 connection state should be Established and remain stable for at least 60 s.
-
Watch table on active side. Force a known pattern into the local source DB, trigger
REQ, and verifyDONE/NDRpulses for one scan and thatSTATUSreads16#7002followed by16#0000. -
Watch table on partner side. Open an online watch on the partner DB and confirm the value matches the local source after the next
REQpulse. -
Reverse direction. Repeat the test with the
GETblock by writing a value into the partner DB and confirming the local destination DB updates. -
Sustained load. Drive
REQwith a 100 ms clock and let the cell run for at least 10 minutes. IfERRORever sets, capture theSTATUSand resolve before declaring the path production-ready.
12. Troubleshooting Matrix
| Symptom | Most likely cause | Fix |
|---|---|---|
| Connection stays in Establishing | Subnet mismatch or wrong partner IP | Re-confirm both IPs are in 192.168.0.x / 24
|
Connection Established, data never moves, STATUS = 0
|
REQ not producing a rising edge, or wrong ID
|
Use a clock bit or POS edge; verify ID
|
Connection Established, ERROR = TRUE, STATUS = 0x80A0
|
PUT/GET access flag disabled on partner | Enable on S7-1500 properties; download hardware |
Connection Established, STATUS = 0x80B1
|
Partner DB number or length mismatch | Re-check the ADDR_1 pointer and the partner DB |
| Connection Established, values are wrong by word swap | Big-endian / little-endian byte order in WORD / DWORD areas |
Use BYTE arrays for raw transfer and convert in user code |
| Connection drops after a few minutes | Watchdog on the partner CPU, or the partner is in STOP | Check partner diagnostics buffer for OB priority errors |
| Works in test rig, fails in plant | Engineering PC IP collision with a CPU | Re-assign the PG and verify with arp -a
|
13. Performance and Sizing Notes
PUT/GET uses a single S7 connection for all PUT and GET instances bound to the same ID. Each instruction call sends a single PDU; the wire time for a 240-byte PDU on a 100 Mbit/s PROFINET segment is dominated by the S7 handshake and is typically 8 ms to 15 ms per job. A 1 Hz update rate is therefore well within the budget; do not exceed 10 Hz for non-critical data to avoid saturating the connection.
For larger payloads (above 480 bytes) or higher update rates, consider migrating to the BSEND/BRCV or USEND/URCV instruction pair, which use the same S7 connection but allow segmented transfer. For multi-partner scenarios, each partner requires its own S7 connection and a unique ID. The S7-1200 supports up to 8 S7 connections; the S7-1500 supports 16 or more depending on firmware and CPU type.
14. Common Field Misconfigurations
Five configuration errors account for the majority of field calls about PUT/GET:
- Forgetting the PUT/GET flag on the S7-1500. Most common — fixed in step 2.
- Connection downloaded to the active CPU only. The partner CPU never knows the S7 connection exists and rejects every request. Always download the hardware configuration to both CPUs.
- Using a fresh, optimized DB on the S7-1500 without enabling HMI/OPC UA accessibility. The CPU answers with a resource error.
-
Forcing the
REQinput to a constantTRUE. The instruction requires a rising edge; a level does not start a job. - Storing a word array in one DB and reading it as a byte array in the partner. The data is sent but the partner interprets the high/low bytes swapped, producing values that are nonsense on a human-machine interface.
15. Quick-Reference Checklist
- [ ] Both CPUs have unique static IPs in the same subnet.
- [ ] S7-1500 has Permit access with PUT/GET communication from remote partner enabled.
- [ ] S7 connection engineered in Devices & Networks > Connections and downloaded to both CPUs.
- [ ] Partner DB is non-optimized or optimized with Accessible from HMI/OPC UA on.
- [ ] Block
IDmatches the connection ID exactly. - [ ]
REQis driven by a clock bit or a rising-edge detector. - [ ] Local and remote pointer types and lengths match.
- [ ] Watch table confirms
DONE/NDRand correctSTATUSon success.
FAQ
Why does my S7-1200 PUT/GET show STATUS 0 and ERROR FALSE even though the connection is established?
STATUS 0 with ERROR FALSE on a S7-1200 PUT/GET means the instruction was never issued with a rising edge. The most common cause is wiring REQ to a constant TRUE (a level, not an edge), pointing REQ at the wrong tag, or specifying an ID that does not match the connection ID in the Connections editor. Drive REQ with a clock bit (for example Clock_1Hz from the system clock) or with the output of a POS rising-edge detector.
Do I have to enable PUT/GET on the S7-1500 even when the S7-1200 is the active partner?
Yes. The S7-1500 acts as the S7 server regardless of which CPU is the active partner, and the server-side flag Permit access with PUT/GET communication from remote partner must be set under Properties > Protection & Security > Connection mechanisms. Without it, the S7-1500 returns a negative acknowledgment (typically STATUS 0x80A0 on the S7-1200) and no data is transferred.
Can I use optimized data blocks with PUT/GET on an S7-1500?
Yes, on S7-1500 firmware V2.0 or higher, an optimized DB is reachable from a remote S7-1200 PUT/GET request if you enable Accessible from HMI/OPC UA in the DB attributes. If you are running an older S7-1500 firmware or an S7-1200 partner, switch the DB to non-optimized and use absolute addressing with P# pointers in the ADDR_1 and SD_1/RD_1 slots.
How many S7 connections can a S7-1200 use for PUT/GET?
The S7-1200 supports up to 8 simultaneously established S7 Communication connections, depending on CPU type and firmware. Each PUT/GET partner requires its own S7 connection with a unique connection ID. The S7-1500 supports 16 or more S7 connections on standard CPUs. Plan the connection budget before adding HMI, OPC UA, and routing to other subnets.
What is the maximum data length per PUT/GET call?
A single PUT/GET call transfers one S7 PDU of up to 480 bytes (S7-1200) or 960 bytes (S7-1500) on PROFINET. For larger payloads, split the data into multiple PUT/GET calls with offset pointers, or switch to the BSEND/BRCV instruction pair which uses the same S7 connection and allows segmented transfer of large data areas.