什么是对象字典(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
鸣声驱动器的CANopen手册示例是这样说的:
实际上,发这些报文就是使能并启动电机了。再往设置转速的对象(60FFh
)里写设定值 ,电机就会按这个转速旋转。