Skip to content

Commit 7f8ab9f

Browse files
erlend-aaslandacolomb
authored andcommitted
Skip saving and log read-only PDO parameters.
For PDO communication or mapping parameters which are read-only on a node, the PdoMap.save() method currently aborts with an SDO exception. However, individual parameters may simply not support configuration changes. Rely on the Object Dictionary to tell which ones are expected to fail and skip them. For communication record entries, log what is not being saved.
1 parent de0e644 commit 7f8ab9f

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

canopen/pdo/base.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
if TYPE_CHECKING:
1616
from canopen import LocalNode, RemoteNode
1717
from canopen.pdo import RPDO, TPDO
18-
from canopen.sdo import SdoRecord
18+
from canopen.sdo import SdoRecord, SdoVariable
1919

2020

2121
PDO_NOT_VALID = 1 << 31
@@ -404,18 +404,22 @@ def save(self) -> None:
404404
return
405405
logger.info("Setting COB-ID 0x%X and temporarily disabling PDO", self.cob_id)
406406
self.com_record[1].raw = self.cob_id | PDO_NOT_VALID | (RTR_NOT_ALLOWED if not self.rtr_allowed else 0x0)
407-
if self.trans_type is not None:
408-
logger.info("Setting transmission type to %d", self.trans_type)
409-
self.com_record[2].raw = self.trans_type
410-
if self.inhibit_time is not None:
411-
logger.info("Setting inhibit time to %d us", (self.inhibit_time * 100))
412-
self.com_record[3].raw = self.inhibit_time
413-
if self.event_timer is not None:
414-
logger.info("Setting event timer to %d ms", self.event_timer)
415-
self.com_record[5].raw = self.event_timer
416-
if self.sync_start_value is not None:
417-
logger.info("Setting SYNC start value to %d", self.sync_start_value)
418-
self.com_record[6].raw = self.sync_start_value
407+
408+
def _set_com_record(
409+
subindex: int, value: Optional[int], log_fmt: str, log_factor: int = 1
410+
):
411+
if value is None:
412+
return
413+
if self.com_record[subindex].writable:
414+
logger.info(f"Setting {log_fmt}", value * log_factor)
415+
self.com_record[subindex].raw = value
416+
else:
417+
logger.info(f"Cannot set {log_fmt}, not writable", value * log_factor)
418+
419+
_set_com_record(2, self.trans_type, "transmission type to %d")
420+
_set_com_record(3, self.inhibit_time, "inhibit time to %d us", 100)
421+
_set_com_record(5, self.event_timer, "event timer to %d ms")
422+
_set_com_record(6, self.sync_start_value, "SYNC start value to %d")
419423

420424
try:
421425
self.map_array[0].raw = 0
@@ -425,20 +429,16 @@ def save(self) -> None:
425429
# mappings for an invalid object 0x0000:00 to overwrite any
426430
# excess entries with all-zeros.
427431
self._fill_map(self.map_array[0].raw)
428-
subindex = 1
429-
for var in self.map:
432+
for var, entry in zip(self.map, self.map_array):
433+
if not entry.writable:
434+
continue
430435
logger.info("Writing %s (0x%04X:%02X, %d bits) to PDO map",
431436
var.name, var.index, var.subindex, var.length)
432437
if getattr(self.pdo_node.node, "curtis_hack", False):
433438
# Curtis HACK: mixed up field order
434-
self.map_array[subindex].raw = (var.index |
435-
var.subindex << 16 |
436-
var.length << 24)
439+
entry.raw = var.index | var.subindex << 16 | var.length << 24
437440
else:
438-
self.map_array[subindex].raw = (var.index << 16 |
439-
var.subindex << 8 |
440-
var.length)
441-
subindex += 1
441+
entry.raw = var.index << 16 | var.subindex << 8 | var.length
442442
try:
443443
self.map_array[0].raw = len(self.map)
444444
except SdoAbortedError as e:

0 commit comments

Comments
 (0)