While attempting to set up a periodic task to synchronously write/read PDOs using an IXXAT USB-to-CAN and the canopen package, an AttributeError is generated due to the IXXATBus object missing _periodic_tasks (see: traceback below).
import canopen
net = canopen.Network()
net.bus = net.bus.bus
print(len(net.bus._periodic_tasks))
Runs without error. But, there should be no need to unwrap the inner bus object in this way.
Traceback and logs
Traceback (most recent call last):
line 78, in <module>
main()
line 54, in main
network.start_nodes(net, 0.5)
start_nodes
node.rpdo[pdo].start(sync_time)
line 449, in start
self._task = self.pdo_node.network.send_periodic(
"...\canopen\network.py", line 220, in send_periodic
return PeriodicMessageTask(can_id, data, period, self.bus, remote)
"...\canopen\network.py", line 294, in __init__
self._start()
"...\canopen\network.py", line 297, in _start
self._task = self.bus.send_periodic(self.msg, self.period)
"...\python_can\can\bus.py", line 239, in send_periodic
periodic_tasks = self._periodic_tasks
AttributeError: 'IXXATBus' object has no attribute '_periodic_tasks'
Bus attributes on 4.0.0:
['RECV_LOGGING_LEVEL', 'abstractmethods', 'class', 'delattr', 'dict', 'dir', 'doc', 'enter', 'eq', 'exit', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_abc_impl', '_apply_filters', '_detect_available_configs', '_matches_filters', '_recv_internal', '_send_periodic_internal', 'bus', 'channel_info', 'fileno', 'filters', 'flush_tx_buffer', 'recv', 'send', 'send_periodic', 'set_filters', 'shutdown', 'state', 'stop_all_periodic_tasks']
Bus attributes on 3.3.4:
['CHANNEL_BITRATES', 'RECV_LOGGING_LEVEL', '_IXXATBus__set_filters_has_been_called', 'class', 'delattr', 'dict', 'dir', 'doc', 'enter', 'eq', 'exit', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'lt', 'metaclass', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_apply_filters', '_channel_capabilities', '_channel_handle', '_control_handle', '_detect_available_configs', '_device_handle', '_device_info', '_inWaiting', '_matches_filters', '_message', '_payload', '_periodic_tasks', '_receive_own_messages', '_recv_internal', '_scheduler', '_scheduler_resolution', '_send_periodic_internal', '_tick_resolution', 'channel', 'channel_info', 'filters', 'flush_tx_buffer', 'recv', 'send', 'send_periodic', 'set_filters', 'shutdown', 'state', 'stop_all_periodic_tasks']
Description:
While attempting to set up a periodic task to synchronously write/read PDOs using an IXXAT USB-to-CAN and the canopen package, an AttributeError is generated due to the
IXXATBusobject missing_periodic_tasks(see: traceback below).Update: After digging around with pdb, it looks like there's some additional wrapping applied to the
IXXATBusobject - storing the actualbusobject in its own attribute (self.bus) rather than returning the bus object itself to the caller ofinterface.Bus.__new__. If the bus object held by the canopen library'snetworkobject is replaced with thebusobject inside thebusobject returned frominterface.Bus.__new__, then there is no issue as the_periodic_tasksarray is initialised correctly in that innerbusobject:e.g.
Runs without error. But, there should be no need to unwrap the inner
busobject in this way.Expected behavior
On v3.3.4, it is possible to use
node.rpdo[pdo].startornetwork.sync.startfrom thecanopenpackage (on its latest 2.0.0 release) without any errors being generated. Calling the constructor does not resolve the issue on V4.0.0, however, manually settingbus._periodic_tasks = []functions as a workaround.The
busobject returned byinterface.Bus.__new__on V3.3.4 contains an empty_periodic_tasksarray. On V4.0.0, the user must accessbus.busin order to access it.Additional context
OS and version: Windows 10 Professional (10.0.19044 Build 19044)
Python version: Python 3.9.10, also confirmed with Python 3.10.3
python-can version: 4.0.0
python-can interface/s (if applicable): IXXAT.
Traceback and logs
Bus attributes on 4.0.0:
['RECV_LOGGING_LEVEL', 'abstractmethods', 'class', 'delattr', 'dict', 'dir', 'doc', 'enter', 'eq', 'exit', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_abc_impl', '_apply_filters', '_detect_available_configs', '_matches_filters', '_recv_internal', '_send_periodic_internal', 'bus', 'channel_info', 'fileno', 'filters', 'flush_tx_buffer', 'recv', 'send', 'send_periodic', 'set_filters', 'shutdown', 'state', 'stop_all_periodic_tasks']
Bus attributes on 3.3.4:
['CHANNEL_BITRATES', 'RECV_LOGGING_LEVEL', '_IXXATBus__set_filters_has_been_called', 'class', 'delattr', 'dict', 'dir', 'doc', 'enter', 'eq', 'exit', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'lt', 'metaclass', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_apply_filters', '_channel_capabilities', '_channel_handle', '_control_handle', '_detect_available_configs', '_device_handle', '_device_info', '_inWaiting', '_matches_filters', '_message', '_payload', '_periodic_tasks', '_receive_own_messages', '_recv_internal', '_scheduler', '_scheduler_resolution', '_send_periodic_internal', '_tick_resolution', 'channel', 'channel_info', 'filters', 'flush_tx_buffer', 'recv', 'send', 'send_periodic', 'set_filters', 'shutdown', 'state', 'stop_all_periodic_tasks']