CanFestival在Linux下的使用

avatar
作者
筋斗云
阅读量:0

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,经过本人修改,可以直接编译生成对应的可执行文件,同时用户可以根据需要使用对象字典编辑器来修改对象字典。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!