一、前言
当设计一个CANopen节点(从站)时,必须必须打开SDO服务器功能。只有CANopen从站打开SDO服务器功能后,CANopen主站才能读写CANopen从站的对象字典。
为什么CANopen主站要修改CANopen从站的对象字典?
以前我调试过一个CANopen伺服驱动器,品牌是德国ELMO。伺服驱动器上电后只发出一个上线报文,接着并没有定期发送心跳报文。此时,就需要使用SDO指令去修改ELMO伺服驱动器对象字典里的0x1017 Producer Heartbeat Time为0x7D0,让它每隔2S时间往总线上发送心跳报文。有一些CANopen产品需要在它上电之后,CANopen主站通过SDO指令配置它们的对象字典,让它们达到控制要求。比如心跳报文的频率,还有PDO映射对象,PDO的发送参数等(这些知识后续会用实验讲解)。我也调试过上海鸣志的CANopen伺服驱动器,上海鸣志的CANopen产品支持对象字典掉电保存。这样的好处是CANopen主站不需要每一次在CANopen从站上电后对它们的对象字典进行设置(通过SDO指令),CANopen主站的程序就变得更加简单了。总之,CANopen从站一定要开启SDO服务器。
测试的硬件如下:
STM32工程:
链接:https://pan.baidu.com/s/1dtuJnqIoSHlPIBpWKJmyhw
提取码:n1se
二、实验的目的
使用Objdictedit软件修改.od对象字典文件,打开CANopen节点的SDO服务器功能。接着,使用CAN盒子发送SDO报文指令修改CANopen从站的0x1017 Producer Heartbeat Time(从0x7D0改为0x3E8)。最后通过CAN盒子观察CANopen从站发送心跳报文的频率是不是1秒1次。
三、对象字典OD
3.1、Slave1.od
使用对象字典软件Objdictedit打开工程上的对象字典文件Slave1.od(在我这个演示工程上的命名)。
从下图看到,这个对象字典已经打开了SDO服务器功能。
为了演示如何开启SDO服务器功能,我将当前的SDO服务器删除。
开始在对象字典文件上创建SDO服务器把。首先,在下面的“添加”栏目上选择“SDO服务器“。
然后点击“添加”按钮,完成SDO服务器的创建。
最后,生成Slave1.c文件。
3.2、Slave1.c
在Slave1.c里,找到“index 0x1200 :Server SDO Parameter"的备注,表示已经打开SDO服务器功能了。
然后编译代码,将新的代码烧录到STM32里。
四、CAN盒子(收发器)
4.1、通过SDO方式修改CANopen从站的心跳时间
查看心跳时间在对象字典里的位置与信息。
接着,使用CAN盒子充当CANopen主站,使用SDO报文修改CANopen从站的心跳间隔时间。