type
status
date
slug
summary
tags
category
created days
new update day
icon
password
Created_time
Mar 7, 2025 02:20 AM
Last edited time
Mar 7, 2025 03:29 AM
0 缘起
最近项目上需要使用 xenomai 的实时内核。看了一下 ethercat igh 主站协议中有对 xenomai 的官方例程代码。于是就进行学习修改了也一下。下面也是记录一下修改记录,与对应的编码逻辑。
官方提供了两种 xenomai 的例程。我首先学习的是 xenomai_posix 的例程代码。
下面是完整的例程代码,点击打开可以显示完全。
可以看到例程代码的逻辑还是很清晰的。
1 代码关键部分
下面将对于例程代码中的关键部分进行分析。
1.1 头文件和全局变量
头文件
- 头文件:包含了标准 C 库、POSIX 线程、信号处理、时间管理等功能。
- Xenomai 相关头文件:
rtdm.h和rtdk.h用于 Xenomai 的实时操作。
- EtherCAT 主站库:
ecrt.h是 IgH EtherCAT Master 库的头文件,提供了 EtherCAT 主站的 API。
全局变量
- NSEC_PER_SEC:定义每秒的纳秒数,用于时间计算。
- cycle_us:定义周期时间(1 ms),即实时线程的执行周期。
- cyclic_thread:实时线程的句柄。
- run:标志变量,用于控制实时线程的运行。
1.2 EtherCAT 主站和域的定义
- master:EtherCAT 主站的句柄。
- master_state:主站的状态信息。
- domain1:EtherCAT 域的句柄,用于管理过程数据。
- domain1_state:域的状态信息。
- domain1_pd:指向域过程数据的指针。
- sc_dig_out_01:从站配置的句柄。
1.3 过程数据 PDO 映射配置
- BusCoupler01_Pos 与 DigOutSlave01_Pos:
- 定义了对应的从站在主站总线上的位置信息。
- Beckhoff_EK1100 与 Beckhoff_EL2004
- 定义了对应从站的 vendor ID. 和 product code.
- domain1_regs:定义了 PDO 条目的映射关系。
DigOutSlave01_Pos:从站的位置(总线号,站号)。Beckhoff_EL2004:从站的厂商 ID 和产品代码。0x7000, 0x01:PDO 的索引和子索引。&off_dig_out0:存储 PDO 条目在过程数据中的偏移量。
完整的 ec_pdo_entry_reg_t 结构体如下:
1.4 从站的 PDO 和同步管理器配置
- slave_1_pdo_entries:
- 定义了从站的 PDO 条目,是从站 pdo 配置的一部分。
- slave_1_pdos:
- 定义了从站的 PDO,配置从站同步管理器的时候需要使用。
- slave_1_syncs:
- 定义了从站的同步管理器配置,可以配置对应的 pdo 的 OUTPUT 或 INPUT 模式,以及看门狗的配置。
1.5 实时线程的实现
域状态检查线程
这个检查线程,会检查域中的正在工作的
从站数量和状态有没有发生变化,如果发生变化了那就打印出来。主站状态检查线程
这个检查线程,会检查主站下的从站数量有没有发生变化,以及对应的所有的从站状态是否变化,以及对应的链路状态是否发生改变,如果发生改变那就打印出来。
- 实时线程:周期性地执行以下操作:
- 计算下一个周期的时间点。
- 使用
clock_nanosleep实现精确的周期控制。 - 接收 EtherCAT 数据并处理域数据。
- 检查域和主站的状态。
- 更新过程数据(如控制数字输出)。
- 发送过程数据。
任务 | 执行周期 | 描述 |
主循环 | 1 ms | 控制线程的精确周期执行。 |
域状态检查 ( rt_check_domain_state) | 1 ms | 检查域的工作计数器和状态。 |
主站状态检查 ( rt_check_master_state) | 1000 ms (1 s) | 检查主站和从站的通信状态。 |
输出状态切换 ( blink) | 200 ms | 切换输出信号状态(如 LED 闪烁)。 |
输出数据写入 | 1 ms | 向从站的输出通道写入数据。 |
过程数据发送 | 1 ms | 将更新后的过程数据发送到从站。 |
1.6 主函数
1. 初始化和信号处理
这些代码设置了信号处理程序,以便在接收到终止信号(如
SIGTERM 或 SIGINT)时能够正确地停止程序。mlockall 函数用于锁定进程的内存,防止内存分页,从而确保实时性能。2. 请求 EtherCAT 主站
实例化主站索引为 0 的主站。
3. 创建域
创建主站的管理域,多个从站可以使用同一个管理域进行同步配置。
4. 创建从站配置
这段代码为两个从站创建配置。如果配置失败,程序将返回错误。
5. 配置 PDO
6. 注册 PDO 条目
对应的操作 pdo 在 domain1_regs 进行配置。
7. 激活主站
8. 创建实时线程
这段代码创建一个实时线程,用于周期性地处理 EtherCAT 数据。线程的优先级设置为 82,并使用 FIFO 调度策略。如果线程创建失败,程序将返回错误。
9. 主循环
主循环等待信号处理程序将
run 变量设置为 0,然后等待实时线程结束。10. 释放资源
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2025/03/07/EtherCAT-master-IgH-learned-the-xenomai_posix-routine-code
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
