CanFestival是一个CANOpen的开源C库,本文讲述如何在Linux下使用CanFestival,代码来自https://github.com/happybruce/CanFestival,已经经过本人优化。
一 运行例子
使用git下载CanFestival,
git clone https://github.com/happybruce/CanFestival.git
下载完毕后,出现CanFestival目录,cd进入并创建build目录,然后执行下面语句,
cmake .. && make
这样就可以编译出master和slave,
PS:该例子源码位于CanFestival/examples/linux/dcf/下
接着执行下面语句创建vcan0
sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set up vcan0
创建好后开启三个终端,一个运行candump观察vcan0上的CAN报文,一个运行slave,一个运行master,,
运行candump
candump -t A vcan0
运行一个slave,
./slave vcan0 1 # 最后一个数字是模拟CAN设备(也就是slave)的的Node id,这里范围是[1,2,3]
运行master,
./master vcan0 # 这个master只检测CAN Node id为1,2,3的CAN设备
主要功能是:
- slave启动后进入pre-operational状态,并开始发送心跳报文
- master启动后会去搜索slave,找到后会发送NMT报文把slave变成operational状态
- slave变成operational状态后会发送PDO给master,master同样会发送PDO给slave
- 收到PDO后会修改对应的对象字典项的值,并打印出来
二 Linux下使用对象字典编辑器
上节的例子中使用的对象字典文件位于CanFestival/examples/linux/dcf/od/下,即masterdic.od和slavedic.od,这2个文件需要使用对象字典编辑器打开。
本人把对象字典编辑器变成CanFestival子模块,所以下载好CanFestival后,再下载其子模块即可,
cd CanFestival git submodule update --init --recursive
PS: 关于对象字典编辑器,可以看下这篇文章
下载完后可以在CanFestival目录下找到objdictgen目录,这个就是对象字典编辑器的源码,进入objdictgen后运行python objdictedit.py
点击File->Open,然后在CanFestival/examples/linux/dcf/od目录下找到masterdic.od和slavedic.od,选择并打开,
PS:可以在masterdic和slavedic之间来回切换,另外注意不是CanFestival/examples/linux/dcf下的od文件,那个是老的
打开后可以查看master和slave的对象字典的配置,同时也可以根据需要自行修改。改好后需要点击File下的Build Dictionary生成对应的.c/h文件,最后重新编译程序。
master的配置信息
masterdic.od里的内容如下,
- 0x1000 Device Type
- 0x1001 Error Register
- 0x1016 Consumer Heartbeat Time
- 0x1017 Producer Heartbeat Time
- 0x1018 Identity
- 0x1280 Client SDO 1 Parameter
- 0x1400 Receive PDO 1 Parameter
- 0x1401 Receive PDO 2 Parameter
- 0x1402 Receive PDO 3 Parameter
- 0x1600 Receive PDO 1 Mapping
- 0x1601 Receive PDO 2 Mapping
- 0x1602 Receive PDO 3 Mapping
- 0x1800 Transmit PDO 1 Parameter
- 0x1801 Transmit PDO 2 Parameter
- 0x1802 Transmit PDO 3 Parameter
- 0x1A00 Transmit PDO 1 Mapping
- 0x1A01 Transmit PDO 2 Mapping
- 0x1A02 Transmit PDO 3 Mapping
- 0x2000 position_1,int16_t类型
- 0x2001 position_2,int16_t类型
- 0x2002 position_3,int16_t类型
- 0x3000 counter_1,uint32_t类型
- 0x3001 counter_2,uint32_t类型
- 0x3002 counter_3,uint32_t类型
master有TPDO1,TPDO2,TPDO3,RPDO1,RPDO2,RPDO3,具体配置如下,
- TPDO1映射0x2000,COB-Id是0x201,也就是对Node ID为1的CANopen对象起作用
- TPDO2映射0x2001,COB-Id是0x202,也就是对Node ID为2的CANopen对象起作用
- TPDO3映射0x2002,COB-Id是0x203,也就是对Node ID为3的CANopen对象起作用
- RPDO1映射0x3000,COB-Id是0x181,也就是对Node ID为1的CANopen对象起作用
- RPDO2映射0x3001,COB-Id是0x182,也就是对Node ID为2的CANopen对象起作用
- RPDO3映射0x3002,COB-Id是0x183,也就是对Node ID为3的CANopen对象起作用
另外,master是CANopen client,所以需要0x1280
slave的配置信息
slavedic.od的内容如下,
- 0x1000 Device Type
- 0x1001 Error Register
- 0x1017 Producer Heartbeat Time
- 0x1018 Identity
- 0x1200 Server SDO Parameter
- 0x1400 Receive PDO 1 Parameter
- 0x1600 Receive PDO 1 Mapping
- 0x1800 Transmit PDO 1 Parameter
- 0x1A00 Transmit PDO 1 Mapping
- 0x2000 counter,uint32_t类型
- 0x2001 position,int16_t类型
slave有TPDO1和RPDO1,具体配置如下,
- TPDO1映射0x2000,COB-Id是
0x180+slave的Node Id
- RPDO1映射0x2001,COB-Id是
0x200+slave的Node Id
另外,由于slave是CANopen server,所以需要0x1200
三 总结
本文讲述在Linux下如何使用CanFestival,经过本人修改,可以直接编译生成对应的可执行文件,同时用户可以根据需要使用对象字典编辑器来修改对象字典。