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配置的步骤:

  1. 确定从站需要映射的数据量(输入+输出)
  2. 分配逻辑起始地址(主站过程数据映像中的位置)
  3. 配置物理起始地址(从站本地内存中的位置)
  4. 设置长度和类型
  5. 激活FMMU

为什么需要FMMU?因为EtherCAT数据帧是串行经过每个从站的。如果没有FMMU,每个从站都要解析整个数据帧,效率极低。有了FMMU,从站只关心自己那一段,硬件自动完成数据提取和插入。

核心逻辑:PDO映射 + SM通道 + FMMU配置,这三者共同构成了EtherCAT从站的数据通路。映射决定“映射什么”,SM决定“怎么传输”,FMMU决定“映射到哪里”。缺一不可。

EtherCAT从站数据通路架构 主站过程数据映像 逻辑地址空间 0x2000 - 0x2FFF 包含所有从站数据 FMMU映射 FMMU单元 地址重映射 逻辑→物理地址转换 硬件自动完成 SM通道 SM通道 SM2: 输出 SM3: 输入 邮箱: SM0/SM1 从站本地内存 物理地址空间 0x1000 - 0x1FFF 对象字典实体存储 数据读写 PDO映射对象 0x1A00: 发送PDO映射 0x1600: 接收PDO映射 映射条目定义 指向 对象字典 0x6000: 输入 0x7000: 输出 实际数据 数据流说明: 1. 主站通过FMMU将过程数据映像映射到从站逻辑地址 2. SM通道管理数据在FMMU和本地内存之间的传输 3. PDO映射对象定义哪些对象字典条目参与PDO传输

这张图把整个数据通路串起来了。你从主站过程数据映像开始,经过FMMU重映射,再到SM通道管理,最后落到从站本地内存。而PDO映射对象,就是告诉你哪些数据需要走这条路。

实战建议:调试时,先确认FMMU配置是否正确。用示波器抓一下数据帧,看看从站是否在正确的位置提取/插入数据。如果FMMU配错了,后面SM和PDO映射再对也没用。