前 言
本文档主要基于评估板演示IgH EtherCAT主站的伺服电机实时控制,方案基于Linux-RT实时内核与开源IgH EtherCAT协议栈。本文档适用开发环境:
开发环境
Windows开发环境:Windows10 64bit
Linux开发环境:VMware16.2.5、Ubuntu22.04.4 64bit
LinuxSDK开发包:LinuxSDK-[版本号](基于SDK_2025.1)
交叉编译工具链:
应用开发:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
U-Boot、内核开发:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
评估板系统版本:U-Boot-2021.01、Linux-6.1.111、Buildroot-2022.02
备注:本文基于8GByte eMMC、1GByte DDR配置核心板进行演示。
伺服驱动器:台达ASD-A2-0121-E
伺服电机:台达ECMA-C10401GS
术语表
为便于阅读,下表对文档出现的关键术语进行解释;对于广泛认同释义的术语,在此不做注释。

注意事项
我司提供的IgH EtherCAT主站开发案例igh_ethercat_dc_motor位于产品资料“4-软件资料\Demo\base-demos\”目录下,具体说明如下。

IgH EtherCAT简介
EtherCAT(以太网控制自动化技术)是一个开放架构,以以太网为基础的现场总线系统,其名称的CAT为控制自动化技术(Control Automation Technology)字首的缩写。EtherCAT是确定性的工业以太网。自动化对通讯一般会要求较短的资料更新时间(或称为周期时间)、资料同步时的通讯抖动量低,而且硬件的成本要低,EtherCAT开发的目的就是让以太网可以运用在自动化应用中。
本文档主要介绍运行于Linux系统的免费开源EtherCAT主站程序——IgH EtherCAT。IgH EtherCAT是EtherCAT协议主站协议栈的开源实现,它为用户提供了免费使用、修改和定制源代码的便利,使得用户能够根据实际需求灵活调整和优化EtherCAT主站的功能。其框架如下所示。

图 1
IgH EtherCAT主站通过构建Linux字符设备,应用程序通过对字符设备的访问实现与EtherCAT主站模块的通信。
IgH EtherCAT开发包提供EtherCAT工具,该工具提供各种可在Linux用户层运行的命令,可直接实现对从站的访问和设置,如设置从站地址、显示总线配置、显示PDO数据、读写SDO参数等。
IgH EtherCAT官网:https://www.etherlab.org/en/ethercat。
案例说明
案例功能:EtherCAT通讯周期时间为1ms,控制伺服电机正转和反转,并通过串口循环打印EtherCAT通讯周期时间的最大值和最小值。
(1)正转:伺服电机目标速度从0加速到10000,当达到10000速度后,控制伺服电机减速至0,循环运行。
(2)反转:伺服电机目标速度从0加速到-10000,当达到-10000速度后,控制伺服电机减速至0,循环运行。

图 2
案例测试
本案例需基于Linux-RT内核运行。请先参考《Linux系统开发手册》的“替换Kernel”章节修改系统内核镜像。
本案例程序均设置为SCHED_FIFO进程调度策略,进程优先级设置为最高,采用隔离CPU核心状态,分别在空载状态、满负荷状态持续运行程序12小时。
请使用网线将评估板ETH1 RGMII网口连接至伺服驱动器A的IN网口,再使用另一根网线将伺服驱动器A的OUT网口连接至伺服驱动器B的IN网口。

图 3

图 4
隔离CPU核心
本次操作以隔离CPU1核心为例进行演示。将评估板断电,长按"Ctrl + C"按键并上电启动评估板,进入U-Boot命令行模式后松开按键,执行如下命令修改环境变量,隔离CPU1核心。
U-Boot# setenv mmc_boot 'if mmc dev ${devnum}; then devtype=mmc; if test ${devnum} -eq 0; then setenv bootargs '"'"'console=ttyS1,115200n8 earlycon=uart,mmio32,0xf8401000 loglevel=8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait isolcpus=1'"'"'; fi; if test ${devnum} -eq 1; then setenv bootargs '"'"'console=ttyS1,115200n8 earlycon=uart,mmio32,0xf8401000 loglevel=8 root=/dev/mmcblk1p2 rw rootfstype=ext4 rootwait isolcpus=1'"'"'; fi; ext4load mmc ${devnum}:2 ${kernel_addr_r} ${bootdir}/${kernel_image}; ext4load mmc ${devnum}:2 ${fdt_addr_r} ${bootdir}/${devicetree_image}; bootm ${kernel_addr_r} - ${fdt_addr_r}; run scan_dev_for_boot_part2; fi'
U-Boot# saveenv
U-Boot# reset

图 5
进入评估板文件系统,执行如下命令,确认已正确隔离CPU。
Target# cat /proc/cmdline

