拓冰建站拓冰建站
首页 / 资讯中心 / 正文

从零开发 EtherCAT 主站(八):SOEM 周期通信源码解析,ecx_send_processdata() 到底发送了什么?

从零开发 EtherCAT 主站八SOEM 周期通信源码解析ecx_send_processdata() 到底发送了什么文章目录从零开发 EtherCAT 主站八SOEM 周期通信源码解析ecx_send_processdata() 到底发送了什么一、周期通信的整体流程二、为什么 EtherCAT 可以一次访问所有从站三、EtherCAT Frame 基本结构四、EtherCAT 命令类型五、为什么 PDO 周期通信主要使用 LRW![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f83b8eff66364c4fa604b8fd8866b011.png)六、SOEM 中 ecx_send_processdata() 做了什么1. 获取 IOMap2. 创建 EtherCAT Frame3. 填充 PDO 数据4. 发送 Ethernet Frame七、ecx_receive_processdata() 做了什么1. 接收 Frame2. 检查 WKC3. 更新 IOMap八、Working CounterWKC详解8.1 WKC 的工作原理8.2 WKC 的工程价值九、为什么 EtherCAT 可以达到微秒级实时十、本章总结十一、下一篇预告上一篇文章中我们分析了 SOEM 的 PDO 映射流程。通过ecx_config_map_group()SOEM 完成了从 PDO 定义到IOMap生成的全过程PDO → SyncManager → FMMU → IOMap此时主站已经知道哪些数据需要周期交换、数据在从站中的位置、以及数据在主站内存中的位置。但数据准备好了如何通过 EtherCAT 网络真正发送出去这就是本章要解决的问题。一、周期通信的整体流程在simple_ng.c中进入 OP 状态之后while(run){ecx_send_processdata(context);wkcecx_receive_processdata(context,EC_TIMEOUTRET);}周期通信只有两个核心函数ecx_send_processdata()负责发送ecx_receive_processdata()负责接收。但这两个函数内部实际完成的工作要复杂得多IOMap ↓ 创建 EtherCAT Frame ↓ 发送 EtherCAT 命令LRW/LWR/LRD ↓ Slave 处理数据 ↓ 返回 Frame ↓ 更新 IOMap二、为什么 EtherCAT 可以一次访问所有从站回顾一下传统通信方式如 CAN主站需要逐个访问每个节点发送请求 → 等待响应 → 处理下一个节点。节点越多周期越长。EtherCAT 完全不同。它使用Processing On The Fly飞速处理机制数据帧经过每个从站时从站直接读取或修改属于自己的数据然后立即将帧转发给下一个从站。整个网络只需要一个 Ethernet Frame就能完成所有从站的数据交换。这是 EtherCAT 实现微秒级实时通信的根本原因之一。三、EtherCAT Frame 基本结构EtherCAT 基于标准 Ethernet Frame其结构如下┌─────────────────────┐ │ Ethernet Header │ ← 目的MAC / 源MAC / EtherType (0x88A4) ├─────────────────────┤ │ EtherCAT Header │ ← 数据长度 / 类型 ├─────────────────────┤ │ EtherCAT Datagram │ ← 命令 / 地址 / 数据 / WKC ├─────────────────────┤ │ ... (多个Datagram) │ ├─────────────────────┤ │ FCS │ ← 帧校验序列 └─────────────────────┘其中最重要的是EtherCAT Datagram每个 Datagram 包含┌─────────────────────┐ │ Command (8 bit) │ ← LRD / LWR / LRW / APRD / ... ├─────────────────────┤ │ Address (32 bit) │ ← 逻辑地址 / 物理地址 / 自动递增地址 ├─────────────────────┤ │ Length (16 bit) │ ← 数据长度 ├─────────────────────┤ │ Data (可变) │ ← 过程数据 ├─────────────────────┤ │ Working Counter │ ← 从站处理计数 └─────────────────────┘四、EtherCAT 命令类型EtherCAT 定义了多种命令用于不同的寻址方式和操作类型命令全称寻址方式用途LRDLogical Read逻辑地址读取逻辑地址空间的数据LWRLogical Write逻辑地址写入逻辑地址空间的数据LRWLogical Read Write逻辑地址同时读写逻辑地址空间APRDAuto Increment Read自动递增地址扫描从站时读取APWRAuto Increment Write自动递增地址扫描从站时写入FPRDFixed Position Read固定物理地址直接访问特定从站FPWRFixed Position Write固定物理地址直接访问特定从站五、为什么 PDO 周期通信主要使用 LRWLRWLogical Read Write是 PDO 周期通信中最常用的命令。它的核心特点是一次 Frame 完成写输出和读输入两个操作。主站发送一个 LRW 命令Frame 中同时包含了要写入从站的数据如 Control Word、Target Position为从站返回数据预留的空间如 Status Word、Actual PositionFrame 经过每个从站时从站会从 Frame 中读取属于自己的输出数据将自己的输入数据写入 Frame 中对应的位置最终 Frame 返回主站时所有从站的输入数据已经填充完毕。Master 发送 LRW Frame │ ▼ ┌─────────┐ │ Slave 1 │ ← 读取输出数据 / 写入输入数据 └─────────┘ │ ▼ ┌─────────┐ │ Slave 2 │ ← 读取输出数据 / 写入输入数据 └─────────┘ │ ▼ ┌─────────┐ │ Slave 3 │ ← 读取输出数据 / 写入输入数据 └─────────┘ │ ▼ Master 接收 LRW Frame已包含所有输入数据一次 LRW 完成全部数据交换这是 EtherCAT 实时性优于传统总线的重要原因之一。六、SOEM 中 ecx_send_processdata() 做了什么进入 SOEM 源码ecx_send_processdata()最终调用ecx_send_processdata_group()其核心工作如下1. 获取 IOMap上一章生成的context-grouplist[group].outputs指针指向主站内存中的 PDO 输出数据区域。2. 创建 EtherCAT FrameSOEM 分配发送缓冲区txbuf填充Ethernet HeaderEtherType 0x88A4EtherCAT HeaderLRW 命令 逻辑地址 数据长度3. 填充 PDO 数据将IOMap中的输出数据如 Control Word、Target Position拷贝到 Datagram 的 Data 字段中。注意SOEM 并不会在发送前显式“构造”一个独立的 LRW 报文缓冲区。实际上IOMap本身就是被映射到发送缓冲区txbuf的某段地址填充IOMap就等于直接填充了待发送的帧数据。4. 发送 Ethernet Frame最终调用底层 socket 接口将完整的 Frame 发送到 EtherCAT 网络。七、ecx_receive_processdata() 做了什么发送 Frame 后Frame 依次经过所有从站每个从站将自己的输入数据写入 Frame 中对应的位置。主站收到返回的 Frame 后ecx_receive_processdata()执行1. 接收 Frame通过网卡接收返回的 Ethernet Frame。2. 检查 WKC读取 Datagram 中的Working Counter判断有多少个从站成功处理了该 Datagram。3. 更新 IOMap将 Frame 中返回的输入数据如 Status Word、Actual Position拷贝到IOMap的输入区域。之后应用程序读取IOMap中的输入数据即可获得从站反馈。八、Working CounterWKC详解WKCWorking Counter是 EtherCAT 协议中非常重要的诊断机制。它的作用是统计有多少个从站成功处理了这个 Datagram。8.1 WKC 的工作原理主站在发送 Datagram 时会设定一个期望的 WKC 值。每个成功处理该 Datagram 的从站都会对 WKC 进行加 1 操作具体增量取决于命令类型和从站配置。Frame 返回主站后主站读取实际的 WKC 值与期望值进行比较。8.2 WKC 的工程价值工业控制中WKC 是判断 EtherCAT 网络通信是否正常的关键指标现象可能原因wkc expectedWKC通信正常wkc expectedWKC某个从站未响应掉线、断网、状态异常wkc 0所有从站均未响应严重通信故障SOEM 示例代码中的典型用法if(wkcexpectedWKC){printf(Communication error: WKC%d, expected%d\n,wkc,expectedWKC);}简单来说如果你看到从站断开或通信超时WKC 是检查的第一站。九、为什么 EtherCAT 可以达到微秒级实时综合前面几章的讨论EtherCAT 之所以能达到微秒级实时有四个关键原因1. 数据提前映射无协议解析开销通过 PDO Mapping 和 FMMU 配置数据在主站 IOMap 中的位置是固定的。主站发送和接收时只需拷贝字节流无需逐字段解析索引和子索引。2. 单帧遍历无需轮询一个 Ethernet Frame 经过所有从站每个从站一边转发一边处理自己的数据。不存在逐个节点轮询的累加延迟。3. 硬件 ESC 自动处理无需 CPU 干预EtherCAT 从站控制器ESC自动完成数据提取和插入从站 CPU 只需在数据到达时读取 ESC 内存无需逐字节处理 Frame。4. 逻辑地址空间统一访问主站将所有从站的数据映射到一块连续的 4GB 逻辑地址空间操作 IOMap 就像操作本地内存一样高效。十、本章总结通过分析 SOEM 周期通信源码我们理解了 PDO 数据发送和接收的完整流程组件职责ecx_send_processdata()创建 EtherCAT Frame、填充 PDO 输出数据、发送ecx_receive_processdata()接收 Frame、检查 WKC、更新输入 PDOLRW 命令一次 Frame 同时完成写入输出和读取输入WKC判断从站是否正确处理了数据至此我们已经完成了 EtherCAT 主站开发的核心链路网卡初始化 → 扫描从站 → 配置 PDO → 生成 IOMap → 周期通信这是一个从无到有、从配置到运行的完整闭环。十一、下一篇预告下一篇将回到 EtherCAT 从站状态机但这次深入 SOEM 源码层面《从零开发 EtherCAT 主站九EtherCAT 状态机源码解析从 INIT 到 OP 的完整切换流程》重点分析SOEM 如何控制从站状态切换ecx_writestate()/ecx_statecheck()各状态切换失败时的典型原因实际调试中如何利用状态机定位问题
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门