前 言
本文檔主要基於評估板演示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 '"'"'cnotallow=ttyS1,115200n8 earlycnotallow=uart,mmio32,0xf8401000 loglevel=8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait isolcpus=1'"'"'; fi; if test ${devnum} -eq 1; then setenv bootargs '"'"'cnotallow=ttyS1,115200n8 earlycnotallow=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"。
由於篇幅過長等原因,部分內容均不逐一展示,如需獲取完整版詳細資料,請關注創龍科技微信公眾號,或者評論區留言,感謝您的支持!