本文记录一下实际使用CANopen时开启多个主机遇到的问题
一 问题描述
本人在嵌入式设备上用Python CANopen库写一个SDO,由于数据比较多,就使用了Segment download,大概需要传6个Segment,实际写的时候只写了2个Segment,突然出现一个abort报文把写过程打断,重复测试多次问题依旧…
二 问题分析
先是检查了Python CANopen库的源码,在Segment download的代码中把所有发送abort报文的地方都加了打印,最后再运行,发现Python CANopen没有发送观察到的abort报文…
按理说也是对的,因为Segment download是比较基本的功能,不应该会出错的。。。
三 问题根源
最后发现是因为多主机的问题,设备在别的地方还连接了一个master主机,当我们发送SDO报文时,2个主机都会接收到SDO的response,额外接的这个主机收到了非预期的报文就会出错,然后发送abort报文。
把这个master断开就没问题了。
四 模拟
最后使用代码模拟一下,本文问题里额外的主机在正常使用时不发送报文,本人使用Python CANopen按照这个情况来模拟2个主机时不会出错,说明这个也是和master的具体代码有关。
这里使用VCAN0来让2个主机写同一个OD,最后报文如下,
master1.py内容如下,
import time, os
import canopen
network = canopen.Network()
node = canopen.RemoteNode(6, 'test.eds')
network.add_node(node)
network.connect(bustype='socketcan', channel='vcan0')
time.sleep(5)
FileSize = os.path.getsize('random.bin')
infile = open('random.bin', 'rb')
outfile = node.sdo.open(0x100A, mode='wb', block_transfer=False, size=FileSize)
data = infile.read()
outfile.write(data)
time.sleep(1)
infile.close()
outfile.close()
time.sleep(1)
network.disconnect()
master2.py内容和master1.py一样,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)