使用Python CANopen库发送Domain对象时遇SdoAbortedError报错求助
解决CANopen Domain对象下载的SdoAbortedError问题
你遇到的SdoAbortedError: Code 0x06090011错误,核心原因是Domain类型对象(ObjectType=0x7)不存在子索引,但你在调用download()时传入了子索引0,导致节点返回子索引不存在的错误。
正确的调用方式
直接省略子索引参数,只传入对象索引和数据:
nodeHeadPort.sdo.download(0x6006, data=b'\x11\x22\x33\x44\x55')
如果你需要显式声明子索引(通常不需要),也可以传入None:
nodeHeadPort.sdo.download(0x6006, None, b'\x11\x22\x33\x44\x55')
为什么原来的代码会报错?
从你的EDS配置可以看到,[6006]的ObjectType=0x7(Domain对象),这类对象在CANopen规范里是无结构的单个对象,没有子索引的概念。你原来的代码传入子索引0,相当于请求访问0x6006:0,而节点的对象字典里根本不存在这个子索引,因此触发了0x06090011(Subindex does not exist)的中止码。
另外,你最初尝试的sdo['Config Data2'].phys = b'...'写法其实是正确的思路——它直接通过对象名访问,不需要手动指定子索引,如果这个写法之前没生效,可能是需要先确保节点的对象字典已正确加载EDS文件。
补充验证
从你提供的总线通信截图也能验证这一点:当你发送带子索引0的SDO请求时,节点返回了中止报文,明确指出子索引不存在。改用无子女索引的SDO下载请求,就能正常和节点通信了。
内容的提问来源于stack exchange,提问作者snowrunner
相关产品推荐
相关产品推荐

