文章目录
一、前言
对象字典的映射变量是用户程序与CANopen程序(Canfestival)之间的通讯桥梁,目的是能让用户程序与CANopen程序(Canfestival)通讯。例如CANopen从站0x05的用户程序每隔1S时间读取一次按钮是否被按下,当按钮被按下时,修改映射变量obj_Var_Buttom为1,当按钮抬起时,修改映射变量obj_Var_Buttom为0。CANopen主站可以通过SDO通讯,从CANopen节点0x05读取映射变量obj_Var_Buttom的状态。CANopen主站就能了解CANopen节点0x05上按钮的状态。
这里有一个问题,CANopen主站怎么知道CANopen节点0x05有obj_Var_Buttom这个映射变量呢?CANopen主站怎么知道呢?
答案:CANopen从站0x05的对象字典可以输出eds格式,然后提供给CANopen主站就好了。当我们设计完CANopen从站后,必须将最新的对象字典(输出eds格式)提供给编写CANopen主站程序的同学。目的是让CANopen主站掌握CANopen从站的对象字典的内容(比如PDO映射了哪些映射对象,CANopen从站有多少个映射变量等)。
STM32工程:
链接:https://pan.baidu.com/s/1bX5-BZSA3JQ8KS8-H_M8ng
提取码:jutn
二、实验目的
在对象字典上创建映射变量obj_Var_Buttom,并让用户程序去修改它。最后,我用CAN盒子(收发器)发送SDO报文从CANopen节点0x05获取obj_Var_Buttom的当前值(使用SDO获取映射对象的值不是本节的重点,纯演示)。
测试硬件:
三、对象字典
3.1、找到工程里的对象字典文件
根据电脑里的工程地址,打开.od后缀的对象字典文件。
3.2、创建映射变量
最后的结果:
四、STM32代码
4.1、Slave1.c
一切很顺利,接着开始用用户程序修改对象字典创建的映射变量obj_Var_Buttom。
4.2、main.c
编译,下载,再进入Debug模式观察obj_Var_Buttom的确被修改为0x01。
五、CAN盒子(收发器)
上面演示了在对象字典里创建映射对象obj_Var_Buttom,并通过用户程序去修改映射对象obj_Var_Buttom。最后,用CAN盒子(收发器)充当CANopen主站,发送SDO报文从CANopen从站0x05获取obj_Var_Buttom的值。
关于SDO报文的相关细节,后续有博文详细介绍。这里主要是“演示CANopen主站通过SDO指令可以从CANopen从站那里获取映射对象的信息。”
5.1、通过SDO方式获取obj_Var_Buttom的值
从CAN盒子看到,CANopen从站0x05以每2秒的时间间隔发送心跳报文。这里有一个重点,在pre-Operational状态下是可以使用SDO方式进行通讯的,但PDO方式是关闭的。
使用CAN盒子发送以下CAN报文,CANopen从站0x05有回复,从回复的CAN报文得知映射变量obj_Var_Buttom的值是1。
再验证一次吧,我用Keil的Debug功能将obj_Var_Buttom改为0x08,再使用CAN盒子发送SDO报文,看看CANopen从站0x05怎样答复吧。
从CANopen从站0x05答复的CAN报文看到,映射变量obj_Var_Buttom的确是0x08!