NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4834 most downloaded on PyPI
CANopen stack implementation
Last release 1 years ago
05 Aug 2025
Ships fairly regularly
a new release about every 8 months
Nearly every release is documented
notes for 19 of 19 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
42 releases · first in 2016
This will be the last release compatible with Python 3.8, which has already reached end-of-life state since 2024.
This will be the last release compatible with Python 3.8, which has already reached end-of-life state since 2024.
export_od and import_id by @erlend-aasland in https://github.com/canopen-python/canopen/pull/473import_od() by @erlend-aasland in https://github.com/canopen-python/canopen/pull/484Full Changelog: https://github.com/canopen-python/canopen/compare/v2.3.0...v2.4.1
One column per quarter.
This release requires Python 3.8 at the minimum. It is now using some language features introduced in 3.7 and a newer setuptools dependency that itsel
This release requires Python 3.8 at the minimum. It is now using some language features introduced in 3.7 and a newer setuptools dependency that itself needs 3.8. A big benefit from this is better annotations for type checkers, now advertised through a py.typed marker. These are far from complete though and the library code itself still fails on many static typing checks.
The lower-level python-can library dependency (version 4.4.0) introduced an incompatible change, which is worked around in this release:
A big Thank You goes out to @sveinse and @friederschueler for their very active participation in getting this release into shape.
Full Changelog: https://github.com/christiansandberg/canopen/compare/v2.2.0...v2.3.0
Fixed HighLimit and LowLimit for SIGNED values in EDS by @friederschueler in https://github.com/christiansandberg/canopen/pull/345
Full Changelog: https://github.com/christiansandberg/canopen/compare/v2.1.0...v2.2.0
Adding retransmit functionality to SDO block download by @samsamfire in https://github.com/christiansandberg/canopen/pull/324
Full Changelog: https://github.com/christiansandberg/canopen/compare/v2.0.0...v2.1.0
Respect rtr_allowed in Pdo.Map.Save() by @skalkoto in https://github.com/christiansandberg/canopen/pull/228
Thanks @acolomb and @af-silva.
Support for the CiA 402 device profile for "drives and motion control" was overhauled in this release, bringing some backwards-incompatible changes. The goal is to make the library more flexible and easier to use from an application requiring DS402 functions, especially when controlling several synchronized motors.
CAUTION: The following changes will likely require adaptation if you are using the respective functions in your application code!
The BaseNode402.homing() method no longer changs the DS402 power state machine. A suitable state needs to be set by the application before using it. (#249)
Remove the broken parameter set_new_home from the BaseNode402.homing() implementation, which did not work as intended. (#250)
After homing, restore the previous operation mode only when explicitly requested using the restore_op_mode parameter. (#262)
Minimize side-effects of operation mode switching. Do not clear the target values and keep the power state unchanged. This must now be handled in the application, but enables some use-cases where switching modes on the fly is desirable. (#251)
Changes to the Controlword no longer trigger an immediate RPDO transmission if already configured as periodic. That is the case when .start() has been called or the .period property was set externally. For an RPDO whose transmission type indicates that it needs a SYNC object to apply, the immediate sending is also skipped. Check the .is_periodic property to see whether this will change anything in your usage.
The .op_mode property is now handled via PDO if possible, otherwise setup_402_state_machine() logs a warning and falls back to SDO, just like for the Statusword. Note that if the PDO is expected periodically, the getter still blocks (up to 0.2 seconds) until a TPDO update was received. (#257)
Reduce overhead in setup_402_state_machine() procedure by not switching the NMT state or the power state automatically. The application should be responsible for that. Only the NMT STOPPED state will now trigger an error before trying to read SDOs. Reading the PDO configuration can even be skipped altogether using the optional read_pdos parameter. (#259)
Enhancements:
The documentation page concerning device profiles was extended to include the relevant API description for the BaseNode402 class.
All timeout and waiting durations have been moved to constants in the BaseNode402 class. They can thus now be overridden per instance.
BaseNode402.is_homed() to check whether homing is necessary, switching the operation mode automatically as required. (#248)
Make PDO subscription available without calling read() or save(). (#253)
The DS402 power state machine is now more flexible by trying to reach any target state even if there is no direct transition. Some bugs were fixed as well, such as not trying transitions which only the drive itself can trigger. (#264)
Run-time optimizations:
Supported operation modes are now cached internally to avoid reading object 0x6502 repeatedly as it should never change. (#247)
Several actions which depend on an updated Statusword value now wait for a TPDO reception (up to 0.2 seconds), if the PDO is expected periodically. This can reduce some delays previously caused by checking loops with fixed delays. (#263)
Full Changelog: https://github.com/christiansandberg/canopen/compare/v1.2.1...v2.0.0
Nothing published for this version
Fix when calling stop_node_guarding() twice
stop_node_guarding() twice (#224)Drop Python 2.7 support (although it may still work)
import_from_node() (#192)Added fallback in statusword property
Since the API has been pretty stable and no real bug reports have been filed for a long time, the project could now be considered stable in the sense
Since the API has been pretty stable and no real bug reports have been filed for a long time, the project could now be considered stable in the sense that we now will follow semantic versioning rules.
Fix deprecation of collections module.
SDO data size truncated to length of the default value in the EDS
SyncProducer.stop() if Network.sync.start() was not called (#128)Improved DS-402 profile support
Nothing published for this version
Fixes bug where node.pdo.save() will not work after mapping PDOs using OD names.
node.pdo.save() will not work after mapping PDOs using OD names.Improves compatibility with more "exotic" CANopen implementations (most notably Curtis drives).
Improves compatibility with more "exotic" CANopen implementations (most notably Curtis drives).
EMCY resets are not handled differently than regular EMCY codes in callbacks and log anymore. Previously None was used to represent a reset in the cal
None was used to represent a reset in the callbacks and it was not added to the log. Now resets are represented as a EmcyError with code 0.Nothing published for this version
Fix EMCY reset (discovered by @racerep, see #43)
Experimental SDO block transfer
Major changes since v0.4.0:
And some more fixes
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Release highlights since v0.3.0:
Release highlights since v0.3.0:
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
After a series of development uploads to PyPI this is a more proper release of 0.3.0.dev10.
After a series of development uploads to PyPI this is a more proper release of 0.3.0.dev10.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Some more documentation added (still far from complete)
First development release that is uploaded to PyPI.
First development release that is uploaded to PyPI.
Your coding agent can read these notes before it upgrades. Set up the MCP server →