Problem Overview: Keller PR-33X Modbus RTU on ET200SP
The Keller PR-33X series pressure and level transmitters expose process data over Modbus RTU on an RS-485 physical layer. When integrating these sensors with a Siemens ET200SP distributed I/O station controlled by an S7-300 (or S7-1500) CPU, engineers typically select the CM PtP communications module with order number 6ES7137-6AA00-0BA0 and the Modbus RTU master blocks FB640 (MODBUS_MASTER) and FB641 (MODBUS_SLAVE). Despite the apparent simplicity, field experience shows several recurring failure modes: STATUS returns 7002 on the master instance, the sensor never replies, or Comm_Load does not transition the CM PtP into RUN.
This guide documents the complete configuration path, the meaning of the 7002 status code, the prerequisite checks for the Keller slave, and the exact parameter values required by FB640 against the PR-33X register map. It is built from the Siemens TIA Portal V20 PTP special connection properties documentation and the SIMATIC ET 200SP manual collection.
Hardware Configuration and Wiring
The CM PtP module 6ES7137-6AA00-0BA0 is a serial interface module for the ET200SP that supports RS-422, RS-485, and RS-232 with Modbus RTU master/slave libraries. The module plugs into a BaseUnit (BU type A0 or B0) and is configured in TIA Portal under the ET200SP station's device view.
Pin Assignment for RS-485 to PR-33X
The Keller PR-33X exposes a 4-pin M12 connector or terminal block depending on variant. The RS-485 link uses a twisted pair with optional shield. The CM PtP 6ES7137-6AA00-0BA0 pinout is:
| CM PtP Terminal | Signal | Keller PR-33X |
|---|---|---|
| 1 | TX/RX+ (A) | Data+ (A) |
| 2 | TX/RX- (B) | Data- (B) |
| 3 | Logic Ground (GND) | Sensor GND |
| 4 | Shield termination | Cable shield, one end only |
For multi-drop buses, terminate the line at both ends with a 120 Ω resistor between A and B. The PR-33X has an internal 120 Ω terminator that can be enabled via the manufacturer configuration tool; the CM PtP does not include internal termination, so an external resistor or a terminated BaseUnit may be required.
Power and BaseUnit
Use BaseUnit 6ES7193-6BP00-0DA0 (BU15-P16+A0+2D) for the CM PtP. Verify the 24 V DC supply is on a clean, dedicated circuit; noise on the 24 V rail can corrupt Modbus frames and trigger 7002/7006 errors on the master instance.
Keller PR-33X Modbus RTU Register Map
The Keller PR-33X supports Modbus RTU as a slave with a manufacturer-specific subset of the standard function codes. The key function code is FC03 (Read Holding Registers), used to retrieve pressure, level, and temperature process values. The full register map and floating-point conversion rules are documented in the Keller PR-33X datasheet.
| Register Address | Function Code | Data Type | Description |
|---|---|---|---|
| 0x0001 (1) | FC03 | FLOAT32 (2 regs) | Process pressure (bar) |
| 0x0003 (3) | FC03 | FLOAT32 (2 regs) | Process temperature (°C) |
| 0x0005 (5) | FC03 | FLOAT32 (2 regs) | Level (m) if configured |
| 0x0080 (128) | FC03/FC06/FC16 | UINT16 | Slave address (read/write) |
| 0x0081 (129) | FC03/FC06/FC16 | UINT16 | Baud rate code |
| 0x0082 (130) | FC03/FC06/FC16 | UINT16 | Parity / stop bits |
Verify the address field in your FB640 request matches the Keller slave address. A common commissioning mistake is to use Unit ID = 100 on the master when the sensor is set to address 1; the sensor will simply not respond, and the master will time out.
TIA Portal Device and Module Configuration
- Open the ET200SP station in the TIA Portal project tree and drag the CM PtP (6ES7137-6AA00-0BA0) onto a free slot.
- Assign the BaseUnit type to match the installed hardware (BU15-P16+A0+2D or equivalent).
- Open the module's Properties > Port Configuration and set:
- Operating mode: RS-485 half-duplex
- Baud rate: 9600 (typical for PR-33X; confirm with the device datasheet — 19200 and 38400 are also supported)
- Parity: Even (Keller default) or None
- Data bits: 8
- Stop bits: 1
- Set the receive line initial state and the response timeout. A typical timeout is 2000 ms for slow Keller devices.
- Compile the hardware configuration and download to the CPU.
Program Structure: Comm_Load, FB640, FB641
The Modbus RTU master/slave communication for the CM PtP is implemented with three function blocks. The official Siemens example is available in the TIA Portal Help under "Communication > Modbus RTU".
Comm_Load (One-Time Parameterization)
Comm_Load is called once in OB100 (warm restart) or in a startup routine. It loads the port configuration into the CM PtP. If this block never runs, the CM PtP is not operational and every subsequent Modbus call returns STATUS = 7002.
| Input | Type | Value for PR-33X | Notes |
|---|---|---|---|
| REQ | BOOL | TRUE (one-shot) | Triggered in OB100 |
| PORT | HW_IO | Hardware identifier of the CM PtP | From system constants |
| BAUD | DINT | 9600 | Match Keller device |
| PARITY | DINT | 2 (Even) or 0 (None) | 0=No, 1=Odd, 2=Even |
| STOPBITS | DINT | 1 | 1 or 2 |
| DATABITS | DINT | 8 | Always 8 for Modbus |
| FLOWCTRL | DINT | 0 (None) | RS-485 half-duplex |
| DONE / STATUS / ERROR | BOOL / WORD / BOOL | Monitor | STATUS = 0 means port is ready |
FB640 MODBUS_MASTER (Cyclic Read Request)
FB640 issues a single Modbus request. It must be called cyclically (OB1) and triggered with a rising edge on REQ only when the previous call has completed (DONE = TRUE or ERROR = TRUE). The recommended pattern:
// FB640 MODBUS_MASTER - example instance for one PR-33X read
IF "instModbusMaster".DONE OR "instModbusMaster".ERROR THEN
"startTrigger" := TRUE; // start next request
ELSE
"startTrigger" := FALSE;
END_IF;
"instModbusMaster"(REQ := "startTrigger",
MB_ADDR := 1, // PR-33X unit address
MODE := 0, // 0 = RTU, 1 = ASCII
DATA_ADDR := 1, // start at register 0x0001
DATA_LEN := 6, // read 6 registers (3 floats)
DATA_PTR := "mdProcessData", // ANY pointer to data buffer
DONE => , BUSY => ,
ERROR => , STATUS => "mwStatus");
| Input | Meaning | Typical Value |
|---|---|---|
| MB_ADDR | Modbus unit ID (slave address) | 1 (must match Keller) |
| MODE | 0 = RTU, 1 = ASCII | 0 |
| DATA_ADDR | First register address (zero-based) | 0 (FC03 reg 0x0001 = addr 0) |
| DATA_LEN | Number of words to read | 6 (three FLOAT32 values) |
| DATA_PTR | Target data area | MW, DB, or Merker |
STATUS 7002 Root Cause Analysis
The STATUS output of FB640 reports the current state of the master. The value 7002 (hex 1B5A) has a specific meaning that depends on whether it appears on the REQ, BUSY, DONE, or ERROR output path. The most common interpretations in field service are:
| STATUS (hex) | STATUS (dec) | Meaning | Likely Cause |
|---|---|---|---|
| 0x0000 | 0 | No error / no active job | Normal idle |
| 0x7000 | 28672 | No job active | REQ not triggered |
| 0x7001 | 28673 | Job active, waiting for response | Normal during request |
| 0x7002 | 28674 | Wait for Comm_Load to complete | Comm_Load not run or still in progress |
| 0x7003 | 28675 | Job completed, ready to acknowledge | DONE pending, new REQ accepted |
| 0x8186 | 33158 | Invalid Unit ID | MB_ADDR = 0 or out of range |
| 0x8187 | 33159 | Invalid DATA_PTR | Pointer length / DB not loaded |
| 0x8190 | 33168 | Timeout — no response from slave | Wiring, baud rate, slave address mismatch |
Step-by-Step Resolution Procedure
-
Verify the CM PtP is in the correct slot. Open the device view, confirm the module at the configured slot is CM PtP 6ES7137-6AA00-0BA0, and note the system constant for the hardware identifier (e.g.,
CM_PtP_HW_ID). -
Run Comm_Load once in OB100. Use the hardware identifier from step 1 as the
PORTinput. Set REQ to TRUE with a one-shot, monitor DONE, STATUS, and ERROR for one scan cycle. STATUS must return 0 (or 16#0000) on success. - Check the STATUS of Comm_Load. If STATUS <> 0, the port parameterization failed. Common faults: baud rate not supported (the 6ES7137-6AA00-0BA0 supports 300 to 115200), parity mismatch, or BaseUnit type error.
- Call FB640 cyclically in OB1 only after Comm_Load has completed. Gate the REQ input on a rising edge generated after the first successful DONE or ERROR from the previous request.
-
Match the slave address. Use the Keller configuration tool (K-Log, READ30, or similar) to read the current Modbus slave address from register 0x0080. Set
MB_ADDRon FB640 to that value. - Match serial parameters exactly. Use a USB-to-RS-485 converter and a Modbus master test tool (Modbus Poll, Simply Modbus, or the Siemens Modbus master test in TIA) to confirm the PR-33X is reachable on the bus before involving the PLC.
- Read a small number of registers first. Set DATA_LEN = 2 (one FLOAT32) for the first test. If the request succeeds, expand to 6 registers.
- Monitor STATUS continuously during commissioning. Watch for the transition 7001 → 7003 (success) or 7001 → 8190 (timeout). This is the most direct diagnostic feedback.
Verification and Commissioning Checks
After the master returns STATUS 0x7003 (DONE = TRUE, ERROR = FALSE), the data buffer DATA_PTR contains the raw Modbus register values. To verify the float conversion:
// Interpret PR-33X register pair as FLOAT32 (big-endian word order)
"mdPressureRaw" := "mdProcessData".DW0; // bytes 0..3
"mdTempRaw" := "mdProcessData".DW2; // bytes 4..7
"mdLevelRaw" := "mdProcessData".DW4; // bytes 8..11
// On S7-300 in big-endian, swap words if necessary
"rPressure_bar" := DWORD_TO_REAL("mdPressureRaw");
Compare the engineering value to the live reading on the PR-33X display or to a calibrated reference. Typical acceptance criteria: pressure reading within 0.05 % FS of the reference at room temperature.
| Check | Expected | Pass/Fail |
|---|---|---|
| Comm_Load STATUS after OB100 | 16#0000 | Pass |
| CM PtP diagnostic LED (CM LED) | Steady green | Pass |
| FB640 DONE pulse width | 1 OB1 cycle | Pass |
| FB640 STATUS on DONE | 16#0000 | Pass |
| First read cycle time | < 1 second at 9600 baud | Pass |
| Pressure value matches display | ±0.05 % FS | Pass |
Troubleshooting Matrix
| Symptom | Likely Cause | Remedy |
|---|---|---|
| FB640 STATUS = 7002 permanently | Comm_Load not executed or wrong HW_ID | Call Comm_Load in OB100 with correct PORT HW_ID |
| FB640 STATUS = 8190 (timeout) | Wiring / baud / slave address mismatch | Verify with handheld Modbus master on the bus |
| FB640 STATUS = 8186 | MB_ADDR = 0 or > 247 | Set MB_ADDR to valid range (1–247) |
| FB640 STATUS = 8187 | DATA_PTR is null or DB not loaded | Use a valid MW, DB, or Merker area of correct length |
| CM PtP LED is yellow / red | Diagnostic interrupt pending | Read diagnostic buffer via Online > Diagnostics |
| Data buffer zero, but DONE = TRUE | Byte/word order issue or wrong register offset | Confirm DATA_ADDR is zero-based; check word swap |
| Intermittent CRC errors | Bus termination / shield / noise | Add 120 Ω terminator, ground shield at one end only |
| Communication works for 1 sensor, fails for 2nd | Address conflict or bus length | Verify unique slave addresses; reduce bus length to < 1200 m at 9600 |
Advanced: Multi-Sensor Polling and Cycle Time
When polling multiple PR-33X sensors on the same RS-485 bus, instantiate one FB640 per sensor. Trigger the next request only when the previous DONE or ERROR has been received. Total cycle time for N sensors is approximately:
T_cycle = N × (T_request + T_response + T_idle)
T_request (bytes) = 8 + 2×DATA_LEN // RTU framing
T_byte (ms) = 11000 / baud_rate // 9600 baud → 1.146 ms/byte
For 3 sensors with DATA_LEN = 6 at 9600 baud, the per-frame byte count is 20, the byte time is ~1.15 ms, and the response time at the slave is typically < 5 ms. Total cycle ≈ 3 × (20 × 1.15 + 5) ≈ 84 ms, which is acceptable for typical process control loops. Increase the baud rate to 38400 to cut the cycle time to ~25 ms.
Differences Between S7-300 and S7-1500 Implementations
The same FB640 / FB641 library runs on both S7-300 (with CM PtP 6ES7137-6AA00-0BA0 on ET200SP) and S7-1500 (with CM PtP on ET200SP or PtP module in the central rack). The PTP special connection properties — which control how status messages are exchanged between the local and partner device — are documented in the TIA Portal V20 PTP connection properties guide. For Modbus RTU on the CM PtP, the special connection properties are typically not required — leave the default unchecked unless your PR-33X is configured for handshaking via the special status mechanism.
On S7-1500, the Modbus master blocks are FB1860–FB1863 in some library versions, but the behavior is identical. On S7-300, the legacy blocks are FB640/FB641. Cross-reference the TIA Portal online help for the version installed in your project.
Field-Proven Cautions
- Do not call FB640 with REQ = TRUE continuously. The block requires a one-shot edge; a held REQ will queue a single job, but the cycle behavior becomes confusing because DONE and ERROR only pulse for one cycle.
- Do not assume MB_ADDR = 1. The Keller default is 1, but PR-33X units are often shipped with a customer-specific address. Always read register 0x0080 first or check the device label.
- Confirm parity and stop bits with a scope or a Modbus scanner. A parity mismatch produces consistent timeout errors (8190) but no diagnostic interrupt.
- The CM PtP at 6ES7137-6AA00-0BA0 does not support Modbus TCP. If you need Modbus TCP to the PR-33X, use the PR-33X-ETH variant or a CP 1542-1 / CP 343-1.
- Keep cable shield grounded at one end only. Multi-point grounding creates ground loops that couple noise into the RS-485 differential pair.
Frequently Asked Questions
What does STATUS 7002 mean on FB640 MODBUS_MASTER?
STATUS 7002 (hex 0x7002, dec 28674) indicates the master is waiting for Comm_Load to complete the port parameterization. Run Comm_Load in OB100 with the correct HW_ID of the CM PtP module and wait for STATUS = 0 before triggering FB640.
Which Siemens module supports Modbus RTU master on the ET200SP?
The CM PtP module with order number 6ES7137-6AA00-0BA0 supports Modbus RTU master and slave on RS-232, RS-422, and RS-485. It is used with the FB640 MODBUS_MASTER and FB641 MODBUS_SLAVE blocks.
What Modbus function code does the Keller PR-33X use for process data?
The PR-33X uses function code FC03 (Read Holding Registers) for reading process values such as pressure (register 0x0001) and temperature (register 0x0003). The values are 32-bit IEEE-754 floats stored in big-endian word order across two registers.
Why does FB640 return STATUS 8190?
STATUS 8190 (hex 0x8190) means the master timed out waiting for a response from the slave. Typical causes are incorrect wiring, mismatched baud rate or parity, wrong slave address (MB_ADDR), or a Keller sensor that is not powered. Verify the bus with a USB-to-RS-485 master tool first.
Can the same CM PtP module be used for both Modbus master and slave?
Yes. The CM PtP 6ES7137-6AA00-0BA0 supports simultaneous Modbus master (FB640) and Modbus slave (FB641) operation. Comm_Load is called once to set the port parameters; the master and slave blocks then operate independently against the same port.
How do I convert Keller PR-33X register words to engineering units?
Read an even number of words starting at the required address, then combine the two 16-bit words into a 32-bit DWORD. The PR-33X uses big-endian word order, so the first word received is the high word. Apply DWORD_TO_REAL to interpret the result as an IEEE-754 float representing the engineering value.