瑞芯微RK3506开发板Ethercat主站适配开发详细攻略,实测微秒级抖动延迟!

Industio_触觉智能 7天前 阅读数 1 #科技

EtherCAT IgH软件环境

EtherCAT整体介绍

EtherCAT整体分为四个部分,包含:实时Linux内核、用户态、驱动以及EtherCAT应用。触觉智能RK3506开发板提供EtherCAT预编译的bin文件:

实时Linux内核

EtherCAT IgH需要保证高实时性,Preempt-RT是一种针对实时性能进行了优化的Linux内核。与普通的 Linux内核相比,Preempt-RT具有以下优势:

1. 实时性能: Preempt-RT提供了更可靠和更精确的实时性能。它采用了一些实时调度策略和机制,使得任务能够按照严格的时间要求执行,从而适用于需要高度可预测性和低延迟的应用场景,如工业自动化、机器人控制等。

2. 硬实时能力:Preempt-RT具有硬实时能力,即能够确保任务在规定的时间内完成,而不会受到其 他任务或中断的干扰。这对于需要严格的时间限制的应用非常重要,如航空航天、医疗设备等领域。

3. 任务调度:Preempt-RT使用了更加高效和优化的任务调度算法,如基于优先级的实时调度算法, 以确保高优先级任务能够及时响应并完成,而低优先级任务不会影响到实时任务的执行。

4. 中断处理:Preempt-RT针对中断处理进行了优化,使得中断的响应时间更短,能够更快地响应外部事件。

5. 内核定时器:Preempt-RT提供了更精确和可配置的内核定时器,使得可以实现微秒级的定时精 度,适用于对时间要求极高的应用场景。

6. 实时扩展:Preempt-RT提供了一些实时扩展机制,使得用户能够方便地对内核进行定制和扩展,以满足特定应用的需求。

总的来说,Preempt-RT在实时性能、可靠性和精度方面比普通的Linux内核更加优秀,因此在对实时性能 要求较高的应用场景中被广泛使用。瑞芯微提供配套SDK的Preempt-RT补丁。

用户态

用户态中主要是两个文件,ethercat和libethercat.so,一个是EtherCAT IgH的调试工具,一个是EtherCAT。

IgH的动态库,用来提供用户层接口。用户态部分访问以下链接:

https://gitlab.com/etherlab.org/ethercat/-/tree/master?r ef_type=heads下载IgH的源代码,编译后会生成ethercat二进制文件,libethercat.so和一些example等等。用户态部分也可以使用预编译好的EtherCAT IgH二进制文件和libethercat.so,如下所示:

驱动

驱动部分主要是ec_master.ko和一些瑞芯微RK优化后的ko文件。

EtherCAT IgH应用部分

EtherCAT IgH应用部分需要根据实际使用的伺服驱动器来实现,该部分无法通用的, 触觉智能提供如下测试组件:

EtherCAT IgH软件编译和部署

以下将根据实时Linux内核、用户态、驱动以及EtherCAT应用四个部分进行讲解。

编译内核

步骤一:打上Preempt-RT补丁,内核方案选择Preempt-RT内核方案,参考文档打上补丁:SDK/docs/Patches/Real-Time-Performance/README.md

要特别注意的是:发布的驱动部分SDK/external/rk_ethercat_release和内核头文件强相关,请确认内核的 commit

要和SDK/external/rk_ethercat_release/driver/redmine中描述的一样,再打入Preempt-RT补丁。

步聚二:修改RK3506 Linux 6.1内核

diff --git a/arch/arm/configs/rk3506_defconfig b/arch/arm/configs/rk3506_defconfig

index e6d3ba608a77..3029973ade8c 100644

--- a/arch/arm/configs/rk3506_defconfig

+++ b/arch/arm/configs/rk3506_defconfig

@@ -2,6 +2,7 @@

CONFIG_KERNEL_XZ=y

CONFIG_DEFAULT_HOSTNAME="localhost" CONFIG_SYSVIPC=y

+CONFIG_NO_HZ_FULL=y

