Problem Description
An S7-300 (CPU 31x series) programmed in STEP 7 V5.5 polls four Woodward EASYGEN 3000 genset controllers as Modbus RTU slaves through a SIMATIC ET200SP station equipped with a CM PtP serial module. The bus is a 2-wire RS-485 multi-drop loop carrying six PMU controllers, four EASYGEN 3000 units, and four additional generator controllers, totaling up to 18 slaves. Six of the eight PTP modules in the plant operate correctly. The seventh cable loop fails on the four EASYGEN 3000 slaves only, while the PMU and generator controllers on the same physical cable return valid data.
The Modbus_Master block assigned to the EASYGEN controllers latches with BUSY = 1 and STATUS = W#16#7002 indefinitely and never sets DONE. The corresponding Modbus_Comm_Load block returns STATUS = W#16#8186 during the first scan and never becomes DONE = 1. Modscan against the same physical slaves and the same starting register 450009 (length 55 holding registers) returns valid data, proving that the physical layer, slave configuration, and addressing semantics are correct on the field side. The fault is therefore inside the S7-300/ET200SP Modbus master configuration rather than in the field wiring.
System Architecture
The network is split into two distinct segments. The PROFINET segment links the S7-300 CPU to four ET200SP stations on a 100 Mbit/s industrial Ethernet ring. The Modbus RTU segment begins at the CM PtP module on the seventh ET200SP station and runs as a daisy-chained RS-485 cable. Each ET200SP station contains two CM PtP modules, each running an independent Modbus RTU master for one cable loop. The 7th cable loop is the failing segment.
Root Cause Analysis
Four independent defects typically combine to produce this signature. The diagnostics in the rest of the article target each defect in the order they should be ruled out at the desk.
| # | Defect | Symptom | Verify with |
|---|---|---|---|
| 1 | DATA_ADDR fed with the prefixed 6-digit address (450009) instead of the actual register number (50009) | STATUS 7002 latched, no reply from any slave on that address | Modscan with raw 5-digit register 50009 |
| 2 | Modbus_Comm_Load not invoked for the PTP module, or wrong PORT_ID | STATUS 8186 at first call, then persistent 7002 | STATUS output of Comm_Load; HW ID in device configuration |
| 3 | Slave address of EASYGEN does not match the master request | Other slaves on same cable respond, EASYGEN does not | EASYGEN front panel menu COMM > Modbus address |
| 4 | RS-485 termination or A/B polarity reversed on the EASYGEN stubs only | Reflection errors, intermittent noise, no response on certain slaves | Oscilloscope on A/B, 120 ohm resistors at loop ends only |
The 8186 status code is a one-time, configuration-time error raised by the Siemens MODBUS master library when the input PORT_ID does not resolve to a configured PTP module. The 7002 status code is an in-progress state, raised while the master waits for a slave response. The combination of "8186 at startup + 7002 forever" therefore indicates that the master is sending frames onto a port that was never initialized correctly. The PMU and generator controllers on the same loop do respond because their master blocks happen to be wired against a different PTP module that is correctly initialized.
EASYGEN 3000 Modbus Communication Specifications
The EASYGEN 3000 (Woodward part number family 8440-2250 / 8440-2300) exposes its measurement, control, and configuration data through a Modbus RTU slave interface. The bus interface supports 2-wire RS-485 in half-duplex and 4-wire RS-485 in full-duplex. The device is addressed using the standard Modicon 6-digit notation where the leading digit encodes the function code and the remaining five digits encode the 16-bit register number, allowing register addresses 400001 through 465535.
| Parameter | Value | Source |
|---|---|---|
| Physical layer | RS-485, 2-wire or 4-wire, half/full duplex | EASYGEN 3000 manual, chapter "Communication" |
| Default baud rate | 19200 bit/s (also supports 9600, 38400) | EASYGEN 3000 manual |
| Default data format | 8N1 (8 data bits, no parity, 1 stop bit) | EASYGEN 3000 manual |
| Supported function codes | 03 (read holding), 06 (write single), 16 (write multiple) | EASYGEN 3000 Modbus map |
| Address notation | 6-digit extended, e.g. 450009 = FC 03, register 50009 | Woodward Modbus implementation guide |
| Bus terminator | External, 120 ohm between A and B at each end of trunk | RS-485 standard, EIA-485 |
Reference: Woodward EASYGEN 3000 product page and the EASYGEN 3000 Modbus communication manual (publication 37159, available through the Woodward manuals portal). Always confirm the exact register number, data type (INT16, UINT16, INT32, REAL), and any scaling factor against the Modbus map shipped with the firmware version of the controller installed in your panel.
ET200SP CM PtP Hardware Configuration
The CM PtP is a serial interface module that plugs into an ET200SP BaseUnit. Two part numbers are relevant:
| MLFB | Description |
|---|---|
| 6ES7137-6AA00-0BA0 / -0BB0 | CM PtP, RS-232 / RS-422 / RS-485, configurable operating mode |
| 6ES7137-6BD00-0BA0 | CM PtP, RS-485 only, optimized for 2-wire Modbus RTU |
Reference: SIMATIC ET 200SP system manual and the CM PtP operating instructions, available through the Siemens Industry Online Support portal (entry ID 59062563). The IM 155-6 PN standard interface module (e.g. 6ES7155-6AU01-0BN0) hosts the PROFINET connection back to the S7-300 CPU.
For each CM PtP module used as a Modbus master, three settings in the device configuration of STEP 7 V5.5 / TIA Portal are mandatory:
- Operating mode: select "Modbus master (RTU)" or "Freeport" depending on the library you intend to use. The legacy S7-300/400 MODBUS master library (FB 7 / FB 8) requires "Freeport" mode; the TIA Portal Modbus library (FB 1800 / FB 1801) uses the "Modbus" mode.
- Port configuration: baud rate, parity, data bits, stop bits, and flow control must match the EASYGEN 3000 (19200, 8, N, 1 by default).
- Hardware identifier (HW ID): the symbolic name that the Modbus_Comm_Load block uses as PORT_ID. Capture this from the properties of the CM PtP in HW Config.
Modbus_Comm_Load and Modbus_Master Block Parameters
Each CM PtP module requires exactly one Modbus_Comm_Load instance executed once at startup (or on a slow OB such as OB 100) to apply the port settings, and one or more Modbus_Master instances executed in a fast OB (typically OB 1) to perform the actual requests. The legacy library for S7-300/400 ships FB 7 (MODB_4xx) and FB 8 (MODB_4xx) for the master, and an initialization block for the port. The TIA Portal library ships FB 1800 (Modbus_Comm_Load) and FB 1801 (Modbus_Master). Reference: Siemens MODBUS RTU master library documentation for S7-300/400.
| Block input | Type | Value in this project | Notes |
|---|---|---|---|
| Modbus_Comm_Load | |||
| REQ | BOOL | TRUE (one-shot) | Trigger initialization |
| PORT_ID | WORD | HW ID of the CM PtP (e.g. W#16#0103) | Wrong value here is the most common cause of STATUS 8186 |
| BAUD | DWORD | 19200 | Must equal EASYGEN 3000 setting |
| PARITY | UINT | 0 (none) | 0 = none, 1 = even, 2 = odd |
| FLOW_CTRL | UINT | 0 (no flow control) | Required for RS-485 |
| DB_NUMBER | UINT | 101 | Instance DB for the working DB |
| STATUS | WORD | W#16#0000 = OK | 8186 indicates bad PORT_ID or no configured module |
| Modbus_Master | |||
| REQ | BOOL | Rising edge per cycle | Do not hold REQ = TRUE |
| DATA_ADDR | DWORD |
50009 (NOT 450009) |
1-based register number per Modbus standard |
| MODE | UINT | 0 (standard Modbus) or 1 (Siemens notation, library-dependent) | See address mapping section |
| DATA_LEN | UINT | 55 | Total registers in the read range |
| DATA_PTR | ANY | P#DB100.DBX0.0 BYTE 110 | Must accommodate DATA_LEN x 2 bytes |
| STATUS | WORD | W#16#0000 = OK | 7002 = in progress, 8380 = CRC, 8381 = timeout, etc. |
Modbus Address Mapping: Extended vs Standard Notation
The EASYGEN 3000 Modbus manual numbers registers using the standard 6-digit prefixed form, e.g. 450009. The leading "4" denotes function code 03 (Read Holding Register) and the trailing "50009" is the actual 16-bit register address (0 - 65535). The Siemens MODBUS master library expects DATA_ADDR to be the raw register number, not the prefixed 6-digit display form. Strip the leading function code digit and the data type prefix.
| EASYGEN notation (6-digit) | Raw register number | Siemens DATA_ADDR (1-based) | Siemens DATA_ADDR (0-based, library-dependent) |
|---|---|---|---|
| 400001 | 1 | 1 | 0 |
| 400010 | 10 | 10 | 9 |
| 450009 | 50009 | 50009 | 50008 |
| 450063 | 50063 | 50063 | 50062 |
Reference: Modbus Application Protocol Specification V1.1b3, section 4 (Address rules). Modscan uses the 1-based register numbering shown in the third column. The legacy S7-300/400 MODBUS library (FB 7/8) is also 1-based. If you have configured a non-default MODE in the master block, refer to the library documentation for the active addressing rule. The block will simply not match any slave when the value 450009 is fed into a 1-based DATA_ADDR, because register 450009 does not exist on the EASYGEN 3000.
STATUS and ERROR Code Reference
| STATUS (hex) | STATUS (decimal) | Meaning in Siemens MODBUS master library | Action |
|---|---|---|---|
| W#16#0000 | 0 | No error, last call completed | Continue |
| W#16#7002 | 28674 | Job in progress (DONE=0, ERROR=0) | Wait for DONE or ERROR; persistent value means no response from slave |
| W#16#8186 | 33158 | Port ID not found, or CM PtP not configured, or wrong slot | Verify HW ID in HW Config; ensure CM PtP is plugged in and powered |
| W#16#8188 | 33160 | Conflicting baud/parity/flow settings | Match EASYGEN settings exactly |
| W#16#8380 | 33664 | CRC error in received frame | Check termination, A/B polarity, cable shielding, baud rate mismatch |
| W#16#8381 | 33665 | Slave did not respond (timeout) | Verify slave address, check wiring, confirm slave is in run state |
| W#16#8382 | 33666 | Modbus exception code received from slave | Inspect data type, register range, function code compatibility |
| W#16#8383 | 33667 | Slave reported illegal data address | Recheck DATA_ADDR against the Modbus map; often the addressing-offset mistake |
| W#16#8387 | 33671 | Any pointer error (DATA_PTR malformed or DB too small) | Resize DB to DATA_LEN x 2 bytes |
Reference: Siemens MODBUS master library error description table, available in the library documentation linked above. A persistent 7002 followed by a later 8381 (timeout) confirms the slave never answers. A persistent 7002 followed by 8383 (illegal data address) confirms the slave is alive but the requested register does not exist. The second case is the one most likely to match the EASYGEN failure described.
RS-485 Physical Layer and Wiring
A multi-drop Modbus RTU bus on 2-wire RS-485 has three non-negotiable hardware rules. Skipping any of them is the most common reason a partial bus - like a 4-of-14 mix - starts to fail while the other 10 slaves still respond.
- Termination. Place a single 120 ohm resistor between A and B at each physical end of the trunk cable. Do not place termination on intermediate nodes. On a daisy-chained loop, the master end and the last physical slave are the two ends.
- A/B polarity. The Siemens CM PtP labels the terminals "T/R" (transmit/receive) with two pins per direction. The EASYGEN 3000 labels them A (+) and B (-). All slaves on a bus must agree. A single reversed device will short-circuit the bus and silence the entire segment, including any device that is still correctly wired.
- Stub length. The drop cable from the trunk to each device should not exceed 30 cm at 19200 bit/s. Use a true daisy chain, not a star, with the trunk running continuously past each device.
Step-by-Step Resolution Procedure
-
Confirm the EASYGEN 3000 configuration on the device. Navigate the EASYGEN front panel to
COMM > Modbusand write down the slave address (1-247), baud rate, parity, and stop bits. Note them on a commissioning sheet. - Validate the slave from a PC tool first. Run Modscan32 on a laptop connected to the same physical bus (or temporarily at the EASYGEN terminals). Set slave ID, baud 19200, 8N1, function 03, register 50009, length 55. Confirm valid data. This proves the physical layer, addressing, and EASYGEN configuration are correct. Do not skip this step.
- Inspect the STEP 7 / TIA project for the failing PTP module. Open HW Config (STEP 7 V5.5) or the device configuration (TIA Portal) for the seventh ET200SP station. Confirm the CM PtP is plugged in, has a valid HW ID, and that exactly one Modbus_Comm_Load instance references that HW ID. A common defect is a second CM PtP with a different HW ID in the same station that is never initialized, which causes the master block to keep waiting on a port that was never set up.
- Fix the PORT_ID mismatch that produces STATUS 8186. Re-read the HW ID of the CM PtP from the properties dialog. Feed it into the Modbus_Comm_Load input verbatim. If you copy the ID from an older project, rebuild HW Config first so the symbol table updates.
-
Correct the DATA_ADDR value. Replace
450009with50009(1-based) at the Modbus_Master block input. Reduce DATA_LEN to 1 for the first test cycle to isolate the addressing issue from the data type issue. - Set the correct MODE. For the legacy S7-300/400 library (FB 7/8), MODE is not used and the data follows Modbus standard 1-based numbering. For TIA Portal Modbus library (FB 1800/1801), MODE=0 is standard Modbus and matches Modscan semantics. MODE=1 enables Siemens-notation offsets; do not use it unless the documentation for your library release explicitly says so.
- Reduce to a single-register read for the first test. Change DATA_LEN to 1 and DATA_PTR to a 2-byte area in the working DB. Trigger REQ once and observe STATUS. A 7002 that resolves to 0000 (DONE=1) confirms the addressing and port. A 7002 that resolves to 8383 confirms the slave is alive but the register number is wrong (re-verify against the EASYGEN Modbus map).
-
Restore the full 55-register read and verify the data type. For each EASYGEN register, determine whether it is INT16, UINT16, INT32, or REAL. Two registers are required per 32-bit value. Update DATA_PTR to
P#DB100.DBX0.0 BYTE 110for 55 INT16 registers or the equivalent byte count for the mixed-type layout. -
Verify the slave address of the EASYGEN. The user reported address 69 (0x45). Confirm against
COMM > Modbuson the device. A single wrong digit here will look identical to a 7002 forever signature because the master is asking a slave that does not exist. - Recheck RS-485 wiring and termination. Verify 120 ohm at the master end and at the last physical slave only. Disconnect the failing EASYGEN units one at a time; if communication to the remaining devices improves, you have either a termination or a polarity problem on the removed segment.
Verification and Acceptance Test
After the corrective actions, run the following acceptance checks. Each one should be repeatable on every cycle for at least 10 minutes before the loop is declared healthy.
| Check | Expected | Pass criteria |
|---|---|---|
| Modbus_Comm_Load STATUS | W#16#0000 with DONE=1 after first call | No 8186, 8188 in STATUS_HISTORY |
| Modbus_Master STATUS | W#16#0000 with DONE=1 after each REQ | No 7002, 8380, 8381, 8382, 8383 in STATUS_HISTORY |
| Scan time | Single 55-register read completes in < 30 ms at 19200 bit/s | OB 1 cycle time does not grow |
| Data values | Match Modscan readout byte for byte | Watchdog in the application code does not detect any out-of-range |
| Long-term | > 24 h without a single error | STATUS_HISTORY log stays empty |
Capture a status snapshot in a watch table with the following variables so the test is reproducible: MD_MASTER.DONE, MD_MASTER.BUSY, MD_MASTER.ERROR, MD_MASTER.STATUS, MD_LOAD.DONE, MD_LOAD.STATUS. If the acceptance checks pass on this PTP module but the symptoms reappear on others, apply the same procedure to the second CM PtP module - the underlying commissioning defect is usually present in both instances of the block.
Frequently Asked Questions
What does Siemens MODBUS master STATUS W#16#7002 mean?
W#16#7002 is the in-progress code raised by Modbus_Comm_Load and Modbus_Master while DONE=0 and ERROR=0. It is normal during the request cycle. The defect is indicated by 7002 persisting across many OB 1 cycles, which means the master is waiting for a slave reply that never arrives. Always pair 7002 with ERROR and STATUS transitions over time before drawing a conclusion.
What does STATUS W#16#8186 mean on Modbus_Comm_Load?
W#16#8186 indicates that the PORT_ID input cannot be matched to a configured CM PtP. The most common causes are a stale HW ID copied from an older project, a CM PtP that is present in the hardware catalog but not actually inserted in the ET200SP station, or a duplicate Comm_Load instance on a single PTP module. Re-read the HW ID from the device properties of the CM PtP and rebuild the hardware configuration.
How do I convert the EASYGEN 6-digit address 450009 to Siemens DATA_ADDR?
Drop the leading function-code digit and the type prefix. 450009 becomes the raw register number 50009. In the legacy S7-300/400 MODBUS library (FB 7/8) and in Modscan, this maps to DATA_ADDR = 50009 (1-based). In libraries that use 0-based addressing, use DATA_ADDR = 50008. Never feed the 6-digit prefixed form into DATA_ADDR; the slave does not have a register at 450009.
Why do the PMU controllers respond but the EASYGEN 3000 do not on the same cable?
Because the master blocks for the PMU controllers and the EASYGEN controllers are two separate Modbus_Master instances. The PMU master was likely configured against a different CM PtP module that is correctly initialized with the correct DATA_ADDR. The EASYGEN master is configured against a CM PtP that is either uninitialized (8186) or pointing at an address (450009) that no slave recognizes. The physical bus is healthy; the configuration is not.
How do I know whether to use MODE=0 or MODE=1 on the Modbus_Master block?
Use MODE=0 (standard Modbus) for the TIA Portal Modbus library when you want DATA_ADDR to follow Modbus 1-based register numbering, identical to Modscan. MODE=1 enables Siemens-notation offsets and is reserved for projects that previously used the S7-300/400 FB 7/8 library with a configured offset; the data type and address behavior changes when MODE=1. In either case, never feed the 6-digit prefixed form into DATA_ADDR.
Should I add 120 ohm termination on every EASYGEN 3000 stub?
No. 2-wire RS-485 requires exactly one 120 ohm terminator at each physical end of the trunk cable. With a CM PtP at one end and a single physical-end slave at the other, the count is two. Adding termination to intermediate EASYGEN units loads the bus and causes reflection symptoms that can look identical to a slave that does not respond.