Configuring WinCC Modbus TCP Driver for Non-Modicon PLCs

David Krause12 min read
SCADA ConfigurationSiemensTutorial / How-to
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 WinCC Modbus TCP/IP Driver

The Siemens WinCC SCADA suite ships with a native Modbus TCP/IP channel driver (Modbus TCPIP.chn) intended primarily for communication with Schneider Electric (formerly Modicon) controllers. The driver presents only three PLC class entries in its connection properties dialog:

  • Modicon 984
  • Modicon Compact / Quantum / Momentum
  • Modicon Premium / Micro

When the target controller is not a Schneider product — for example a Hitachi R-700 series (PLU500), an HMS eWON 2005 RTU, a generic Modbus TCP slave, or a third-party PLC with a Modbus server — the question becomes which class to select, whether communication will work, and how to map tag addresses correctly. Field experience shows that any of the three Modicon classes can be used as a logical "container" for a non-Modicon device, provided the target speaks standard Modbus TCP/IP. The driver itself is intentionally limited: Siemens describes it as a driver "with only very few options for setup" that "offers very little to customize the reply" if protocol deviations occur on the slave side.

When the native driver falls short, a Modbus TCP OPC bridge (such as the Lectus Modbus OPC Server) inserted between the slave and WinCC is the standard fallback. This article documents the full configuration path, the addressing rules, the field-proven trial-and-error workflow, and the OPC alternative.

Prerequisites

Item Requirement
WinCC version WinCC V7.x, WinCC Professional (TIA Portal), or WinCC Runtime Advanced/Professional with "Modbus TCP/IP" channel option installed
Channel file Modbus TCPIP.chn present in \bin\ subdirectory of the WinCC project
Network Ethernet TCP/IP reachability between WinCC station and Modbus slave (port 502 open, firewall rules verified)
Slave documentation Modbus function codes supported (FC03 holding, FC04 input, FC05/06 coils, FC15/16 multiple coils/registers), unit ID (slave address 1-255), register map
Test tool Modbus slave simulator (e.g. modpoll, Modbus Tools, or a software Modbus slave) for address verification before connecting the real PLC
Port 502: Standard Modbus TCP listens on TCP/502. Some industrial devices require the unit ID to be set explicitly even on TCP — the Modbus TCP/IP header includes a Unit Identifier (1 byte) for this purpose. Confirm the slave's expected behavior before commissioning.

Strategy for PLC Class Selection with Non-Modicon Devices

The WinCC driver dialog does not refuse non-Modicon devices, but it does not validate them either. The class selection is effectively a protocol variant selector. Use the following decision matrix when the target is not a Schneider PLC:

Selected Class Address Space Mapping Best Fit For
Modicon 984 0x / 1x / 3x / 4x addressing, 6-digit numeric Older Modbus TCP slaves using the original 984 address conventions; legacy third-party devices emulating 984
Compact / Quantum / Momentum 0x / 1x / 3x / 4x, 5-digit numeric, native Modbus TCP Most modern Modbus TCP slaves — recommended default for non-Modicon devices
Premium / Micro Same 5-digit numeric with Unity-style variable handling Schneider Premium/Micro PLCs; functionally interchangeable with Compact/Quantum for raw register access

For any non-Schneider PLC, the practical recommendation is to select Modicon Compact, Modicon Quantum, Modicon Momentum. This is the most widely used container in field installations reading from generic Modbus TCP slaves, software simulators, and RTUs. The class name does not have to match the actual vendor — it only selects the address translation and framing rules used by the WinCC channel DLL.

Step-by-Step Configuration of the Modbus TCP/IP Channel

1. Add the Channel

  1. Open WinCC Explorer.
  2. Right-click Tag Management and select Add New Driver.
  3. Choose Modbus TCPIP.chn from the driver list. A new channel node ModbusTCPIP appears under Tag Management.

2. Create a Connection

  1. Right-click the ModbusTCPIP channel node and select New Connection.
  2. Open the connection Properties dialog.
  3. Set the parameters:
    • IP Address: target slave IPv4 address (e.g. 192.168.1.50).
    • Port: 502 unless the slave listens on a non-standard port.
    • PLC Class: select Modicon Compact / Quantum / Momentum for third-party slaves (see Strategy section).
    • Station Address (Unit ID): 1-255, default 0 or 1 depending on firmware revision.
    • Cycle / Update time: typical 1000 ms; tune according to scan budget.

3. Define Tags

Tags are added under the connection node. The address format is what trips up most engineers coming from a non-Modbus background. The WinCC Modbus driver uses a numeric address only — the function code prefix (4x, 3x, 0x, 1x) is implied by the data type / address block of the tag, not entered explicitly.

WinCC Address Field Mapping Modbus Function Code Used
Holding register (e.g. WORD) 4xxxxx, offset-only FC03 (Read Holding Registers) / FC06 / FC16
Input register 3xxxxx, offset-only FC04 (Read Input Registers)
Output coil (bit) 0xxxxx, offset-only FC01 / FC05 / FC15
Input contact (bit) 1xxxxx, offset-only FC02
Critical addressing rule: Enter the offset only, not the full 4xxxxx number. If the slave register is documented as 40001, 400100, or 410001, the value to enter in the WinCC address field is 0 or 1 — the driver adds the base internally. Submitting the full 5- or 6-digit number is the most common configuration error and produces a "bad address" or timeout response.