CONFIG_NO_HZ=y

CONFIG_HIGH_RES_TIMERS=y CONFIG_PREEMPT=y

@@ -119,12 +120,13 @@ CONFIG_NETDEVICES=y

# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set

# CONFIG_NET_VENDOR_SOCIONEXT is not set

-CONFIG_STMMAC_ETH=y

+CONFIG_STMMAC_ETH=m

# CONFIG_DWMAC_GENERIC is not set

# CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_VIA is not set

# CONFIG_NET_VENDOR_WIZNET is not set

# CONFIG_NET_VENDOR_XILINX is not set

+CONFIG_PHYLIB=y

CONFIG_MOTORCOMM_PHY=y

CONFIG_PPP=y

# CONFIG_WLAN is not set

步骤三:编译出实时内核

最后根据rt-linux README.md,生成实时性内核。

用户态与驱动部分

这部分可以直接在SDK中获取(参考第二章),或者源码编译,源码linux环境下编译的方法如下:

#进入源码目录

cd source

#指定编译链路径(编译链在SDK中有提供)

export PATH=SDK/prebuilts/gcc/linux-x86/ (arch)/gcc-arm-10.3-2021.07-x86_64- (arch)-none-linux-gnu/bin:$PATH

#配置,指定内核目录,选择SDK下的kernel-6.1或者kernel-5.10,这里使用kernel-6.1。

./bootstrap

./configure --prefix=(编译后你需要存放的目录) --host= (arch)-none-linux-gnu --with- linux-dir=SDK/kernel-6.1 --enable-8139too=no --enable-stmmac=yes --enable-

generic=no --enable-wildcards=yes

#编译

make -j8

make install systemdsystemunitdir=(编译后你需要存放的目录,和configure命令上的prefix下 跟的参数需要一直)

#部署,从你指定的输出目录中拷贝文件到开发板上

cp libethercat.so* /usr/lib/ (开发板上)

cp ethercat /usr/bin/ (开发板上)

cp phylink.ko /userdata/ (开发板上) 内核编译

cp pcs-xpcs.ko /userdata/ (开发板上) 内核编译 cp ec_master.ko /userdata/ (开发板上)

cp ec_stmmac.ko /userdata/ (开发板上)

#加载驱动

insmod /userdata/phylink.ko

insmod /userdata/pcs-xpcs.ko

insmod /userdata/ec_master.ko main_devices=62:36:B8:01:5B:59(这个是你的网口的物理地 址,可以通过ifconfig命令查看)

insmod /userdata/ethercat_out/ec_stmmac.ko

#调整soc为性能模式

echo performance | tee $ (find /sys/ -name *governor)

EtherCAT IgH应用部分

EtherCAT IgH应用部分需要根据具体的伺服器来编写,需要使用上面用户态编译出来的EtherCAT IgH工具获取一些伺服驱动器的配置信息,然后完成应用代码的开发。具体可添加触觉智能客服微信13423856106,获取EtherCAT IgH应用部分开发指导。

EtherCAT IgH工具介绍

使用ethercat --help命令可以查看EtherCAT IgH工具,这些工具可以查看与主站连接的从站的各种信息, 可以有助于主站应用程序的编写,下面介绍几种常用的命令和参数的使用,其中[]中为必选参数, <>为 可选参数。

以c语言的形式输出pdo信息(ethercat cstruct)

/* Master 0, Slave 0

* Vendor ID: 0x00000a79

* Product code: 0x00002000

* Revision number: 0x00000001

*/

