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.hrtdk.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_PosDigOutSlave01_Pos
    • 定义了对应的从站在主站总线上的位置信息。
  • Beckhoff_EK1100Beckhoff_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 实时线程的实现

域状态检查线程

这个检查线程,会检查域中的正在工作的从站数量和状态有没有发生变化,如果发生变化了那就打印出来。

主站状态检查线程

这个检查线程,会检查主站下的从站数量有没有发生变化,以及对应的所有的从站状态是否变化,以及对应的链路状态是否发生改变,如果发生改变那就打印出来。
  • 实时线程:周期性地执行以下操作:
      1. 计算下一个周期的时间点。
      1. 使用 clock_nanosleep 实现精确的周期控制。
      1. 接收 EtherCAT 数据并处理域数据。
      1. 检查域和主站的状态。
      1. 更新过程数据(如控制数字输出)。
      1. 发送过程数据。
任务
执行周期
描述
主循环
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. 释放资源

 
在 Cloudflare Pages 上部署 NotionNext 静态博客EtherCAT 主站 IgH 学习之 —— 概念篇
Loading...