S7-1500 ET200S 1SI Modbus FC03: Resolving LEN=8 Error 0E4A

David Krause17 min read
ModbusSiemensTroubleshooting
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

Overview of the ET200S 1SI Modbus Communication Stack

The Siemens ET200S 1SI serial interface module (order number 6ES7 138-4DF11-0AB0) adds a Modbus RTU master or slave port to an S7-1500 CPU over PROFINET. The module handles the entire Modbus Application Data Unit (ADU) on behalf of the CPU: it builds the request frame, computes and appends the CRC-16 checksum, transmits the frame, receives the response, validates the response CRC-16, and returns the validated payload to the CPU. The CPU only has to supply the function code and the function-specific data bytes through the S_SEND instruction that ships with the Siemens Point-to-Point communication library for S7-1500.

Engineers familiar with the classic CP 340 / CP 341 / CP 440 / CP 441 point-to-point modules will recognise the same CPU-to-CP split, but the ET200S 1SI is unique in that it is parameterised entirely through the GSD file (or HSP) inside TIA Portal and reuses the standard S7 point-to-point library blocks S_SEND, S_RCV, S_STATUS, and S_XON / S_XOFF rather than the older USS / Modbus master FBs. This article clarifies the most frequent configuration error encountered with this module: the misuse of the LEN input of S_SEND. LEN counts bytes transferred from the CPU into the CP, not bytes transmitted on the serial line. The on-wire byte count is always higher because the module adds the slave address prefix (in master role) and the CRC-16 suffix automatically.

Hardware Identification and Firmware Constraints

The relevant module is the ET200S serial interface, order number 6ES7 138-4DF11-0AB0. The "-0AB0" suffix denotes the hardware release shipping with the current firmware revision at time of order. Always cross-check the firmware (FW) version visible in the device properties of TIA Portal (or in the diagnostic buffer of the IM 151) against the release notes for the GSD file installed in the project. Newer firmware revisions add additional protocol options, longer receive buffers, and updated error codes; older firmware revisions on the same hardware article number reject frame layouts that newer firmware accepts. Always confirm compatibility before upgrading the IM 151 firmware in a running plant.

ET200S 1SI 6ES7 138-4DF11-0AB0 key parameters
Parameter Value
Order number 6ES7 138-4DF11-0AB0
Module class ET200S serial interface (1SI), distributed I/O
Physical layer RS-232, RS-422, RS-485 (2-wire and 4-wire), selectable per sub-module
Supported protocols Modbus RTU master, Modbus RTU slave, ASCII, 3964(R)
Baud rates 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200 bit/s
Parity / data bits 8E1, 8O1, 8N1, 8N2 (8 data bits + parity combinations)
Modbus CPU-side payload Up to 240 bytes per S_SEND call, function-code dependent
CRC-16 polynomial 0xA001 (reflected CRC-16/MODBUS, the Modbus-standard polynomial)
Inter-frame delimiter 3.5 character times (managed by firmware)
Operating temperature 0 to 60 °C horizontal mounting; 0 to 40 °C vertical mounting
Approvals CE, UL, cUL, FM, ATEX zone 2 (depending on revision)

For full electrical, mechanical, and diagnostic specifications, consult the Siemens "ET 200S Serial Interface Module" manual available from Siemens Industry Online Support by searching the order number.

Modbus FC03 Frame Specification and Byte Accounting

Modbus function code 03 ("Read Holding Registers") uses a fixed-size 8-byte request ADU on the RS-485 line regardless of slave vendor. The structure is:

Slave Addr FC = 03 Start Hi Start Lo Qty Hi Qty Lo CRC-16 Lo CRC-16 Hi LEN = 6 bytes (CPU payload into CP) + 2 bytes CRC-16 (firmware) Total on-wire ADU: 8 bytes Modbus Application Protocol V1.1b3, §6.3

Bytes 0 through 5 (the slave address, function code, two register bytes for the start address, and two register bytes for the quantity) are the bytes the user application must hand to the 1SI module. Bytes 6 and 7 are the CRC-16 little-endian checksum; the 1SI firmware computes them automatically from the preceding six bytes and appends them to the transmit shift register without involving the CPU.

