上一篇文章介绍了EtherCAT的帧结构,本文主要介绍三种重要的数据交换命令--LRD、LWR和LRW。只有通过数据交换,才能通过EtherCAT主站把从站的数据收集上来,也才能给从站发送控制指令。关键就是所有数据流向都要从主站视角去看,inputs表示从站给的数据,比如位置、速度等数据;outpus表示给从站下发数据、指令,注意是闭环流程,需要从站返回数据。ecx_receive_processdata_group-接收数据┌─────────────────────────────────────────────────────────────────┐│ ecx_receive_processdata_group 流程 │├─────────────────────────────────────────────────────────────────┤│ ││ 【1. 弹栈获取发送时的记录】 ││ pos = ecx_pullindex(context) ││ ├── 从 idxstack 取出之前记录的 ││ │ - idxstack->data[pos] // IOmap 目标地址 ││ │ - idxstack->length[pos] // 数据长度 ││ │ - idxstack->idx[pos] // 帧缓冲区索引 ││ └── while (pos >= 0) 遍历所有发送的帧 ││ ││ 【2. 等待帧到达】 ││ wkc2 = ecx_waitinframe(&context->port, idx, timeout) ││ ├── 接收以太网帧到 rxbuf[idx] ││ └── 返回 WKC 值 ││ ││ 【3. 复制数据到 IOmap】 ★ 关键 memcpy ★ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ if (LRD 或 LRW): │ ││ │ memcpy(idxstack->data[pos], │ ││ │ &rxbuf[idx][EC_HEADERSIZE], │ ││ │ idxstack->length[pos]); │ ││ │ // 从帧数据区 → IOmap │ ││ └─────────────────────────────────────────────────────────┘ ││ ││ 【4. 读取 WKC】 ││ memcpy(&le_wkc, &rxbuf[idx][EC_HEADERSIZE + length], 2); ││ wkc = etohs(le_wkc); ││ ││ 【5. 释放缓冲区】 ││ ecx_setbufstat(&context->port, idx, EC_BUF_EMPTY); ││ │└─────────────────────────────────────────────────────────────────┘
ecx_send_processdata_group-发送数据┌─────────────────────────────────────────────────────────────────┐│ ecx_send_processdata_group 流程 │├─────────────────────────────────────────────────────────────────┤│ ││ 【1. 获取帧索引】 ││ pos = ecx_getindex(context) ││ ├── 分配一个空闲的帧缓冲区索引 ││ └── idx = idxstack->idx[pos] ││ ││ 【2. 构建数据报】 ││ ecx_setupdatagram(context, idx, EC_CMD_LRW, ││ logaddr, size, IOmap + offset) ││ ├── 在 rxbuf[idx] 中写入 10 字节头 ││ ├── 从 IOmap[offset] 复制 size 字节到数据区 ││ └── 设置 WKC 期望值 ││ ││ 【3. 发送帧】 ││ ecx_outframe_red(context->port, idx) ││ ├── 补充 Ethernet 头和 CRC ││ └── 调用网卡驱动发送 ││ ││ 【4. 入栈】 ││ ecx_pushindex(context, pos) ││ ├── idxstack->data[pos] = IOmap + offset ← 记录目标地址! ││ ├── idxstack->length[pos] = size ← 记录长度! ││ └── pos++ ││ │└─────────────────────────────────────────────────────────────────┘
1.数据交换非常关键,仅有帧不进行数据交换,那么主站无法控制和获取从站的状态和数据,进而无法了解和控制伺服终端;2.没有工业网络就没有数据,网络和数据本身就密不可分;3.AI的很多推理可以直接让主站额外存储一份共享内存,模型通过这块共享内存进行推理,从而加快工业的推理;目前我们很多AI应用都是落到数据库之后再做的,显然无法满足要求。