Overview
Establishing direct S7 communication between two SIMATIC S7-1200 controllers (for example, an S7-1214C DC/DC/DC and an S7-1212C DC/DC/DC) is one of the most common commissioning tasks in the S7-1200 family. The data-exchange mechanism uses the standardized PUT and GET instructions, which are mapped onto an S7 single connection over the integrated PROFINET interface of each CPU.
The most frequent symptom reported by field engineers (and the original symptom described in the source) is a status output of ERROR = 0 and BUSY = 1 with no data actually transferred. This pattern almost always indicates that the local SFB/SFC has not yet received a response from the partner, and the root cause is normally found in one of three layers:
- The PROFINET connection configuration inside TIA Portal (IP, subnet, TSAP, access point).
- The protection/access level of the remote CPU blocking PUT/GET from a partner.
- CPU firmware version, where the original V1.0 S7-1200 firmware (shipped 2009) has known PROFINET communication limitations corrected in V2.x, V3.x, and V4.x updates.
This guide covers the complete PUT/GET implementation, the required TIA Portal configuration, the firmware caveats that historically cause exactly the 0/1 status pattern, and the verification steps for a working data exchange.
Prerequisites
Before configuring the S7 connection, confirm that the following hardware and software is available. Substituting any of these without verification is the most common cause of a silent failure with BUSY = 1.
| Item | Requirement | Notes |
|---|---|---|
| Local CPU | S7-1214C DC/DC/DC (6ES7 214-1AG40-0XB0 or earlier) | PROFINET port on bottom of CPU |
| Remote CPU | S7-1212C DC/DC/DC (6ES7 212-1BE40-0XB0 or earlier) | PROFINET port on bottom of CPU |
| Firmware | Minimum V4.2 recommended; V1.0 is not adequate for stable PUT/GET | See "Firmware Considerations" below |
| Software | STEP 7 (TIA Portal) V15.1 or later; V17 preferred for S7-1200 V4.4+ support | Older TIA versions cannot program newer firmware |
| Cabling | Direct Ethernet patch cable (Cat 5e or better), or PROFINET switch | Cross-over is not required on S7-1200; auto-MDI/MDIX is supported |
| IP plan | Both CPUs on the same subnet, e.g. 192.168.0.1 / 255.255.255.0 and 192.168.0.2 / 255.255.255.0 | Different subnets require a router/route entry |
Firmware Considerations and the V1.0 Symptom
- PUT/GET with more than 160 bytes of payload was not always stable across PROFINET.
- Connection resource counts were lower (max 8 S7 connections, vs. 16 in V4.x).
- Watchdog timing for the PUT/GET status machine was longer;
BUSY = 1can persist for several seconds beforeDONEorERRORlatches. - The "Permit access with PUT/GET from remote partner" option was not yet exposed in the same UI location.
Siemens released subsequent firmware updates specifically addressing PROFINET communication issues. The recommended path is to update both CPUs to at least V4.2, ideally the latest V4.4 or V4.5 currently listed in the Siemens Online Support delivery release. The CPU retains the user program and IP configuration through firmware updates performed from TIA Portal, but a power cycle is required after the update.
To read the current firmware of each CPU in TIA Portal:
- Go online with the CPU (Online → Go online).
- Right-click the device in the project tree and select "Online & diagnostics".
- Under "Diagnostics", expand "General" and view the "Firmware version" field.
Network and IP Configuration
Two S7-1200 CPUs communicating directly over PROFINET must share a single IP subnet. The default addresses shipped from the factory (169.254.x.x) can be used for a first test, but production installations should use fixed addresses from a planned range.
Configure the IP on each CPU from the device view:
- Select the CPU in the project tree.
- Open "Properties → PROFINET interface [X1] → Ethernet addresses".
- Uncheck "Set IP address using a different method" and enter:
- IP address: 192.168.0.1 (CPU 1214C) / 192.168.0.2 (CPU 1212C)
- Subnet mask: 255.255.255.0
- Router: leave blank (no router required for direct link)
- Confirm that both CPUs are placed in the same PROFINET subnet in the network view. A red bar between the devices means the subnet is not assigned; double-click the green PROFINET line to verify.
Physical verification before configuring the TIA connection:
ping 192.168.0.2 (executed from the engineering PC or from the online diagnostics of the local CPU)
If the ping fails, the PROFINET link LED on the CPU X1 port is the first diagnostic. A solid green LED on each port indicates the physical link is up.
Creating the S7 Connection in TIA Portal
The PUT and GET instructions operate over an S7 connection. The connection is configured from the network view and tied to a connection ID used by the program.
- Open the "Network view" in TIA Portal.
- Click the "Connections" icon at the top of the toolbar to enter connection mode.
- Click the local CPU (S7-1214C), drag the connection line to the partner CPU (S7-1212C).
- TIA Portal prompts to choose the connection type. Select S7 connection.
- Open the new connection in the inspector window under "Properties → General".
The connection properties that must be set are:
| Property | Value | Comment |
|---|---|---|
| Local endpoint → Address | 192.168.0.1 (CPU 1214C) | Interface of the local CPU |
| Partner endpoint → Address | 192.168.0.2 (CPU 1212C) | Interface of the partner CPU |
| Connection ID | 100 (user choice, e.g. 1..65535) | Must match the ID parameter of PUT/GET |
| Active connection establishment | Checked on the local CPU side | One side must be the active partner |
| Local TSAP | 01.00 (default) or a user value such as 10.00 | Transport Service Access Point |
| Partner TSAP | 01.00 (default) or 10.00 | Must NOT be 01.01 (slot 1) unless partner is a CP |
01.01 is slot 1 of the CPU and is normally not the correct value for PUT/GET. Use 01.00 or any user-defined value such as 10.00; both sides of the S7 connection must use the same TSAP number pair in mirrored form.
Enabling PUT/GET on the Partner CPU
This is the single most common cause of the symptom ERROR = 0, BUSY = 1 with no data transfer. The remote CPU must explicitly allow PUT/GET access from a partner.
- Select the partner CPU (S7-1212C) in the project tree.
- Open "Properties → General → Protection & Security".
- Find the option "Permit access with PUT/GET from remote partner (PLC, HMI, OPC, ...)".
- Check the option.
- Download the configuration to the partner CPU.
On firmware V4.x, the same option is reached via the same path. On V1.0 firmware, the option is in a different location: "Properties → Communication" and is labeled "Allow PUT/GET access". If this option is left disabled, the partner CPU rejects PUT/GET jobs at the connection layer, the local PUT/GET stays in BUSY = 1 indefinitely, and the error output eventually latches with status word W#16#8183 (partnership not established) or W#16#80C4 (connection aborted) depending on the timeout configuration.
Programming the PUT and GET Blocks
PUT and GET are found in TIA Portal under "Instructions → Communication → S7 Communication". They are interchangeable between V1.0 and V4.x firmware, but the FB block number is different:
| Instruction | Symbolic name | Function block number | Direction |
|---|---|---|---|
| PUT | PUT (S7-1200) | FB / SFB 13 equivalent (S7-1200 uses an internal FB) | Local → Partner (write) |
| GET | GET (S7-1200) | FB / SFB 14 equivalent (S7-1200 uses an internal FB) | Local ← Partner (read) |
Example call in a program block (OB1) on the local CPU (S7-1214C). All parameters must be assigned an input; unassigned inputs are treated as zero and cause silent failures.
// PUT: write 10 bytes from local MB100 to partner DB1 starting at byte 0
"iPUT_DB"(REQ := "startPut", // BOOL, edge-triggered
ID := 100, // INT, matches the connection ID
DONE => "putDone", // BOOL, pulse on success
ERROR => "putError", // BOOL, sticky on error
STATUS=> "putStatus", // WORD, 0 = no error, 8 = error
ADDR_1:= P#DB1.DBX0.0 BYTE 10, // POINTER, remote area
ADDR_2:= P#M100.0 BYTE 10, // POINTER, local area
SD_1 := "sendBuffer"); // VARIANT, local source data
For the GET, mirror the parameters:
// GET: read 10 bytes from partner DB2 byte 0 into local MB200
"iGET_DB"(REQ := "startGet",
ID := 100,
DONE => "getDone",
ERROR => "getError",
STATUS=> "getStatus",
ADDR_1:= P#M200.0 BYTE 10, // local destination
ADDR_2:= P#DB2.DBX0.0 BYTE 10, // remote source
RD_1 := "recvBuffer");
Key constraints for valid pointer operands:
- The byte offset on the partner must be aligned to the data type boundary; for
BYTEarrays the alignment is free, but forWORDandDWORDthe offset must be even / divisible by 4 respectively. - The total payload size must be ≤ 160 bytes for a single PUT/GET call on V1.0 firmware. V4.x supports up to 400 bytes for PUT and 400 bytes for GET.
- The remote area (ADDR_1 in PUT, ADDR_2 in GET) must exist on the partner CPU. If the partner does not have DB1, PUT returns
W#16#80A1(DB does not exist).
Status Word Decoding
The STATUS output of PUT/GET is a WORD containing either an internal communication status (when ERROR = 0) or an error code (when ERROR = 1). The most common values seen during commissioning are:
| STATUS (hex) | Class | Meaning | Remediation |
|---|---|---|---|
| W#16#0000 | OK | No error | None |
| W#16#0001 | Status | Job active (BUSY) | Wait; persistent > 5 s = partner unreachable |
| W#16#0003 | Status | Job finished (DONE) | None |
| W#16#7000 | Status | REQ = 0, no job active | None |
| W#16#7002 | Status | REQ = 1, job accepted, waiting on partner | Check partner CPU state (RUN/STOP) |
| W#16#80A1 | Error | DB on partner does not exist | Create the DB on partner or fix ADDR |
| W#16#80B1 | Error | Pointer / length invalid | Recompute ADDR_1/ADDR_2; check max length |
| W#16#80C4 | Error | Connection aborted (often partner protection) | Enable "Permit access with PUT/GET" on partner |
| W#16#8183 | Error | Connection establishment error | Verify IP, TSAP, subnet, both CPUs in RUN |
| W#16#80B2 | Error | Read error on partner (e.g. unoptimized access denied) | Disable "Optimized block access" on partner DB |
W#16#80B2 on the requesting CPU.
Cross-Reference: S7-1200 to S7-1500 PUT/GET
The same mechanism extends to S7-1200 to S7-1500 communication. The S7 connection is created in the active partner's configuration (the one that issues the PUT/GET). The procedure is documented in the official Siemens application document:
- Reference: S7 communication between SIMATIC S7-1200 and SIMATIC S7-1500 (PDF, Siemens ID 82212115)
- Manual: SIMATIC S7-1200 Manual Collection — PLC-to-PLC communication (TIA Portal cloud docs)
Key differences when the partner is an S7-1500 instead of a second S7-1200:
| Aspect | S7-1200 → S7-1200 | S7-1200 → S7-1500 |
|---|---|---|
| Connection type | S7 connection | S7 connection (same) |
| PUT/GET permission | Property of remote CPU | Same location, on the S7-1500 side |
| Max PUT payload | 160 B (V1.0) / 400 B (V4.x) | Up to 400 B (S7-1500 side) |
| DB access | Standard DBs only | Standard DBs only; optimized DBs are not PUT/GET-readable |
| Local connection resource | 16 (V4.x) | 32 (S7-1500) |
Verification
After downloading to both CPUs, perform the verification in this order. Any failure step identifies the layer at fault.
- Online status: both CPUs should show "Connected" with a green dot in the TIA project tree.
- Watch table on the local CPU: monitor the PUT/GET
DONE,ERROR, andSTATUStags.DONEshould pulse for one cycle on each REQ edge,ERRORshould remain 0, andSTATUSshould readW#16#0003on success. - Data verification: write a known constant to the local source area (e.g.
MB100 := 16#AA55AA55), trigger a PUT, then read the partner DB on a watch table opened against the remote CPU. Bytes should match exactly. - Cyclical test: leave the PUT/GET in a slow cycler (e.g. trigger from a 1 s clock) and verify the data is updated cyclically. If
BUSYnever clears, return to the status-word table. - Connection diagnostics: in the online diagnostics of the local CPU, "Diagnostics → Communication → Connection information" shows the S7 connection state and statistics (sent/received packets, errors). Connection state should be
ESTABLISHED.
Troubleshooting Matrix
| Observed symptom | Likely cause | Fix |
|---|---|---|
| ERROR=0, BUSY=1, never finishes | Partner PUT/GET not permitted; partner in STOP; wrong subnet | Enable "Permit PUT/GET" on partner; put partner in RUN; ping partner |
| ERROR=1, STATUS=80C4 | Connection aborted (protection level mismatch) | Lower partner protection or add partner in the access list of the partner CPU |
| ERROR=1, STATUS=80A1 | Remote DB missing | Create DB1 on partner with required size and non-optimized access |
| ERROR=1, STATUS=80B2 | Optimized DB on partner | Uncheck "Optimized block access" on the remote DB |
| ERROR=1, STATUS=8183 | TSAP mismatch / connection resource full | Match TSAPs; reduce active S7 connections on partner |
| Compiles but does not link online | Wrong CPU firmware / TIA version | Update TIA Portal to V15.1+ and CPU firmware to V4.2+ |
| DONE pulses, no data updated | Wrong ADDR_1/ADDR_2 area on partner | Cross-check the remote area in a watch table on the remote CPU |
| Works once, fails after power cycle of partner | Partner was given DHCP address; lost after restart | Set fixed IP on partner CPU in TIA project |
Best Practices
- Always update both CPUs to the same firmware major version (both V4.4 or both V4.5). Mismatched major firmware versions can lead to silent connection drops after hours of operation.
- Use a consistent connection ID convention across the project (e.g. 100 for CPU1 → CPU2, 101 for CPU2 → CPU1). Avoid ID 0 or 1, which are reserved for PG/OP communication.
- On the partner CPU, leave the access level at "Full access (no protection)" for the commissioning phase, then tighten it back to "Read access" or "HMI access" after verification. Remember that "No access (complete protection)" blocks PUT/GET entirely.
- Use absolute symbolic names for the data areas (e.g.
"HMI_Interface".HMI_Word1) rather than raw pointers. TIA Portal can then validate the area size at compile time. - For payloads larger than 160 bytes on V4.x, split the PUT/GET into multiple jobs rather than increasing the byte count; this reduces the chance of a single timeout aborting the entire transfer.
- Document the TSAP numbers used in the project's communication plan; future engineers can otherwise change them during a TIA upgrade, breaking the connection silently.
FAQ
Why do I see BUSY=1 and ERROR=0 indefinitely on PUT/GET between two S7-1200 CPUs?
Most often the partner CPU's "Permit access with PUT/GET from remote partner" option is not enabled. Open the partner CPU's properties in TIA Portal, go to Protection & Security, check that option, and re-download. A second common cause is mismatched TSAPs or both CPUs being in different subnets with no router defined.
What is the minimum firmware version for stable PUT/GET on the S7-1200?
Firmware V4.2 is the minimum recommended version for production use. The original V1.0 firmware from 2009 has known PROFINET communication limitations and is no longer supported; always update to the latest V4.x release published in Siemens Online Support for the specific CPU order number.
Can PUT/GET read an optimized DB on the partner CPU?
No. PUT/GET accesses data using absolute addresses that depend on the standard S7 addressing model. Optimized DBs use symbolic-only addressing and reject direct absolute reads. Open the partner DB in TIA Portal, go to Attributes, and uncheck "Optimized block access" if PUT/GET access is required.
What is the maximum payload size for PUT/GET between two S7-1200 CPUs?
On V1.0 firmware, the maximum is 160 bytes per call. On V4.x firmware, PUT and GET each support up to 400 bytes per call. For larger transfers, chain multiple PUT/GET jobs rather than attempting a single oversize call.
Do I need a CP (communication processor) for PUT/GET between two S7-1200 CPUs?
No. The integrated PROFINET interface of the S7-1200 CPU supports S7 connections natively. A CP such as the CP 1243-1 is only required if the CPU's onboard port is fully occupied by PROFINET IO devices and a second physical PROFINET network is needed.