4. Verify with a Software Modbus Slave First

Before pointing the channel at the real PLC, install a software Modbus TCP slave on the engineering station. The slave's request log shows exactly which FC and which register the WinCC driver is trying to read. This is the fastest way to debug an address-mapping problem:

  1. Start a software Modbus slave (e.g. Modbus Tools, diagslave, Modbus Slave by WinTech).
  2. Configure it to listen on 0.0.0.0:502.
  3. In WinCC Tag Management, set the connection IP to 127.0.0.1.
  4. Enable the channel and watch the slave's request log. Each WinCC tag generates a request; confirm:
    • Function code matches the tag type (FC03 for holding, FC04 for input).
    • Register address matches the slave's expected base + offset.
    • Unit ID matches.
  5. Once the round-trip works against the simulator, change the connection IP to the real PLC IP and reload the project.

Tag Addressing Worked Examples

Slave Documentation Shows Slave Register Number WinCC Address to Enter Notes
40001 (first holding register) 0 0 Offset, not the full 5-digit
400100 (six-digit convention) 99 99 Strip the leading 4 and subtract 1
410001 (Unity / Premium style) 10000 10000 6-digit mode if Premium class selected
30001 (first input register) 0 0 Select "Input" data type, not Holding
00001 (first coil) 0 0 Select "Binary Tag" with coil type

If a tag request is rejected with an "Illegal Data Address" exception (Modbus exception code 02), the offset is wrong. If the channel logs a connection error or timeout, the IP, port, or unit ID is wrong.

Verification and Diagnostics

After the channel is enabled, validate communication using the following checks:

  1. WinCC Channel Diagnosis: open the channel's diagnostic dialog and confirm "Connection Established" and "OK" status for each tag. Any tag with a quality of bad or uncertain indicates either a wrong address or a non-responsive slave.
  2. Tag Simulator: in the tag properties, enable the simulator and force a known value. Verify the read-back is correct end-to-end.
  3. Channel trace: enable Modbus TCP channel logging (via ModbusTCPIP.log in the WinCC diagnostics directory) to capture raw request/response frames.
  4. Wireshark capture: capture TCP/502 traffic from the WinCC station; confirm MBAP header, function code, and exception codes. This is the definitive way to spot a slave that is silently dropping requests or returning a corrupted payload.

OPC Bridge Alternative for Stubborn Slaves

The native WinCC Modbus driver is intentionally thin. When the target slave:

  • Uses a non-standard function code not supported by the driver,
  • Requires a custom Unit ID behavior,
  • Uses signed/unsigned byte-swapping that the driver cannot reorder,
  • Sits behind a gateway that needs a specific handshake,

the field-proven alternative is to insert a Modbus TCP OPC server between the slave and WinCC. WinCC ships with an OPC DA client channel; the OPC server handles the Modbus-side quirks and exposes standard DA items that WinCC consumes without modification.

Workflow:

  1. Install a third-party Modbus OPC server (commercial options include Kepware, Matrikon, Softing; low-cost options include the Lectus Modbus OPC Server, which is widely used in this role for non-Modicon slaves).
  2. Configure the OPC server with the slave's IP, port, and unit ID. Map each register to a DA item, applying any byte/word swapping rules.
  3. In WinCC, add the OPC channel driver (OPC.chn).
  4. Browse the OPC server's namespace from inside WinCC and bind tags to the DA items.
  5. Verify the same way as the native driver (diagnostic dialog, tag simulator, channel trace).

This indirection solves a class of problems that the native Modbus TCP driver cannot, because the OPC server can be configured with much more granular control over polling, exception handling, and data type conversion. It also makes future migrations easier: swapping out the physical PLC does not require touching the WinCC side, only the OPC server's device configuration.

Security note: When using an OPC bridge, lock down the OPC server's DCOM configuration and the Windows firewall. An OPC server that listens on the network without proper ACLs is a known attack surface in industrial environments. Restrict the OPC_ENUM and DCOM traffic to the engineering and SCADA VLANs only.

Field-Validated Reference Examples

Target Device Device Type WinCC PLC Class Used Outcome
HMS eWON 2005 RTU Industrial Modbus TCP gateway/RTU Modicon Compact / Quantum / Momentum FC03 reads and FC16 writes succeeded once address was corrected to offset-only
Generic Software Modbus Slave Test/diagnostic Modicon Compact / Quantum / Momentum Full read/write capability confirmed; slave log used to identify correct offsets
Hitachi R-700 series (PLU500) Third-party PLC with Modbus TCP server Modicon Compact / Quantum / Momentum (trial and error) Direct driver works if Hitachi supports standard FC03/FC16; otherwise OPC bridge is the fallback

