IgH(Igh EtherCAT Master for Linux)移植到搭载Linux系统的开发板

参考文档:


引言:

  EtherCAT两大主流开源代码为SOEM(即支持Linux,又支持windows )和IgH EtherCAT Master只支持Linux )。本文以IgH具体移植步骤为引子,简述EtherCAT在嵌入式系统中的移植过程。 [Linux 内核版本:Linux-4.19.94] 该内核已交叉编译过

Note:
  IgH移植过程中,兼容Linux-2.x 和Linux-3.X的内核版本,无法兼容高版本内核,故将Igh移植到高版本内核进行编译时,需根据编译错误进行适当修改。


源码编译过程

# EtherCAT 源码存放目录为:/home/zsj/ethercat-1.5.2
# Linux-4.19.94 源码存放目录为:/home/zsj/ linux-4.19.94

$ tar xvf ethercat-1.5.2.tar.bz2	# 生成文件/home/zsj/ethercat-1.5.2
$ cd ethercat-1.5.2

# --prefix是指定你下面make install时的安装目录,--with-linux-dir是指定你的linux内核目录
$ ./configure --prefix=/home/zsj/ethercat-1.5.2/output --with-linux-dir=/home/zsj/linux-4.19.94 --enable-8139too=no --enable-generic=yes CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf 
$ make	# 编译源码

# 指定交叉编译工具,编译modules
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules 		# 编译通过会对应生成ethercat-1.5.2/devices/ec_generic.ko和ethercat-1.5.2/master/ec_master.ko
$ sudo make install		# 在该目录下生成output目录

根据源码编译错误存进行

  1. dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup) => 改为
    dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, NET_NAME_UNKNOWN, ether_setup)

  2. ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket) => 改为
    ret = sock_create_kern(&init_net,PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket)

  3. malloc 函数和 calloc 函数分配内存后需强制类型转换,如:
    char *buf;
    buf = malloc(sizeof(char *)); => 改为 buf = (char *)malloc(sizeof(char *));

  4. 缺少结构体数据和库函数声明:跳转到对应文件,进行声明或者直接在缺失的文件下重定义即可

  5. “sudo make install” 提示无法找到交叉工具链arm-linux-gnueabihf-ranlib
    (因为交叉工具链声明在zsj用户空间,而使用sudo安装时,shell控制台自动跳转到root用户下执行,故不能识别arm-linux-gnueabihf-ranlib交叉工具链)解决办法:su – t跳转到root用户,重新声明arm-linux-gnueabihf-ranlib交叉工具链,在root用户下,make install即可


编译后的库文件打包移植到开发板

# 在/home/zsj/ethercat-1.5.2目录下创建modules文件夹,并复制ec_generic.ko和ec_master.ko到modules下
mkdir -p output/modules
cp devices/ec_generic.ko output/modules/
cp master/ec_master.ko output/modules/

# 将output文件夹打包,传输到开发板(nfs/tftp/scp)
tar -cjf output.tar.bz2 output/


-------------------------------------------------------------------------------------------------------------------------------------
# 开发板上执行
tar -jxvf output.tar.bz2

# 复制ec_master.ko到/lib/modules/内核版本号/ 
cp output/modules/ec_master.ko /lib/modules/4.19.94/	  # 内核版本可以通过uname -r 查看
depmod

ln -fs output/etc/init.d/ethercat /etc/init.d/ # 创建链接,相比于复制节省内存空间
ln -fs output/bin/ethercat /usr/local/bin/

mkdir /etc/sysconfig
ln -fs output/etc/sysconfig/ethercat /etc/sysconfig/

# 配置rules,创建设备号
echo KERNEL==\"EtherCAT[0-9]*\", MODE=\"0664\" > /etc/udev/rules.d/99-EtherCAT.rules

# 获取板子MAC地址
ifconfig
# eth2  Link encap:以太网  硬件地址 00:0c:29:01:69:aa



-------------------------------------------------------------------------------------------------------------------------------------
# 启动EtherCAT
# 配置主站的MAC地址
modprobe ec_master main_devices=1E:ED:19:27:1A:B3 

# 启动ethercat
/etc/init.d/ethercat start

# 安装通用网卡驱动
insmod  output/modules/ec_generic.ko

# 通过ethercat查看信息
Ethercat --help

EtherCAT Master在Linux应用空间的使用

  1. 参考EtherCAT源码下的example。
  2. git clone https://gitee.com/wllw7176/MyEthercat-IGH-1.5.2.git 参考EtherCAT二次开发的源代码
