3. PDO映射原理:映射参数与映射条目、SM通道配置、FMMU配置
好,咱们进入第三章节。PDO映射,说白了就是解决一个核心问题:主站怎么知道从站的哪个输入字节对应哪个变量?
我刚开始接触EtherCAT时,觉得这东西很玄乎。后来亲手配过几次,发现其实就是几张表的事。你只要把这几张表填对了,数据就自动跑起来了。
3.1 映射参数与映射条目
先看映射参数。每个PDO都有一组映射条目,每个条目指向一个具体的对象字典条目。举个例子:
// 一个典型的PDO映射条目结构
// 0x1A00: 第1个发送PDO的映射对象
// 子索引0: 映射条目数量
// 子索引1: 第1个映射条目
// 子索引2: 第2个映射条目
// ...
// 映射条目格式(32位):
// Bit 31-16: 对象索引
// Bit 15-8: 子索引
// Bit 7-0: 位长度
// 示例:映射0x6000子索引1的8位数据
// 0x60000108
// 分解:0x6000(对象索引) | 0x01(子索引) | 0x08(8位)
我个人习惯把映射条目想象成“地址转换表”。主站发来一个PDO,从站根据这张表,把收到的数据填到对应的对象字典里。反过来也一样。
关键点:映射条目必须连续排列,不能有空隙。比如你映射了8位+16位+8位,那PDO数据就是4字节连续排列。中间不能跳过一个字节。
我在项目中遇到过一个问题:某从站有32个数字量输入,我映射了4个字节。结果主站只收到3个字节的数据。查了半天,发现是映射条目数量写错了——只配了3个条目。嗯,这种低级错误,犯过一次就记住了。
3.2 SM(同步管理器)通道配置
SM通道,你可以理解为数据进出的“管道”。每个SM通道负责管理一段内存区域,控制数据怎么在主站和从站之间交换。
典型的SM通道配置:
| SM通道 | 方向 | 用途 | 典型对象 |
|---|---|---|---|
| SM0 | 主站→从站 | 邮箱通信(配置) | 0x1C00 |
| SM1 | 从站→主站 | 邮箱通信(配置) | 0x1C01 |
| SM2 | 主站→从站 | 输出PDO | 0x1C10 |
| SM3 | 从站→主站 | 输入PDO | 0x1C11 |
你想想看,SM2和SM3才是真正跑实时数据的通道。SM0和SM1只是用来做初始配置的,跑完就基本不用了。
小技巧:配置SM通道时,一定要确认起始地址和长度。我曾经把SM2的起始地址设错了,结果输出数据覆盖了输入数据区。现场调试时,输出一个信号,输入也跟着变——那场面,挺尴尬的。
SM通道的配置参数包括:
- 物理起始地址:在从站本地内存中的起始位置
- 长度:该通道管理的字节数
- 控制寄存器:配置通道的工作模式(缓冲模式/邮箱模式)
- 状态寄存器:指示通道的当前状态
3.3 FMMU配置
FMMU(现场总线内存管理单元)是EtherCAT最核心的机制之一。它负责把从站的本地内存映射到主站的过程数据映像中。
说白了,FMMU就是一张“地址重映射表”。主站发来的数据帧里,每个从站只关心自己那一段。FMMU告诉从站:“你的数据在帧里的这个位置,拿去用吧。”
// FMMU配置结构(每个从站最多配4个FMMU)
typedef struct {
uint32_t 物理起始地址; // 从站本地内存地址
uint32_t 逻辑起始地址; // 主站过程数据映像中的地址
uint16_t 长度; // 映射的字节数
uint8_t 类型; // 0=输入, 1=输出
uint8_t 激活; // 0=禁用, 1=启用
} FMMU_Config;
// 示例:将从站本地地址0x1000开始的4字节
// 映射到主站过程数据映像的0x2000位置
FMMU_Config fmmu0 = {
.物理起始地址 = 0x1000,
.逻辑起始地址 = 0x2000,
.长度 = 4,
.类型 = 0, // 输入
.激活 = 1
};
注意:FMMU的逻辑起始地址不能重叠。多个从站的FMMU映射到同一地址,数据就会打架。我见过一个项目,两个从站都映射到了0x2000,结果一个从站的输入数据把另一个的输出数据覆盖了。排查了整整两天。
FMMU配置的步骤:
- 确定从站需要映射的数据量(输入+输出)
- 分配逻辑起始地址(主站过程数据映像中的位置)
- 配置物理起始地址(从站本地内存中的位置)
- 设置长度和类型
- 激活FMMU
为什么需要FMMU?因为EtherCAT数据帧是串行经过每个从站的。如果没有FMMU,每个从站都要解析整个数据帧,效率极低。有了FMMU,从站只关心自己那一段,硬件自动完成数据提取和插入。
核心逻辑:PDO映射 + SM通道 + FMMU配置,这三者共同构成了EtherCAT从站的数据通路。映射决定“映射什么”,SM决定“怎么传输”,FMMU决定“映射到哪里”。缺一不可。
这张图把整个数据通路串起来了。你从主站过程数据映像开始,经过FMMU重映射,再到SM通道管理,最后落到从站本地内存。而PDO映射对象,就是告诉你哪些数据需要走这条路。
实战建议:调试时,先确认FMMU配置是否正确。用示波器抓一下数据帧,看看从站是否在正确的位置提取/插入数据。如果FMMU配错了,后面SM和PDO映射再对也没用。