Skip to main content

A Python implementation of the CANopen standard. The aim of the project is to support the most common parts of the CiA 301 standard in a simple Pythonic interface. It is mainly targeted for testing and automation tasks rather than a standard compliant master implementation.

The library supports Python 3.8 or newer.

Features

The library is mainly meant to be used as a master.

  • NMT master

  • SDO client

  • PDO producer/consumer

  • SYNC producer

  • EMCY consumer

  • TIME producer

  • LSS master

  • Object Dictionary from EDS

  • 402 profile support

Incomplete support for creating slave nodes also exists.

  • SDO server

  • PDO producer/consumer

  • NMT slave

  • EMCY producer

  • Object Dictionary from EDS

Installation

Install from PyPI using pip:

$ pip install canopen

Install from latest master on GitHub:

$ pip install https://github.com/canopen-python/canopen/archive/master.zip

If you want to be able to change the code while using it, clone it then install it in develop mode:

$ git clone https://github.com/canopen-python/canopen.git
$ cd canopen
$ pip install -e .

Unit tests can be run using the pytest framework:

$ pip install -r requirements-dev.txt
$ pytest -v

You can also use unittest standard library module:

$ python3 -m unittest discover test -v

Documentation

Documentation can be found on Read the Docs:

http://canopen.readthedocs.io/en/latest/

It can also be generated from a local clone using Sphinx:

$ pip install -r doc/requirements.txt
$ make -C doc html

Hardware support

This library supports multiple hardware and drivers through the python-can package. See the list of supported devices.

It is also possible to integrate this library with a custom backend.

Quick start

Here are some quick examples of what you can do:

The PDOs can be access by three forms:

1st: node.tpdo[n] or node.rpdo[n]

2nd: node.pdo.tx[n] or node.pdo.rx[n]

3rd: node.pdo[0x1A00] or node.pdo[0x1600]

The n is the PDO index (normally 1 to 4). The second form of access is for backward compatibility.

import canopen

# Start with creating a network representing one CAN bus
network = canopen.Network()

# Add some nodes with corresponding Object Dictionaries
node = canopen.RemoteNode(6, '/path/to/object_dictionary.eds')
network.add_node(node)

# Connect to the CAN bus
# Arguments are passed to python-can's can.Bus() constructor
# (see https://python-can.readthedocs.io/en/latest/bus.html).
network.connect()
# network.connect(interface='socketcan', channel='can0')
# network.connect(interface='kvaser', channel=0, bitrate=250000)
# network.connect(interface='pcan', channel='PCAN_USBBUS1', bitrate=250000)
# network.connect(interface='ixxat', channel=0, bitrate=250000)
# network.connect(interface='vector', app_name='CANalyzer', channel=0, bitrate=250000)
# network.connect(interface='nican', channel='CAN0', bitrate=250000)

# Read a variable using SDO
device_name = node.sdo['Manufacturer device name'].raw
vendor_id = node.sdo[0x1018][1].raw

# Write a variable using SDO
node.sdo['Producer heartbeat time'].raw = 1000

# Read PDO configuration from node
node.tpdo.read()
node.rpdo.read()
# Re-map TPDO[1]
node.tpdo[1].clear()
node.tpdo[1].add_variable('Statusword')
node.tpdo[1].add_variable('Velocity actual value')
node.tpdo[1].add_variable('Some group', 'Some subindex')
node.tpdo[1].trans_type = 254
node.tpdo[1].event_timer = 10
node.tpdo[1].enabled = True
# Save new PDO configuration to node
node.tpdo[1].save()

# Transmit SYNC every 100 ms
network.sync.start(0.1)

# Change state to operational (NMT start)
node.nmt.state = 'OPERATIONAL'

# Read a value from TPDO[1]
node.tpdo[1].wait_for_reception()
speed = node.tpdo[1]['Velocity actual value'].phys
val = node.tpdo['Some group.Some subindex'].raw

# Disconnect from CAN bus
network.sync.stop()
network.disconnect()

Debugging

If you need to see what’s going on in better detail, you can increase the logging level:

import logging
logging.basicConfig(level=logging.DEBUG)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

canopen-2.4.1.tar.gz (111.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

canopen-2.4.1-py3-none-any.whl (67.2 kB view details)

Uploaded Python 3

File details

Details for the file canopen-2.4.1.tar.gz.

File metadata

  • Download URL: canopen-2.4.1.tar.gz
  • Upload date:
  • Size: 111.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for canopen-2.4.1.tar.gz
Algorithm Hash digest
SHA256 20a84bc498b34dadd79cece467d3bbe19591c1c02a8f39331bcc6065c4d8b2eb
MD5 8d79bea6f61915c300f619cc32cfc7a9
BLAKE2b-256 beeaf2654cb432988dfe9ab93140ff502f7e2e7eaa1835e8aaa4ee5a935af736

See more details on using hashes here.

File details

Details for the file canopen-2.4.1-py3-none-any.whl.

File metadata

  • Download URL: canopen-2.4.1-py3-none-any.whl
  • Upload date:
  • Size: 67.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for canopen-2.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 651dfb189978fb9083f491128e9fb8cb0e85dc8ccb82b12dd7139236d0080b77
MD5 85e637e5b856c3660a052834e32c36c1
BLAKE2b-256 80d3386a7814c6d3f4209350067ec6ae9618ac7bd1807df244855362d221f263

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.4.1 This release

2 files

2.3.0

2 files

2.2.0

2 files

2.1.0

2 files

2.0.0

2 files

1.2.1

2 files

1.2.0

2 files

1.1.0

2 files

1.0.0

2 files

0.9.0

2 files

0.8.1

2 files

0.8.0

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.1

1 file

0.5.0

1 file

0.4.0

1 file

0.3.0

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page