Skip to main content

CANopen library providing functionality to implement responder nodes

Project description

CANopen library to implement responder nodes.

Backends:

Synopsis

  • Pure python implementation

  • Under MIT license (2021 Günther Jena)

  • Source is hosted on GitHub.com

  • Tested on Python 3.7, 3.8, 3.9 and 3.10

  • Unit tested with pytest, coding style done with Black, static type checked with mypy, static code checked with Pylint, documented with Sphinx

  • Supporting CiA301 (EN 50325-4)

Feature List

  • Object dictionary

    • provides callbacks for validation, update, download and read

    • supports records, arrays and variables

  • EDS support

    • dynamically generation of EDS file

    • automatically provided via object 0x1021 (“Store EDS”)

  • up to 128 SDO servers

    • expetited, segmented and block transfer for up- and download

    • COB-IDs dynamically configurable

    • custom up- and download handlers supported

  • up to 512 TPDOs and 512 RPDOs

    • dynamically configurable

    • transmission types: synchronous (acyclic and every nth sync) and event driven

    • inhibit time supported

  • EMCY producer service

    • COB-ID dynamically configurable

    • inhibit time supported

  • Heartbeat producer service

    • dynamically configurable

  • NMT slave service

    • boot-up service

    • callback for state change provided

  • SYNC consumer service

    • COB-ID dynamically configurable

    • callback for received sync provided

  • CiA305 Layer Setting Service

    • fast scan supported

    • bitrate and node id configuring supported

    • identify remote responder supported

  • CAN interface abstraction

    • python-can fully supported

    • automatic CAN id filtering by subscripted services

  • Scheduling supporting threaded and async operation

TODO
  • build object dictionary via reading an EDS file

  • supporting MPDOs

  • TIME consumer service

  • Up- and download handler as io streams

Examples

Creating a node

import can
from durand import CANBusNetwork, Node, Variable, Record, DatatypeEnum

bus = can.Bus(bustype='socketcan', channel='vcan0')
network = CANBusNetwork(bus)

node = Node(network, node_id=0x01)

Congratulations! You have a CiA-301 compliant node running. Layer Setting Service is also supported out of the box.

Adding objects

od = node.object_dictionary

# add variable at index 0x2000
od[0x2000] = Variable(DatatypeEnum.UNSIGNED16, access='rw', value=10, name='Parameter 1')

# add record at index 0x2001
record = Record(name='Parameter Record')
record[1] = Variable(DatatypeEnum.UNSIGNED8, access='ro', value=0, name='Parameter 2a')
record[2] = Variable(DatatypeEnum.REAL32, access='rw', value=0, name='Parameter 2b')
od[0x2001] = record

Access values

The objects can be read and written directly by accessing the object dictionary:

print(f'Value of Parameter 1: {od.read(0x2000, 0)}')
od.write(0x2001, 1, value=0xAA)

Add callbacks

A more event driven approach is using of callbacks. Following callbacks are available:

  • validate_callbacks - called before a value in the object dictionary is going to be updated

  • update_callbacks - called when the value has been changed (via od.write or via CAN bus)

  • download_callbacks - called when the value has been changed via CAN bus

  • read_callback - called when a object is read (return value is used )

od.validate_callbacks[(0x2000, 0)].add(lambda v: v % 2 == 0)
od.update_callbacks[(0x2001, 2)].add(lambda v: print(f'Update for Parameter 2b: {v}'))
od.download_callbacks[(0x2000, 0)].add(lambda v: print(f'Download for Parmeter 1: {v}'))
od.set_read_callback(0x2001, 1, lambda: 17)

PDO mapping

PDOs can dynamically mapped via the SDO server or programmatically. The PDO indices start at 0.

node.tpdo[0].mapping = [(0x2001, 1), (0x2001, 2)]
node.tpdo[0].transmission_type = 1  # transmit on every SYNC

node.rpdo[0].mapping = [(0x2000, 0)]
node.tpdo[0].transmission_type = 255  # event driven (processed when received)

Install

pip install durand

Credits

This library would not be possible without:

Project details


Download files

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

Source Distribution

durand-0.4.13.tar.gz (36.3 kB view details)

Uploaded Source

Built Distribution

durand-0.4.13-py3-none-any.whl (31.1 kB view details)

Uploaded Python 3

File details

Details for the file durand-0.4.13.tar.gz.

File metadata

  • Download URL: durand-0.4.13.tar.gz
  • Upload date:
  • Size: 36.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for durand-0.4.13.tar.gz
Algorithm Hash digest
SHA256 a2d4b63664a790ab05424e105730ebfb9cf80c5afcecf32d26696201ed7d57ba
MD5 628fb49d3fdb12fa472b8278fa2c07c2
BLAKE2b-256 1bcb9dea282920e5a8814c48e428d0ebf7570a624e9016ed23aa5d5a807fe0d6

See more details on using hashes here.

File details

Details for the file durand-0.4.13-py3-none-any.whl.

File metadata

  • Download URL: durand-0.4.13-py3-none-any.whl
  • Upload date:
  • Size: 31.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for durand-0.4.13-py3-none-any.whl
Algorithm Hash digest
SHA256 bc9180d920333f90c0265df99eac68287f31505321157d0d966a5e8194ea81d3
MD5 c808636d8c0a888dda1ad1cc1f937955
BLAKE2b-256 9f71aed2b1e696b94e8c7d16b878f2d4b0a125c0626c86014c60ea9c2658c95a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page