图 6
测试完成,如需恢复U-Boot环境变量,在U-Boot命令行模式执行以下命令。
U-Boot# env default -a
U-Boot# saveenv
U-Boot# reset

图 7
安装IgH EtherCAT驱动
请将案例"igh_ethercat\images\"目录下的ethercat-stable-[版本号]-[Git序列号].tar.gz压缩包拷贝至评估板文件系统任意目录下。版本号、Git序列号请以实际情况为准。将案例bin目录下的igh_ethercat_dc_motor可执行文件拷贝至评估板文件系统。
执行如下命令,解压IgH EtherCAT开发包源码,得到_install文件夹。
Target# tar -xvf ethercat-stable-1.6.2-g285cdf0.tar.gz

图 8
执行如下命令,并查询评估板网卡物理地址。
Target# ifconfig

图 9
执行如下命令,加载驱动模块,命令中"6A:71:14:3D:61:75"为评估板网卡物理地址,请根据实际情况修改。
Target# insmod -f _install/modules/ec_master.ko main_devices=6A:71:14:3D:61:75

图 10
执行如下命令,拷贝EtherCAT主站相关文件至评估板文件系统。
Target# mkdir -p /etc/sysconfig
Target# cp _install/etc/sysconfig/ethercat /etc/sysconfig
Target# mkdir -p /lib/modules/$(uname -r)
Target# cp _install/modules/ec_master.ko /lib/modules/$(uname -r)
Target# depmod -a
备注:此处的警告信息不影响测试结果,忽略即可。

图 11
执行如下命令,启动EtherCAT主站。
Target# ./_install/etc/init.d/ethercat start
![]()
图 12
执行如下命令,加载ec_generic.ko驱动文件。
Target# insmod -f _install/modules/ec_generic.ko

图 13
执行如下命令,添加动态链接库路径。
Target# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/_install/lib
Target# sync
![]()
图 14
基于CPU空载状态测试
执行如下命令修改内核printk日志等级,避免内核打印信息影响实时测试。
Target# echo 1 > /proc/sys/kernel/printk
![]()
图 15
调整内存分配策略为"2",禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。
Target# echo 2 > /proc/sys/vm/overcommit_memory
![]()
图 16
执行如下命令,可查看igh_ethercat_dc_motor程序相关参数信息。
Target# ./igh_ethercat_dc_motor --help

图 17
参数解释
-d:指定电机转向,0:正转,1:反转。
-v:程序版本信息。
-s:选择进程调度策略模式。"-s 0"表示进程调度策略为SCHED_FIFO;"-s 1"表示进程调度策略为SCHED_DEADLINE,若不带可选参数值[<sched_runtime> <sched_deadline> <sched_period>]则使用默认参数值,其中sched_runtime表示运行时间,sched_deadline表示相对期限,sched_period表示周期,单位均为纳秒。
--help:查看程序运行参数。
执行以下命令,设置进程调度策略为SCHED_FIFO,控制两台伺服电机同时正转,并将程序运行输出的打印信息保存至log.txt文件。
Target# taskset -c 1 ./igh_ethercat_dc_motor -d 0 -s 0 > log.txt &
![]()
图 18
基于CPU满负荷状态测试
执行如下命令修改内核printk日志等级,避免内核打印信息影响实时测试。
Target# echo 1 > /proc/sys/kernel/printk
![]()
图 19
调整内存分配策略为"2",禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。
Target# echo 2 > /proc/sys/vm/overcommit_memory
![]()
图 20
执行如下命令,运行stress压力测试工具,使得CPU处于满负荷状态。
Target# stress-ng --cpu 2 --cpu-method=all --io 2 --vm 2 --vm-bytes 32M --timeout 43200s &

图 21
设置进程调度策略为SCHED_FIFO,控制两台伺服电机同时正转,并将程序运行输出的打印信息保存至log.txt文件。
Target# taskset -c 1 ./igh_ethercat_dc_motor -d 0 -s 0 > log.txt &
![]()
图 22
统计结果分析
可执行如下命令,查看程序运行输出的log.txt内容。
Target# head -n100 log.txt

图 23
参数解析:
latency:等待唤醒时间(ns)。
period:EtherCAT通讯周期时间(ns),本案例设置为1000000ns,即1ms。
exec:接收和发送EtherCAT数据时间(ns)。
对log.txt文件内容进行分析后,得到的实时性能测试结果如下。

备注:
(1)以上数据为本次测试结果,测试数据仅供参考。
(2)如需测试电机反转,请参考上述电机正转测试方法,将运行igh_ethercat_dc_motor可执行程序命令中的"-d 0"参数修改为"-d 1"。
由于篇幅过长等原因,部分内容均不逐一展示,如需获取完整版详细资料,请关注创龙科技微信公众号或官网,或者评论区留言,感谢您的支持!
980

被折叠的 条评论
为什么被折叠?