Troubleshooting Matrix

  • Right-click channel > "Open"; in the runtime, activate the project; verify the WinCC Runtime service is started
  • Verify the connection's Station Address (Unit ID) and the slave's configured Unit ID; confirm each connection has the correct IP
  • Symptom Likely Root Cause Corrective Action
    Channel stays "Disconnected" Wrong IP, port 502 blocked, no route, PLC in stop, firewall on engineering station ping the PLC IP; telnet <ip> 502 from the WinCC station; check Windows Firewall inbound/outbound rules; verify PLC is in run with Modbus TCP server enabled
    Connection OK, all tags show "bad quality" Address entered as full 4xxxxx number instead of offset Strip the leading 4 and subtract 1; re-enter the offset only
    Tags flicker or report intermittent timeouts Network congestion, scan time too aggressive, PLC busy, broadcast storm Increase update time; check switch port error counters; isolate on a dedicated VLAN; reduce tag count per scan group
    Modbus exception 02 (Illegal Data Address) Address out of range on the slave, or wrong data type (e.g. reading input register FC04 from a holding-only device) Cross-check against the slave's register map; verify the function code implied by the WinCC tag type
    Modbus exception 03 (Illegal Data Value) Register count in the request exceeds slave buffer or violates a defined block boundary Split the tag group or use single-register addresses
    Values read are swapped or wrong order Byte order / word order mismatch (Big Endian vs Little Endian, word swap) Apply byte/word swap in the tag's format adjustment; if driver does not support the required swap, switch to an OPC bridge that does
    Driver loads but cannot find any tags Channel added but not enabled; project not yet activated on the runtime
    Only one of multiple slaves responds Unit ID collision or all connections routed to the same IP because of a typo

    Performance and Scan Budget Considerations

    Each WinCC Modbus tag configured with a fast update time generates an individual request (or a grouped request if tags are in the same address range and the driver groups them). For a non-Modicon PLC, treat the channel as a "best-effort" master and apply these rules:

    • Group tags into logical scan groups with matched update times (e.g. fast 250 ms for alarms, slow 2000 ms for measurements).
    • Avoid mixing FC01/FC02/FC03/FC04 in a single tight group — most third-party slaves handle mixed FC traffic more slowly than segregated polling.
    • If the slave supports a larger PDU, request blocks of registers rather than single registers to reduce request overhead.
    • Use a dedicated NIC on the WinCC station for SCADA traffic if the station is also a workstation.

    Limitations of the Native Driver and When to Migrate to OPC

    Siemens documentation and field experience converge on a clear set of limits. Migrate from the native WinCC Modbus TCP driver to an OPC bridge when any of the following apply:

    • The slave requires a non-standard function code (e.g. FC23 for read/write multiple registers with custom semantics).
    • The slave uses a proprietary byte or word order that the driver's "Word Swap" / "Byte Swap" settings cannot accommodate.
    • You need redundancy (active/passive or active/active Modbus masters) — the native driver is single-master.
    • You need a Modbus serial or Modbus RTU over TCP encapsulation that the native driver does not expose.
    • You want to expose the same Modbus data to multiple SCADA clients (WinCC, Historian, MES) without duplicating the driver configuration.

    For everything else — a non-Modicon PLC that speaks standard Modbus TCP/FC03 and FC16 — the native driver is sufficient and is the recommended first attempt. Most non-Schneider PLCs in this category connect successfully on the first try once the addressing rule is applied.

    Which WinCC PLC class should I select for a non-Schneider PLC like the Hitachi R-700 (PLU500)?

    Select Modicon Compact / Quantum / Momentum. The class name is a protocol variant selector, not a vendor lock-in. Most generic Modbus TCP slaves — including the Hitachi R-700 series — will accept standard FC03/FC16 traffic when this class is used, and the addressing follows the 4xxxxx offset-only rule.

    Why does my WinCC Modbus tag report an error even though the address looks correct?

    The WinCC Modbus driver expects the offset only, not the full 4xxxxx number. If the slave register is documented as 40001, the WinCC address field should be 0 (not 40001 or 40000). Verify the actual request on a software Modbus slave to confirm the offset the driver is generating.

    Is there any guarantee that a third-party PLC will communicate with the native WinCC Modbus TCP driver?

    No. The native driver is intentionally thin and offers very few setup options. Standard Modbus TCP/FC03 and FC16 traffic will work on most non-Schneider PLCs, but any protocol deviation (non-standard FC, byte/word order mismatch, custom Unit ID behavior) will fail. In those cases, insert a Modbus TCP OPC server between the slave and WinCC.

    What port does WinCC Modbus TCP use and is it configurable?

    Port 502 is the standard Modbus TCP port and is the default in the driver. If the slave listens on a non-standard port, enter the alternate port in the connection's properties. The driver does not support MBAPS (Modbus Application Protocol Secure / TLS) — for encrypted Modbus traffic, use an OPC bridge with TLS support.

    What Modbus function codes does the WinCC Modbus TCP driver support?

    The native driver supports the core read/write function codes: FC01 (read coils), FC02 (read discrete inputs), FC03 (read holding registers), FC04 (read input registers), FC05 (write single coil), FC06 (write single register), FC15 (write multiple coils), and FC16 (write multiple registers). Function codes outside this set (e.g. FC23, encapsulated custom FCs) are not supported and require an OPC bridge.

    Back to blog