diff --git a/canopen/node/remote.py b/canopen/node/remote.py index 07462422..2a52be0a 100644 --- a/canopen/node/remote.py +++ b/canopen/node/remote.py @@ -147,8 +147,16 @@ def __load_configuration_helper(self, index, subindex, name, value): def load_configuration(self): ''' Load the configuration of the node from the object dictionary.''' + # First apply PDO configuration from object dictionary + self.pdo.read(from_od=True) + self.pdo.save() + + # Now apply all other records in object dictionary for obj in self.object_dictionary.values(): - if isinstance(obj, ODRecord) or isinstance(obj, ODArray): + if 0x1400 <= obj.index < 0x1c00: + # Ignore PDO related objects + logger.debug(f"{obj.index:#06x}: {obj.name} already applied by pdo.save()") + elif isinstance(obj, ODRecord) or isinstance(obj, ODArray): for subobj in obj.values(): if isinstance(subobj, ODVariable) and subobj.writable and (subobj.value is not None): self.__load_configuration_helper(subobj.index, subobj.subindex, subobj.name, subobj.value) diff --git a/canopen/pdo/base.py b/canopen/pdo/base.py index 52a0aa04..ad143f30 100644 --- a/canopen/pdo/base.py +++ b/canopen/pdo/base.py @@ -314,11 +314,20 @@ def add_callback(self, callback: Callable[["Map"], None]) -> None: self.callbacks.append(callback) def read(self, from_od=False) -> None: - """Read PDO configuration for this map using SDO.""" + """Read PDO configuration for this map + + :param from_od: + Read using SDO if False, read from object dictionary if True. + When reading from object dictionary, if DCF populated a value, the + DCF value will be used, otherwise the EDS default will be used instead. + """ def _raw_from(param): if from_od: - return param.od.default + if param.od.value is not None: + return param.od.value + else: + return param.od.default return param.raw cob_id = _raw_from(self.com_record[1])