The response ADU for FC03 varies with the quantity of registers requested: 1 byte slave address + 1 byte function code + 1 byte byte-count + 2×N register data bytes + 2 bytes CRC-16 = 5 + 2N bytes on the wire. Requesting 10 holding registers yields a 25-byte response. The 1SI module strips the slave address byte, validates the response CRC-16, and delivers only the function-code-through-byte-count payload to the CPU's S_RCV buffer (RD_i); the CRC-16 validation result is reported as a status bit, not as raw bytes.

The LEN Parameter: CPU-to-CP Payload, Not On-Wire Bytes

S_SEND has three inputs that are commonly confused:

S_SEND input parameters and their meaning
Input Meaning Modbus FC03 value
REQ Rising edge triggers a send job Clock pulse from application logic
LEN Number of data bytes taken from the SD_i buffer and handed from the CPU to the CP 6 (slave address + FC + start Hi/Lo + qty Hi/Lo)
DONE / STATUS / ERROR Active-bit and error diagnostics returned by the CP Monitor for 0E4A and other status codes

LEN does not count the slave address byte or the CRC-16 in Modbus master mode because the 1SI firmware synthesises those endpoint bytes itself. The 1SI manual is explicit: the value placed into the LEN input corresponds to the bytes the application must prepare in the SD_i buffer, which for FC03 equals six bytes. The "6-byte form" mentioned in the manual is therefore the user payload, not the on-wire frame.

A common engineering mistake is to size LEN to match the number of bytes the engineer expects to see on an oscilloscope or Modbus sniffer. That convention is correct only for protocol layers where the application builds the entire ADU (for example, transparent ASCII with manual CRC appended). In Modbus master mode on the 1SI it is incorrect, and the CP rejects oversized payloads with status code 0E4A.

S_SEND Instruction and Status Code 0E4A

When LEN=8 is supplied for a Modbus FC03 request, S_SEND returns error 0E4A (hexadecimal). The CP firmware interprets this as a parameter violation: the application is attempting to ship more payload bytes than the Modbus PDU for the selected function code permits. The error originates inside the CP, not in the CPU; the CPU-side STATUS word reflects the CP-to-CPU error mapping. The actual root cause is the LEN value, not a wiring, baud-rate, or timing problem. Replacing the cable, changing parity, or extending the response timeout will not resolve 0E4A.

Selected 1SI Modbus master error codes relevant to S_SEND
Code (hex) Meaning Corrective action
0E4A LEN exceeds the maximum allowed for the configured function code Reduce LEN to the FC-specific value (6 for FC03 read, 6 for FC06 write single, 7+2N for FC16 write multiple)
0E4B LEN less than the minimum required for the configured function code Increase LEN to match the function-code minimum
0E80 Parity error on received byte Verify slave parity, check for cable damage
0E81 Framing error (stop bit missing) Verify baud rate, check for ground potential differences
0E82 Overrun (CPU too slow) Reduce polling rate, raise OB1 priority
0E85 Break detected on the line Check RS-485 termination, verify A/B polarity
0E90 Modbus response timeout (no reply within configured window) Increase timeout, verify slave address, check slave power
0E91 Slave returned a Modbus exception Read RD_i[2] for exception code 01/02/03/04
0E92 CRC mismatch in slave response Check parity, baud, RS-485 termination, EMI shielding
0E93 Inter-character timeout in response Slave did not finish frame within window; reduce slave scan time

For the complete error-code list refer to the diagnostics section of the Siemens "ET 200S Serial Interface Module" manual at Siemens Industry Online Support.

CRC-16 Generation by the 1SI Firmware

The 1SI module uses the Modbus-standard CRC-16: polynomial 0xA001 (the reflected representation of 0x8005), initial value 0xFFFF, no final XOR, no reflection of output (input reflection only). The CRC is calculated over every byte preceding the checksum field, beginning with the slave address. The two resulting bytes are transmitted low-byte first, then high-byte. This is the same CRC used by every Modbus RTU device worldwide; the algorithm is documented in section 6.2.2 of the Modbus Application Protocol Specification V1.1b3 published by the Modbus Organisation.

Because the CRC is computed inside the 1SI firmware, the CPU never sees the two checksum bytes and never has to allocate buffer space for them. Manual calculation by the user is unnecessary and would in fact produce a doubly-CRC'd frame that no slave would accept. The same applies to the ASCII protocol variant, where the 1SI firmware adds the LRC byte automatically.

