LabWired The easy way to build hardware
Engineering

Running a full IO-Link master with no hardware

To develop for IO-Link you need a master, a device, a PLC and wiring on a bench — a lot of cable and connections to test things together. We ran the whole thing, a master stack and device stacks, talking over the C/Q wire, entirely in software! It works in your browser, and in CI.

Let’s say you want to exercise an IO-Link master’s stack. The ISDU parameter server, the cyclic process-data channel, the event path, data storage, all of them. And to do that you need a master, at least one device, the point-to-point wiring, power, and something driving the other end. The stack gets tested by hand, on a bench, and the regression coverage is thin.

LabWired lets developers run the whole exchange. A real master, devices, C/Q wire, all headless, in software, reproducible in a browser tab and on a GitHub CI runner.

How it works

Three virtual STM32L476 microcontrollers inside LabWired. One runs the iolinki master controller firmware; two run the iolinki device stack, each publishing its own process data (0xA5 and 0x3C). IO-Link is point-to-point, one device per master port, so these are separate MCUs, each with its own address space, wired by a modeled C/Q link.

The master’s real stack drives the wire, the device’s stack answers, the bytes cross a simulated UART, and the master checks what came back — the same firmware you’d compile for the silicon, running against itself over a simulated cable.

Three NUCLEO-L476RG boards — an IO-Link master and two sensor devices — wired over the C/Q UART links in the LabWired playground
Master + Sensor 1 + Sensor 2, each a real STM32L476 running real firmware, wired over the modeled C/Q links.

The full service surface

Reaching OPERATE and reading a cyclic process-data byte is the easy part. The point of a master stack is to run the whole surface on the wire. The test asserts each one completes after the link reaches OPERATE:

ServiceWhat crosses the wire
ISDU read / writeAcyclic parameter access — vendor-name index 0x0010 reads back "LABWIRED"
Cyclic process dataThe master’s PD-out byte is echoed back as the device’s PD-in (actuator mirror)
EventsA device WARNING event (0x8CA0) is triggered and read back
Data storageAn Application-Tag record is written and read back byte-for-byte

And because a master that only works when the wire is perfect isn’t a master, three fault paths are covered on the same modeled wire: a single CRC-corrupted frame is survived in place (the master retries and stays in OPERATE); sustained corruption exhausts the retry budget and drives the port to ERROR + restart; and a muted device is detected via response-timeout, instead of the port spinning as if all were well. Startup, cyclic data, acyclic services, events, storage, and the failure modes — the whole master, over a cable that only exists in software.

Try it! In your browser

The actual firmware, compiled to a WebAssembly build of the simulator, running in the frame below. Press Run; all three boards boot together and step in lockstep. Click a sensor board to watch it reach OPERATE and publish its process-data byte to the master.

The live station lab. Open full-screen ↗

The receipts

The browser lab and the CI model are the same firmware and the same simulator core, so the exchange in the tab above also runs headless on a CI runner, byte-checked, on every push. The iolink-native-c-master job boots the real master against the real device stack and asserts every service completes on the wire, green, in under two minutes, with no hardware in the loop.

GitHub Actions run for the Core IO-Link Native workflow — status Success, the iolink-native-c-master job green
The Core IO-Link Native workflow — the master-against-device service run, green in CI. See the runs ↗

A real IO-Link master, exercised across its full service surface by real device firmware, over a wire that only exists in software. Runnable, testable and observable in a browser tab, and gated in CI. No bench, no PLC, no cable.

Andrii Shylenko
Andrii Shylenko

Founder, LabWired.