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,READYandSTARTINGare merged into the new stateCONFIG(SystemStatevalue 11).FAILED_SETUP,STOPPINGandSTOPPEDare 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
RestartandContinueWithErrorare replaced by theResetcommand. It acknowledges an error and returns toCONFIG. It is only accepted inERRORand once no communication faults are detected anymore. See Commands.RequestMasterStateis now allowed in all states exceptSHUTDOWN. InERRORandERROR TRANSITION, onlyINIT,PREOPandSAFEOPcan be requested (OPrequires aResetfirst).The last requested master state is no longer re-requested automatically after an error. Entering
ACTIVEalways requires an explicit request ofOP.PDO automations are removed. They will be reintroduced in a more general component.
On the OPC UA server, the
Statevariables of the master and the slaves and thetargetStateargument ofrequestStateare now of the custom enumerationEcatStateEnuminstead of UInt32. On the Control Port, the argument ofrequestMasterStateis now an enum.
Other notable changes:
The new variable
CyclicFaultIndicatoron 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
OPfails for one slave, all slaves are transitioned back toSAFEOPautomatically.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:
Some CLI options were not properly enforced as “required”, when the “run” command was (implicitly) used.
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