Critical: Never append your own CRC bytes to the SD_i buffer for a Modbus master transmission on the 1SI module. The CP will interpret the appended bytes as additional payload and will fail with 0E4A (too long), or if a larger function code were used, would silently corrupt the request because the firmware would still append its own CRC on top.

Building the Correct FC03 Request Buffer

The application code must populate the SD_i buffer with the six FC03 bytes in the order shown below. Example: read 10 holding registers from slave address 1 starting at register 0x0000.

// S7-1500 SCL example for FC03 read of 10 holding registers from slave 1
"iDB_Serial".SD[1] := 16#01;   // Slave address
"iDB_Serial".SD[2] := 16#03;   // Function code 03
"iDB_Serial".SD[3] := 16#00;   // Start address high
"iDB_Serial".SD[4] := 16#00;   // Start address low
"iDB_Serial".SD[5] := 16#00;   // Quantity high
"iDB_Serial".SD[6] := 16#0A;   // Quantity low (10 registers)
"iDB_Serial".LEN   := 6;       // CPU-to-CP payload length (NOT wire length)
"iDB_Serial".REQ   := TRUE;    // Trigger on rising edge

The buffer offsets depend on the SD_i data block layout declared when the S_SEND multi-instance DB is generated. The offsets in the example assume SD[1] is the first byte handed to the CP; in many library versions SD[1] starts at offset zero. Verify the offsets in the DB declaration generated by TIA Portal under "Program blocks > System blocks > [Instance DB] > SD_i".

LEN values for common Modbus function codes on the 1SI
FC Name LEN (CPU payload, excluding CRC-16) On-wire request length
01 Read Coils 6 8
02 Read Discrete Inputs 6 8
03 Read Holding Registers 6 8
04 Read Input Registers 6 8
05 Write Single Coil 6 8
06 Write Single Register 6 8
15 Write Multiple Coils 7 + ceil(N/8) where N = number of coils 10 + ceil(N/8)
16 Write Multiple Registers 7 + 2N where N = number of registers 11 + 2N
23 Read/Write Multiple Registers 11 + 2N where N = number of write registers 15 + 2N

Modbus exception codes the slave may return in RD_i[2] when the request is rejected:

Modbus exception codes returned by the slave
Code Name Meaning
01 Illegal Function Slave does not support the function code
02 Illegal Data Address Start address or end address outside slave map
03 Illegal Data Value Quantity=0 or quantity exceeds slave limit (125 for FC03, 123 for FC16)
04 Slave Device Failure Slave internal error during processing
05 / 06 / 08 / 0A / 0B Acknowledge / Slave Busy / Memory Parity / Gateway Path / Gateway Target Diagnostics; consult slave manual

Configuring the 1SI Module in TIA Portal

  1. Open the ET200S station in the device view of TIA Portal and insert the 6ES7 138-4DF11-0AB0 module into a free slot of the IM 151.
  2. Open the module properties and select the protocol "Modbus master (RTU)" for the chosen sub-module.
  3. Set the baud rate, parity, and stop bits to match the slave exactly. Any mismatch produces framing errors (0E81) or response timeouts (0E90).
  4. Configure the response timeout. Recommended initial value: 2000 ms; adjust per the worst-case slave turnaround time including its own scan cycle.
  5. Configure the inter-frame pause. Default 3.5 character times is correct for most baud rates. For 19200 bit/s and above, the firmware enforces the 3.5-character delimiter automatically; for sub-9600 baud rates verify the pause is at least 3.5 character times.
  6. Assign the sub-module identifier and slot according to the GSD file requirements.
  7. Compile the hardware configuration and download to the IM 151.
  8. Call S_SEND in a cyclic OB (typically OB1) and pair it with S_RCV in the same OB or a higher-priority OB depending on traffic volume.
  9. Use a clock-bit OB (or a timer) to pace the S_SEND requests; the slave needs time to process each request before the next one arrives.
Important: The 1SI module must be parameterised as Modbus master before S_SEND is called. If the module is left in transparent ASCII mode the CP will accept the 8-byte payload without complaint, but the slave will not respond because the framing, timing, and CRC handling are wrong, and the diagnostic bit for "protocol mismatch" will be set in the CP diagnostic buffer.

Diagnostic Block (S_RCV / S_STATUS) for Verification

Pair every S_SEND call with an S_RCV call on the same logical connection. S_RCV places the response payload into the RD_i buffer and returns a STATUS that decodes the CP-side diagnostics. The most useful STATUS values for verifying a successful FC03 exchange:

S_RCV status codes for FC03 verification
STATUS (hex) Meaning Interpretation
0000 New data received, no error Slave responded, CRC OK, payload in RD_i
1A0A Slave returned Modbus exception code Check the exception byte at RD_i[2]
1A10 CRC error in slave response Check parity, baud, RS-485 termination, cable length
1A11 Slave response timeout Increase timeout, verify slave address, scan cycle
1A12 Inter-character timeout in response Slave did not finish frame within configured window
1A13 Received frame length mismatch Slave returned wrong byte-count or wrong FC echo

If S_RCV never fires (DONE stays FALSE for the configured timeout), the most likely cause is that S_SEND itself never accepted the job: revisit LEN, the SD_i offsets, and the protocol parameterisation in TIA Portal.

Troubleshooting Matrix

Symptom to root cause mapping for ET200S 1SI Modbus FC03 issues
Symptom Most likely cause Diagnostic Fix
0E4A on S_SEND LEN too large for the function code Watch table on LEN; compare to FC spec Set LEN=6 for FC03 / FC06, 7+2N for FC16
No response from slave, no S_SEND error Slave address mismatch, parity/baud mismatch, A/B polarity reversed Modbus sniffer on the line; check wiring Match slave configuration; swap A/B if necessary
S_RCV returns exception code 02 Start address or quantity out of slave map Read RD_i[2] Verify the holding-register map of the slave
S_RCV returns exception code 03 Quantity=0 or quantity too large (max 125 for FC03) Read RD_i[2] Set quantity between 1 and 125 inclusive
Cyclic CRC errors in S_RCV (1A10) RS-485 termination missing, cable too long, EMI Oscilloscope on A/B Add 120 Ω termination at both ends, twisted shielded pair, shield grounded at one end only
Intermittent timeout after a few hours CP buffer overrun from too-fast S_SEND Time-correlated S_SEND trigger; CP diagnostic buffer Add inter-frame delay, reduce S_SEND rate, increase slave turnaround
S_SEND status alternates 0E90 / 0E91 Slave powers down under load or scan time too long Slave-side diagnostics; power supply monitor Decouple slave power, use regulated supply, slow CPU scan
Response is always slave address 0x00 RS-485 bus collision or echo from missing termination Sniffer trace Enable 120 Ω termination at both ends

RS-485 Wiring Notes Specific to the 1SI Module

The 6ES7 138-4DF11-0AB0 uses a sub-D connector on the front; pin assignments vary by sub-module. For RS-485 2-wire, the relevant signals are pin 2 (T(R)T) and pin 7 (T(R)T-) in 4-wire mode; for 2-wire mode pins 8 and 9 carry the data. Always cross-check the wiring diagram printed on the inside of the sub-module cover and the table in the Siemens manual. Common field faults include A/B swapped (which manifests as 0E85 break errors or zero-byte responses), shield grounded at both ends (which produces circulating currents and intermittent CRC errors), and missing failsafe bias resistors on a multi-drop bus.

Field tip: On long RS-485 runs (> 30 m) or noisy environments, add failsafe bias resistors (typically 680 Ω to +5 V on B and 680 Ω to GND on A) at the master end only. The 1SI module does not provide internal bias; slaves that also lack bias will produce floating-line errors when no slave is driving the bus.

Field Verification Procedure

  1. Connect an oscilloscope or Modbus sniffer to the RS-485 A/B lines. A simple USB-RS485 adapter running a tool such as the Siemens Modbus TCP/RTU scanner or a generic Modbus poll utility works well.
  2. Trigger S_SEND with LEN=6 and confirm the sniffer captures exactly 8 bytes: 01 03 00 00 00 0A plus a 2-byte CRC-16. The CRC-16 for this specific request is C5CD (little-endian on the wire: CD C5).
  3. Verify the CRC-16 in the captured frame using an off-line calculator. The polynomial 0xA001 over the six payload bytes must yield the captured CRC.
  4. Observe the slave's response: 01 03 14 followed by 20 register data bytes plus a 2-byte CRC-16. Total length 25 bytes.
  5. In TIA Portal, place a watch on the RD_i buffer and confirm RD_i[1] equals 0x03 (function code echo), RD_i[2] equals 0x14 (byte count, 20), and the subsequent bytes match the slave's known register contents.
  6. Force a deliberate error: set LEN=7 and verify that S_SEND reports 0E4A. This confirms the error path is exercised and that the test fixture is healthy.
  7. Revert LEN to 6 and capture the long-term CRC error count from the CP diagnostics. A non-zero count indicates a physical-layer issue rather than a configuration issue.
  8. Stress-test by sending 1000 requests at 50 ms intervals; verify no buffer overruns, no timeouts, and no CRC errors. Sustained errors at high rates point to slave latency rather than master configuration.

