CANOpen中SDO和PDO的COB-ID理解

CANOpen用来收发数据的通信对象有SDO(Service Data Object)和PDO(Process Data Object)


一 SDO和PDO的区别

SDO使用对象字典的Index和SubIndex来访问CAN节点的对象字典,可以读或者写。而PDO则不使用Index和SubIndex,它是两个CAN节点间约定好传输的数据内容对应哪些对象字典索引,收到数据后就直接读写相应的对象字典索引里的值。
由于SDO(常规)需要用到Index和SubIndex,所以一次最多传输4个字节,而PDO一次最多可以传输8个字节。
另外,SDO还有很多其它传输功能,这里就不细说了,有兴趣的可以看官方Spec。


二 PDO的COB-ID

PDO有2种,TPDO和RPDO,一个用来发送,一个用来接收。PDO通信参数里需要设置COB-ID。

对于TPDO来说,其通信参数中的COB-ID是自身的COB-ID,当发送TPDO时用来表明这个TPDO是谁发出的。
对于RPDO来说,其通信参数的COB-ID是发送方的COB-ID,用来表示自己只接受某个CAN节点发过来的TPDO。


三 SDO的COB-ID

SDO中的COB-ID有2个,分为:

  • Client ==> Server
  • Server ==> Client

乍一看有点晕,如果我们换个角度思考下就容易理解了,假如CAN节点A通过SDO去访问CAN节点B,那么A就是Client,B就是Server。

类似于平时上网时去打开百度,需要在浏览器的地址栏里输入百度的地址,然后就可以打开百度了。网民是Client,百度是Server,百度的网址就是Client==>Server的COB-ID。

这样在A的对象字典里,设置Client==>Server的COB-ID为B的COB-ID

而A的Server==>Client的COB-ID怎么设置呢?当A发送SDO给B时,B收到SDO后会回传一个SDO给A来表示应答。之前说了,A访问B,A是Client,B是Server,现在B回传一个应答SDO给A,那么路径就是Server==>Client,这样对于A来说,其Server==>Client的COB-ID还是B的COB-ID,用来表示收到的应答SDO是来自Server的。

可能会想到B的这两个COB-ID干嘛去了呢,对于B来说,只有B是Client时才会用到这2个COB-ID,如果B通过SDO去访问A,那么B的Client==>Server和Server==>Client的COB-ID就是A的COB-ID了。


四 总结

本文是自己在学习CANOpen中的一点心得体会,如果有写的不对的地方,请留言指正。谢谢阅读。

你可能感兴趣的:(嵌入式)