Changelog

3.0.0 (2026-10-30)

This release introduces a simplified state machine and reworked error handling for the EtherCAT master, making its behavior easier to follow and more predictable. It contains breaking changes which may require adjustments in user code. See State Machine for a description of the new states and transitions.

Breaking changes that may need attention:

  • The states SETUP, READY and STARTING are merged into the new state CONFIG (SystemState value 11). FAILED_SETUP, STOPPING and STOPPED are removed. The values of the remaining states are unchanged.

  • If the setup fails with an error that most likely requires a change in configuration, the application now terminates with an error message (including a hint how to fix the problem, if available) instead of staying alive in FAILED_SETUP.

  • The commands Restart and ContinueWithError are replaced by the Reset command. It acknowledges an error and returns to CONFIG. It is only accepted in ERROR and once no communication faults are detected anymore. See Commands.

  • RequestMasterState is now allowed in all states except SHUTDOWN. In ERROR and ERROR TRANSITION, only INIT, PREOP and SAFEOP can be requested (OP requires a Reset first).

  • The last requested master state is no longer re-requested automatically after an error. Entering ACTIVE always requires an explicit request of OP.

  • PDO automations are removed. They will be reintroduced in a more general component.

  • On the OPC UA server, the State variables of the master and the slaves and the targetState argument of requestState are now of the custom enumeration EcatStateEnum instead of UInt32. On the Control Port, the argument of requestMasterState is now an enum.

Other notable changes:

  • The new variable CyclicFaultIndicator on the status port and the OPC UA server indicates cyclic communication faults.

  • Under certain circumstances it was possible that slaves remained in OP while the Master was in SAFEOP in the error state. In ERROR, slaves in a higher state than the master are now brought down to the master’s state as soon as they are reachable.

  • If a transition to OP fails for one slave, all slaves are transitioned back to SAFEOP automatically.

  • Logging was migrated to another logging framework. The format is slightly different now.

Details

🚀 Features

  • feat: Add exception mechanism which contains a remedy

  • feat: Use quill as logging library

  • feat: Log all Acyclic Events with level INFO and WARNING

  • feat: Expose FaultCounter on status port

  • feat!: Expose the EtherCAT master and slave states as an enum on the OPC UA server

  • feat: Add the enum map for the master state to the status and control port

🐛 Fixes

  • fix!: Remove ‘restart’ command

  • fix!: Throw if setup fails with an unrecoverable error

  • fix!: Remove ‘FAILED_SETUP’ state

  • fix!: Do setup before entering the statemachine

  • fix!: Transition from ‘READY’ and ‘STARTING’ to ‘ERROR’ if an error occurs

  • fix!: Merge ‘SETUP’, ‘READY’ and ‘STARTING’ into ‘CONFIG’

  • fix!: do cleanup in destructor instead of ‘SHUTDOWN’

  • fix!: Remove ‘STOPPING’ and ‘STOPPED’

  • fix!: Remove ‘continue’

  • fix: Add ‘reset’ command

  • fix!: do not re-request the last EtherCAT state on entering ‘CONFIG’

  • fix!: Allow all state requests in all system states except Error

  • fix!: Forbid OP requests in ERROR_TRANS

  • fix: Align slave state with master in ERROR

  • fix: Detect deviations from the master state in all states where cyclic communication is active

  • fix: Allow Reset only when the FaultCounter is zero

  • fix: Suppress repeated link layer events in the cyclic task

  • fix: Initialize SystemState with CONFIG

  • fix: Increase OPC-UA start timeout time and handle the error correctly

🔄️ Changes

  • refactor: Rename ‘IS_MASTER_ACTIVE’ to ‘IS_MASTER_RUNNING’

  • refactor: Introduce FaultCounter

  • refactor: Replace the EcatState constants with an enum class

🧰 Tasks

  • chore!: remove PDO Automations

📝 Documentation

  • docs: Write Real-Time according to the naming styleguide (#224)

  • docs: Link the real-time setup guide from the FAQ

  • docs: Fix the FAQ answer about lost frames

  • docs: Clean up markup leftovers in the configuration page

  • docs: Describe the dummy mode correctly

  • docs: Link the Python client and the Real-Time Port documentation

  • docs: Explain that the default transition timeout skips ERROR TRANSITION

  • docs: Explain the cyclic fault indicator in the state machine page

  • docs: Describe the commands once in the state machine page

  • docs: Add an overview chapter to the state machine

2.3.1 (2026-10-02)

Details

open62541 was bumped to 1.4.7 as a side effect in the last release. However, this version contains a breaking change which causes an error with the python client. This release pins open62541 to 1.4.14.

🐛 Fixes

  • fix: Pin open62541 to 1.4.14

2.3.0 (2026-10-02)

Details

This release improves the OPC UA interface.

Besides a performance improvement and two bugfixes (see below), it introduces a new OPC UA Variable. The “PackedImage” variable contains the whole process image (inputs and outputs) as a single ByteString. This can be used (as an alternative to the existing nodes) to improve performance for large process images or when all process variables must be read consistently from the same cycle.

🚀 Features

  • feat: improve OPC UA server response time

  • feat: Expose process image inputs and outputs as ByteString OPC UA variable

🐛 Fixes

  • fix: Check the slave index in SDO uploads and downloads

  • fix: initialize OPC UA PDO variables with zero in dummy mode

2.2.0 (2026-07-29)

Details

This release only adds a version field to the OPC UA server. Clients can now do compatibility checks.

Note: The next version will most likely be a breaking change, which requires adjustments in user code.

🚀 Features

  • feat: Add Version field to OPC UA and print version on startup

2.1.0 (2026-06-26)

This release adds support for SDO upload/download via the realtime-port interface.

Details

🚀 Features

  • feat: add realtime-port interface for SDO upload/download

2.0.0 (2026-06-23)

This release updates the realtime port interface to specification version 0.2.0

Breaking changes that may need attention:

  • the voraus-realtime-port library in the application needs to be updated to a compatible version

  • the default realtime-port registry location changed from /tmp to /dev/shm (same location as the shared memory)

Details

🚀 Features

  • feat: add a healthcheck to the docker image

  • feat: add cycle count and cycle start timestamp to status port

  • feat!: update realtime port interface to spec version 0.2

1.5.1 (2026-05-06)

This release includes two bug fixes:

  1. Some CLI options were not properly enforced as “required”, when the “run” command was (implicitly) used.

  2. In some cases, a requested transition to init was detected as an (unwanted) state change and therefore treated as an error.

Details

🐛 Fixes

  • fix: move all run related CLI options to run group

  • fix: explicitly default initialize all members of ApplicationOptions

  • fix: enforce ‘requires’ relation on defaulted run subcommand.

  • fix: Use mststate and reqmstate from cycctx in cyclic check for errors

1.5.0 (2026-04-17)

This release adds support for EtherCAT over Ethernet (EoE).

The virtual Ethernet ports of the devices are connected in a virtual switch. If the devices should be accessed from the host, the EtherCAT Master can be configured to provide a TAP interface, which is connected to the virtual switch.

Details

🚀 Features

  • feat: EoE (#145)

📝 Documentation

  • docs: Add an EoE bridge example config

  • docs: Add /dev/net/tun mount in example compose for EoE