ec_pdo_entry_info_t slave_0_pdo_entries[] = {

{0x603f, 0x00, 16}, /* ErrorCode */

{0x6041, 0x00, 16}, /* StatusWord */

{0x6064, 0x00, 32}, /* Position actual value */

{0x60fd, 0x00, 32}, /* Digital inputs */

{0x6061, 0x00, 8}, /* Modes of operation display */

{0x6040, 0x00, 16}, /* ControlWord */

{0x6060, 0x00, 8}, /* Modes of operation */

{0x607a, 0x00, 32}, /* Target position */

{0x6081, 0x00, 32}, /* Profile velocity */

{0x6099, 0x01, 32}, /* Search Switch */

{0x6099, 0x02, 32}, /* Search Zero */

{0x6040, 0x00, 16},

{0x607a, 0x00, 32},

{0x60ff, 0x00, 32},

{0x6060, 0x00, 8},

{0x0000, 0x00, 8}, /* Gap */

{0x6041, 0x00, 16},

{0x6064, 0x00, 32},

{0x606c, 0x00, 32},

{0x6061, 0x00, 8},

{0x0000, 0x00, 8}, /* Gap */

};

ec_pdo_info_t slave_0_pdos[] = {

{0x1a01, 5, slave_0_pdo_entries + 0}, /* TxPDO 2 */

{0x1601, 6, slave_0_pdo_entries + 5}, /* RxPDO 2 */

{0x1600, 5, slave_0_pdo_entries + 11},

{0x1a00, 5, slave_0_pdo_entries + 16},

};

ec_sync_info_t slave_0_syncs[] = {

{0, EC_DIR_OUTPUT, 2, slave_0_pdos + 0, EC_WD_DISABLE},

{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},

{2, EC_DIR_OUTPUT, 1, slave_0_pdos + 2, EC_WD_ENABLE},

{3, EC_DIR_INPUT, 1, slave_0_pdos + 3, EC_WD_DISABLE},

{0xff}

};

0 0:0 PREOP + 0x000001dd:0x10305070

输出pdo信息(ethercat pdos)

SM0: PhysAddr 0x1000, DefaultSize 128, ControlRegister 0x26, Enable 1

RxPDO 0x1a01 "TxPDO 2"

PDO entry 0x603f:00, 16 bit, "ErrorCode"

PDO entry 0x6041:00, 16 bit, "StatusWord"

PDO entry 0x6064:00, 32 bit, "Position actual value"

PDO entry 0x60fd:00, 32 bit, "Digital inputs"

PDO entry 0x6061:00, 8 bit, "Modes of operation display"

RxPDO 0x1601 "RxPDO 2"

PDO entry 0x6040:00, 16 bit, "ControlWord"

PDO entry 0x6060:00, 8 bit, "Modes of operation"

PDO entry 0x607a:00, 32 bit, "Target position"

PDO entry 0x6081:00, 32 bit, "Profile velocity"

PDO entry 0x6099:01, 32 bit, "Search Switch"

PDO entry 0x6099:02, 32 bit, "Search Zero"

SM1: PhysAddr 0x1100, DefaultSize 128, ControlRegister 0x22, Enable 1

SM2: PhysAddr 0x1200, DefaultSize 12, ControlRegister 0x64, Enable 1

RxPDO 0x1600 ""

PDO entry 0x6040:00, 16 bit, ""

PDO entry 0x607a:00, 32 bit, ""

PDO entry 0x60ff:00, 32 bit, ""

PDO entry 0x6060:00, 8 bit, ""

PDO entry 0x0000:00, 8 bit, "Gap"

SM3: PhysAddr 0x1300, DefaultSize 19, ControlRegister 0x20, Enable 1

TxPDO 0x1a00 ""

PDO entry 0x6041:00, 16 bit, ""

PDO entry 0x6064:00, 32 bit, ""

PDO entry 0x606c:00, 32 bit, ""

PDO entry 0x6061:00, 8 bit, ""

PDO entry 0x0000:00, 8 bit, "Gap"

#设置别名地址(下面的例子代表设置位置0的别名修改为1)

ethercat alias -p 0 0

#设置别名地址(下面的例子代表别名0的别名修改为1)

ethercat alias -a 0 1

Ethercat IgH主站性能测试结论

触觉智能RK3506开发板1ms控制周期内,性能数据如下:

触觉智能RK3506星闪开发板,如需选购,马云家 搜索 触觉智能官方企业店

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Industio_触觉智能

Industio_触觉智能

专注开源鸿蒙OpenHarmony与ARM嵌入式工控智能硬件