Lv.的博客

CanOpen 什么是对象字典(Object Dictionary)



想象CANopen的应用场景之一——电机控制

控制器通过CAN总线控制电机1和电机2。同时需要,电机1和电机2把实时的状态参数返回给控制器,两者之间大概有以下通信内容:


要完成这些通信项目,控制器和电机之间,必然要规定一个通信协议。比如,什么报文是控制启动/停止的,怎样的报文是调节速度的,怎样的报文是编码器信息等等。这个协议就是对象字典要描述的,有了一个电机(驱动器)的对象字典,控制器才能知道怎么控制一个电机,并获取电机的各种运行状态,就像两者沟通的桥梁(不好意思,我只能解释成这样了😂,具体可以看CiA301协议原文)

对一个有11位ID和8个字节数据的标准帧。如果说11位的ID分类规定了CANopen一个大的报文类型,那么对象字典对8个字节数据的意义作了具体描述。对象字典规定,在服务数据对象(SDO)中8个字节的数据框架是这样的

字节0 字节1 字节2 字节3 字节4 字节5 字节6 字节7
cs index_low index_high sub_index d0 d1 d2 d3
cs 功能码,一个字节,比如,在SDOtx中0x2f,0x2b, 0x27, 0x23分别表示跟在字索引后面的数据长度为1个字节,2个字节,3个字节,4个字节。在SDOrx中,0x60表示收到了正确的回复,0x80表示错误
index(索引) , 主索引占两个字节,子索引占一个字节,对象字典就是对,每个索引对应的对象,及对象的属性(长度,类型,是否可映射PDO等)的说明
比如,CiA402中 索引0x6040对应的对象是控制字

数据,最大占4个字节,低位字节在前
具体例子:
以6040h这个对象简述之。
之前用过鸣志的电机 ,官方的CANopen手册中,截取一段看看:

再来看看6040h控制字这个对象每一个位的具体含义,CiA402协议中是这样定义的

M Mandatory表示强制执行,O Optional表示可选,按我的理解,标记为M的位,电机厂家在制订协议时必须按CiA402执行, 标记为O的位,厂家可以自定义,鸣志的控制字定义如下

可以看出,16位控制字中,标记为M的 7,3,2,1,0位确实是按CiA402执行的,根据实际使用经验:位3,2,1,0是控制电机使能/去使能; 位8置1是停止电机,位7置1是清除错误

向控制字,即6040h写0x000f,那么8个字节的数据是这样的:

0x2b // 写两个字节,所以这里是2b
0x40 0x60 // 索引
0x00 // 子索引 6040没有子索引
0x0f 0x00 // 16位的数据
0x00 0x00 // 最后两个是不关心的,直接写00
// 完整字节序
0x2b 0x40 0x60 0x00 0x0f 0x00 0x00 0x00

比如这个电机nodeid为3,把这个数据通过SDO发出,则加上11位ID的话:

0x06 0x03 0x2b 0x40 0x60 0x00 0x0f 0x00 0x00 0x00
1
鸣声驱动器的CANopen手册示例是这样说的:

实际上,发这些报文就是使能并启动电机了。再往设置转速的对象(60FFh)里写设定值 ,电机就会按这个转速旋转。
————————————————
版权声明:本文为CSDN博主「victor_zy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/victor_zy/article/details/121830071

posted @ 2022-08-10 13:31  Avatarx  阅读(571)  评论(0编辑  收藏  举报