之前工作有接触到Ethercat 并学习实践了IghMaster库,现在不做这方面工作了把代码开源出来,希望对大家有用。 代码使用Source Insight 3.5编辑的,用其它编辑器可能会出现乱码。 压缩包中包含了 1.基于Ighmaster 1.5.2驱动Sanyo,泰科伺服电机做力矩模式运动的代码。包含电机使能/禁止使能,设置运行模式,控制模式,发送力矩控制命令,读取力矩反馈等功能。基于SDO方式实现的代码。 2. 基于Ighmaster 1.5.2 驱动Et100 Io板代码,基于PDO,SDO方式的Io控制及温湿度读取 3. 测试例子包括了介于原生驱动接口ioctl方式控制码和基于libethercat库的驱动代码。具体见源代码。 文档目录结构及简要说明 0.Ethercat调试记录.txt 自己调试Ethercat过程中碰到的问题及解决办法 1. libethercat\std 目录 编译Igh生成的ethecat库 2. libethercat\include Igh Master Ethercat库包含的头文件 3. scripts/ 自动生成从站信息的相关脚本文件,要生成从站信息,将该文件夹复制到开发板运行GenerateSlavesConfig.sh。 默认生成ec_common_configs_define.h和ec_common_configs_define.c文件,这两个文件会在libethercat\ec_common\ecat_common.c,libethercat\ec_common\ecat_common.h相关接口使用。 4. libethercat\ec_common 4.0 ec_common_configs_define.h ec_common_configs_define.c 由脚本scripts/GenerateSlavesConfig.sh自动生成的从站信息,包括从站PDO,SDO设置等,更具体的可以参照scripts/README.txt 4.1 ecat_common.h ecat_common.c 基于ibethercat\std 中的库的二次封装库,简化了PDO,SDO等操作 4.2 ecat_common_intermediate_interface.h ecat_common_intermediate_interface.c 与具体厂商相关的接口库,基于ecat_common.c中接口的实现,不同设备修改这两个文件中的接口进行适配。 目前该文件实现的山羊电机接口。主要实现的PDO接口的电机状态查询,上电开机,关机,操作模式设置,力矩设置等接口,不同电机的类似接口可以参照该文件实现,接口作用见名知意。 封装接口的关键是对象字典的操作,根据手册设置对象字典即可,标准的Ethercat接口伺服电机一般来说对象字典定义基本是一样的,可能稍微有差别 5. 标准Igh Master接口的使用例子 mytest目录 mytest/test_torque_sanyo_ioctl 基于ioctl接口的sanyo电机测试例子 mytest/test_torque_tec_ioctl 基于ioctl接口的泰科电机电机测试例子 mytest/test_torque_tec_lib 基于libethercat\std库接口的电机测试例子 mytest/test_torque2 基于libethercat\std库接口的电机测试例子2 mytest/test_io_board ET1100,IO板的测试例子 基于标准的Igh 库及iotcl接口可以参照该文件夹例子 6.二次封装接口库ecat_common_intermediate_interface.c的使用说明 使用步骤 (1)将编译生成的Igh库文件替换libethercat\std文件, 文件名可能要改成,或者不该也行,自己写Makefile时匹配库名称就行 (2)将 scripts/ 目录复制到开发运行GenerateSlavesConfig.sh脚本,将脚本生成的ec_common_configs_define.h ec_common_configs_define.h 复制到libethercat\ec_common 文件夹 (3)基于二次封装接口的电机一般操作参照demo.c 参照demo.c中的ethercat_init() 进行从站初始化 初始化后就可以调用ecat_common_intermediate_interface.c中接口对从站进行操作 比如 interpolation_2_ecat_set_slave_pwr_on()接口使能电机, interpolation_2_ecat_set_slave_pwr_off() 关闭电机 interpolation_2_ecat_set_slave_target_pos() 设置目标位置,对应位置模式操作 其它接口作用见参照具体实现 7.关于轴操作的几点说明 (1)每个轴对应一个从站,由alias,position确定,一般来说从站不多时alias=0固定不变,对不同轴根据positon确定。 例如使能和关闭不同的轴 int interpolation_2_ecat_set_slave_pwr_on(MasterSpecifiedInfo_T *master_specified_info, int slave_pos); int interpolation_2_ecat_set_slave_pwr_off(MasterSpecifiedInfo_T *master_specified_info, int slave_pos); 中slave_pos参数就对应不同的轴,slave_pos=0,axis1 slave_pos=1,axis2... (2)设置不同轴的操作模式,位置,力矩,速度模式 可以参照这个接口 int interpolation_2_ecat_set_slave_operation_model(MasterSpecifiedInfo_T *master_specified_info, int slave_pos, unsigned char operation_model) 代码已经托管在云上,可以直接通过git下载: https://gitee.com/wllw7176/MyEthercat-IGH-1.5.2.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值