《五》canfestival系列教程之sdo
如果把pdo比作高速公路,那么sdo就是普通的小路.
pdo高速公路虽然效率高,但是下雨,下雪,有雾的时会封路.(有干扰)
sdo小路有时候很方便,很稳定.
因为pdo发送是生产--消费模式.就是只管pdo发送,谁愿意接收就接收,不接收也无所谓.因为我不管有没有人接收,更不确定有没有送到.
相比之下,sdo就稳妥多了.它是服务器--客户端模式,就是客户发给我,我必须要回复,要对客户负责.这样有了来回消息交互,就不会出现数据错误.传输也比较稳定了.
canopen的知识点和概念比较多,也比较散,建议大家准备一个小本子,可以随时记录和查阅,用电脑记录实际上很不方便.(亲身体会......)

因为sdo稳定的特性,所以一般作为pdo不能使用时的应急方案,或者作为配置参数时使用的指令.
例如驱动器,上电后需要进行配置,这里使用的就是sdo.
(这里驱动器是服务端,电脑是客户端,用电脑去访问驱动器的参数.)
配置完成之后发送数据,为了效率,才使用pdo.
但是电机故障,需要查找错误的时候,可以切换到sdo进行错误的查找.

sdo是很重要的,因为大部分设备都需要进行参数配置.
就以支持canopen的驱动器为例,通过编写canfestival程序,配置驱动为速度模式.
在拿到驱动器后,可以先用sdo去读取内部的字典,
根据字典返回的数据,就知道驱动器当前的配置和运行模式.
这一节我们只讲解sdo发送的数据流程.
sdo的数据结构为:

例如:
601, 22 00 14 01 01 02 00 80
上面是一条sdo指令,
0x601: 发送时can的id,它由两部分组成,600+1,600代表了这时一条sdo. 1代表发送给1号节点的驱动器.
0x22: 写命令,向驱动器里面写入数据,就是图一中的指令字CS,它还有很多中,比如读是0x40,这里需要查找ds301协议.
0x00 14: 因为can是小端模式,真正的顺序是0x1400,这里是一个索引.
0x 01: 子索引,和上面的1400 组合在一起就是 1400,01索引.这个索引号是针对字典的,从字典表格中查找这个号(就相当于一栋楼的门牌号),这个索引里面"住"的数据,代表:驱动器接收的cob-id.
0x01 02 00 80: 数据,因为是小端模式.正常的数据顺序应该是0x 80 00 02 01.这条数据的意思是cob-id为0x80000201.
综上,整条语句的意思也就是,向驱动器1400,01索引中写入数据0x80000201.

如何把这条指令发送出去:
(从函数的名字也能看出这个是设置节点字典的,就是发送sdo的)
最核心的是writeNetworkDict()函数.


跳进去看一下


跳进去看一下,_writeNetworkDict