Alternative Controllers and Module Variants

The same LEN-vs-on-wire-byte distinction applies to other Siemens point-to-point modules that implement Modbus master: the CP 341 (6ES7 341-1xH0x-0AE0), CP 441-2 (6ES7 441-2AA0x-0AE0), and the newer CM PtP (6ES7 540-1AA0x-0AA0) for S7-1500. On all of them, LEN counts only the application-supplied payload; the Modbus framing and CRC are handled by the protocol firmware. Engineers migrating code between these modules should verify LEN values per module because the maximum allowed payload differs: CP 341 accepts up to 1024 bytes per call, CP 441 up to 4096, CM PtP up to 8192.

For non-Siemens Modbus masters (e.g. third-party PLCs, embedded microcontrollers), the convention is the opposite: LEN or its equivalent must include the slave address and the CRC, because those masters typically run a "raw Modbus" stack where the application owns the entire ADU. When porting code from such a master to the ET200S 1SI, subtract 3 from LEN (one byte address, two bytes CRC) to obtain the equivalent CPU payload size.

Frequently Asked Questions

Why does S_SEND reject LEN=8 for a Modbus FC03 request on the ET200S 1SI?

LEN=8 is rejected because the 1SI module already adds the two CRC-16 bytes to every Modbus master frame. The application only has to supply the 6 bytes of the Modbus request payload (slave address, function code, two-byte start address, two-byte quantity). Supplying 8 bytes pushes the total ADU to 10 bytes, which violates the FC03 request specification and triggers status 0E4A.

Is the CRC-16 generated by the 1SI module the standard Modbus CRC-16?

Yes. The 1SI firmware uses polynomial 0xA001 (reflected form of 0x8005), initial value 0xFFFF, no final XOR, with the result transmitted low byte first. This matches the Modbus Application Protocol Specification V1.1b3 from the Modbus Organisation and is what every Modbus RTU slave expects. No parameterisation is required to enable it.

What is the correct LEN value for FC06 and FC16 on the same module?

For FC06 (write single register) use LEN=6: slave address, function code, register address Hi/Lo, value Hi/Lo. For FC16 (write multiple registers) use LEN = 7 + 2N, where N is the number of registers written: slave address, function code, start address Hi/Lo, quantity Hi/Lo, byte count (always 2N), and 2N data bytes. The CRC-16 is appended automatically by the firmware in both cases.

Can I use the 1SI module as both a Modbus master and slave on the same physical port?

No. The 6ES7 138-4DF11-0AB0 must be parameterised as either master or slave; the two modes are mutually exclusive on a single sub-module. To run both, use two 1SI modules in the same ET200S station (one parameterised as master, one as slave) or use two sub-modules of the same physical module if the firmware revision supports multi-sub-module configuration. Verify against the GSD file release notes in Siemens Industry Online Support.

Where do I find the complete list of 1SI error codes including 0E4A?

The complete diagnostic and error-code list is published in the Siemens "ET 200S Serial Interface Module" manual, available in the entry list at Siemens Industry Online Support under the order number 6ES7 138-4DF11-0AB0. The manual distinguishes CP-internal parameter errors (0E4A, 0E4B) from Modbus-protocol errors (0E90 / 0E91 / 0E92 / 0E93) and from physical-layer errors (0E80-0E87).

Why does my Modbus sniffer see an 8-byte frame but the slave still does not respond?

An 8-byte capture confirms the 1SI module is transmitting the correctly framed FC03 request. A non-response means the slave is not driving the line, not hearing the master, or rejecting the request silently. Check, in order: slave power supply, slave Modbus address, parity and baud rate on the slave side, RS-485 A/B polarity, termination at both ends of the bus, inter-frame silence (some slaves need longer than 3.5 character times at low baud), and the slave's own request-to-response latency.

Back to blog