LinuxCNC为官方ISO安装版,基于Debian 10 buster操作系统,内核版本4.19.0-21-rt-amd64,节省了编译preempt rt 实时内核的工作。
IGH默认必须是root用户,才能执行相关指令,以下操作均在root用户下,不是sudo,而是注销普通用户,以root身份登录系统。
官方网站下载IGH源码http://www.etherlab.org/download/ethercat/ethercat-1.5.2.tar.bz2,解压后目录为ethercat-1.5.2 。
编译IGH需要操作系统的内核源码,而系统默认是没有内核源码的,可以从Debian官网下载对应的源码:http://ftp.cn.debian.org/debian/pool/main/l/linux/linux-headers-4.19.0-21-rt-amd64_4.19.249-2_amd64.deb
执行以下命令安装源码,源码会被安装到/usr/src目录下:
sudo apt install ./linux-headers-4.19.0-21-rt-amd64_4.19.249-2_amd64.deb
执行以下命令编译IGH:
cd ethercat-1.5.2
./configure --enable-8139too=no --enable-wildcards=yes
make
make modules
make install
make modules_install
configure命令无需要指令内核源码位置,编译程序默认使用当前运行内核,并自动去/usr/src目录下寻找相应的内核源码。
执行make modules时,会出现多个错误,皆因版本问题,ethercat-1.5.2发布于2012年,默认支持linux内核版本为2.6 ,所以需要修改多处源码,以下为所有需要修改的地方:
/devices/generic.c 152行,增加一个参数NET_NAME_UNKNOWN
dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null,NET_NAME_UNKNOWN, ether_setup);
/devices/generic.c 210行,增加一个参数&init_net
ret = sock_create_kern(&init_net,PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT),
/examples/mini/mini.c 495行至498行,全部注释掉,因为4.19内核已经没有init_timer了,改为timer_setup
// init_timer(&timer);
// timer.function = cyclic_task;
// timer.expires = jiffies + 10;
// add_timer(&timer);
timer_setup(&timer, cyclic_task, 0);
timer.expires = jiffies + 10;
同时修改回调函数cyclic_task
void cyclic_task(struct timer_list *t)
/master/cdev.c 87行,加上强制类型转换
.fault = (int (*)(struct vm_fault *))eccdev_vma_fault
/master/cdev.c 277行,将virtual_address改为address
" offset = %lu, page = %p\n", vmf->address, offset, page);
/master/master.c 1637行,报错信息为error: variable has incomplete type 'struct sched_param' ,增加头文件
#include <linux/version.h>
#include <uapi/linux/sched/types.h> // struct sched_param
#include <linux/sched/types.h> // sched_setscheduler
/master/ethernet.c 151行,在name, 后增加 NET_NAME_UNKNOWN参数
if (!(eoe->dev = alloc_netdev(sizeof(ec_eoe_t *), name, NET_NAME_UNKNOWN, ether_setup))) {
做完以上修改,我这里就可以成功安装IGH了,安装目录位于/opt/etherlab 。
配置动态库路径
vim /etc/ld.so.conf
另起一行,增加 /opt/etherlab/lib,保存后退出,再执行
ldconfig
配置服务
cd /opt/etherlab
mkdir /etc/sysconfig/
cp etc/sysconfig/ethercat /etc/sysconfig/
ln -s /opt/etherlab/etc/init.d/ethercat /etc/init.d/
depmod
配置网卡,debian默认没有ifconfig工具,但是ip工具,可以使用ip address命令查看网卡MAC地址,打开配置文件
vim /etc/sysconfig/ethercat
//修改以下两项
MASTER0_DEVICE="xx:xx:xx:xx:xx:xx"
DEVICE_MODULES="generic"
增加设备权限
echo KERNEL==\"EtherCAT[0-9]*\", MODE=\"0664\" > /etc/udev/rules.d/99-EtherCAT.rules
启动服务,如果成功会出现提示: Starting EtherCAT master 1.5.2 done
/etc/init.d/ethercat start
增加命令行工具
vim ~/.bashrc
在其中添加路径
PATH=$PATH:/opt/etherlab/bin
执行source ~/.bashrc 或重启命令行工具,这样就可以使用ethercat命令了,比如
ethercat master
可以查看主站信息,其它指令的使用可以参考文档ethercat-1.5.2.pdf,文档可从IGH官网下载。
开机自启动ethercat主站,注意必须是root用户,否则无法自启动。所有应用程序->设置->会话和启动,切换到 应用程序自启动 页,添加, 名称、描述 自定义,命令
/etc/init.d/ethercat start
至此,全部工作完成。