4. PDO通信机制与过程数据映射

PDO(Process Data Object)是EtherCAT CoE中承载周期性过程数据的核心机制。与SDO通过邮箱通道按需读写对象字典不同,PDO在从站进入OP状态后,由主站按固定周期在过程数据帧中直接携带输入/输出数据,从站硬件在收到帧的瞬间完成数据搬运,不经过邮箱协议栈。理解PDO的关键在于三个层面:映射关系(哪些对象字典条目被放进PDO)、同步管理器配置(PDO走哪个SM通道、方向与长度)、以及传输触发方式(周期性还是事件性)。本节围绕这三点,设计一个可实际运行的PDO数据监视器。

PDO映射的本质:把对象字典条目“投影”到过程数据区

PDO映射不是复制数据,而是建立一条从对象字典到过程数据缓冲区的地址投影。以0x1A00(TxPDO映射,从站→主站)为例,其子索引0记录映射条目数,子索引1..n每个条目用32位描述一个被映射对象:低16位是对象索引,中间8位是子索引,高8位是位长度。例如条目 0x60000110 表示映射 0x6000:01,长度16位。多个条目按顺序拼接,形成一段连续的位流,从站固件在过程数据中断中按此布局打包或解包。

映射必须满足两个约束:一是总位长必须与同步管理器为该PDO分配的长度一致;二是被映射对象必须支持PDO映射(对象字典中该条目的PDO映射标志位为1)。若映射长度与SM长度不符,从站通常会在PREOP→SAFEOP转换时返回AL Status Code 0x001D(SM长度不匹配)或0x001E(映射参数不一致)。

同步管理器配置:PDO的物理通道

同步管理器(SyncManager)是ESC内部的一组通道,每个通道有起始地址、长度、方向和控制寄存器。典型配置中,SM2用于输出过程数据(主站→从站,RxPDO),SM3用于输入过程数据(从站→主站,TxPDO)。配置流程是:先在PREOP下写SM起始地址与长度,再写PDO映射,最后写SM控制寄存器使能。SM长度必须等于映射总位长除以8(向上取整到字节),且起始地址不能与邮箱SM0/SM1重叠。

一个常见的教学示例:某伺服从站,SM2长度8字节,映射0x1600包含控制字0x6040:00(16位)、目标位置0x607A:00(32位)、模式0x6060:00(8位),合计56位,补齐到8字节。SM3长度12字节,映射0x1A00包含状态字0x6041:00(16位)、实际位置0x6064:00(32位)、实际速度0x606C:00(32位)、错误码0x603F:00(16位),合计96位,正好12字节。这些参数需与ESI文件中描述一致,否则主站配置与从站实际能力冲突。

PDO数据监视器结构:映射—同步管理器—过程数据帧 主站应用 RxPDO 输出 0x1600 映射 SM2 · 8字节 TxPDO 输入 0x1A00 映射 SM3 · 12字节 监视器采集 周期采样 / 变化触发 时间戳 + 原始字节 解析与显示 按映射拆字段 物理量换算 从站 ESC SM2 输出缓冲 0x6040 控制字 0x607A 目标位置 SM3 输入缓冲 0x6041 状态字 0x6064 实际位置 对象字典 0x6000..0x6FFF PDO映射标志位 应用固件 过程数据中断 打包/解包 EtherCAT 过程数据帧(每周期) RxPDO 数据区 8字节 · SM2 TxPDO 数据区 12字节 · SM3 监视器采集点 在过程数据帧收发处镜像采样 记录:周期号 · 时间戳 · 原始字节 · 方向 映射条目示例:0x6040:00(16b) + 0x607A:00(32b) + 0x6060:00(8b) = 56b → 补齐8字节 SM长度校验:映射总位长 ÷ 8 必须等于SM配置长度,否则AL Status 0x001D RxPDO(主→从) TxPDO(从→主) 监视器采集

周期性传输与事件性传输

PDO的触发方式由同步管理器控制寄存器的“操作模式”位决定。周期性模式(通常对应SM2/SM3的循环模式)下,主站每个周期都发送/接收过程数据,从站无条件更新缓冲区。事件性传输则用于变化不频繁的数据,例如某些状态量或诊断量,从站仅在数据变化时置位事件标志,主站通过轮询或中断方式读取。在监视器设计中,必须区分这两种模式:周期性数据适合按固定采样率记录,事件性数据适合按变化沿记录,否则会产生大量冗余样本或漏掉关键跳变。

实际工程中,多数伺服和IO从站的RxPDO/TxPDO都配置为周期性。但像0x1C32/0x1C33(SM同步管理器参数)中的“同步类型”字段,可以指示该SM是自由运行、同步于DC还是同步于输入事件。监视器应读取这些参数,决定采样策略。

设计PDO数据监视器

监视器的核心任务是在不干扰正常通信的前提下,捕获过程数据帧中的PDO字节流,并按映射定义解析为可读的物理量。实现上可分为四个模块:采集、缓存、解析、显示。

采集模块:在主站协议栈的过程数据收发回调中插入钩子,复制RxPDO和TxPDO的原始字节。若使用IgH EtherCAT Master,可在 ecrt_domain_data() 返回的指针处按域偏移读取;若使用SOEM,可在 ecx_receive_processdata() 之后按从站输出/输入偏移读取。采集时记录周期计数和本地时间戳(建议使用单调时钟,精度1μs级)。

缓存模块:采用环形缓冲区,容量按“采样率×观察时长”估算。例如1kHz周期、观察10秒,需10000条记录,每条含方向、长度、时间戳和最多32字节数据,约500KB,可接受。若需长时间记录,可降采样或仅记录变化量。

解析模块:依据PDO映射表,把字节流按位偏移拆分为字段。解析时注意字节序:EtherCAT过程数据按小端排列,多字节字段需按小端解释。例如目标位置0x607A为32位有符号整数,位于RxPDO偏移2..5字节,解析为 int32_t pos = buf[2] | buf[3]<<8 | buf[4]<<16 | buf[5]<<24;。再按对象字典中的换算因子(如位置单位、速度比例)转换为工程值。

显示模块:提供表格视图和趋势视图。表格视图按周期列出各字段值,便于逐帧核对;趋势视图把选定字段随时间绘制曲线,便于观察周期性抖动或事件跳变。监视器还应提供“映射校验”功能:把实际SM长度与映射总位长对比,不一致时高亮告警。

可执行的监视器配置示例

以下是一个基于SOEM的采集片段,展示如何在每个周期抓取从站0的TxPDO原始数据并打印前12字节:

// 假设已配置从站0,SM3输入偏移为 io_map[0].inputs
uint8_t *txpdo = ec_slave[0].inputs;
uint32_t cycle = 0;
while (running) {
    ec_send_processdata();
    ec_receive_processdata(EC_TIMEOUTRET);
    // 采集:记录周期号、时间戳、原始字节
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    printf("cycle=%u t=%ld.%09ld txpdo=", cycle++,
           ts.tv_sec, ts.tv_nsec);
    for (int i = 0; i < 12; i++) printf("%02X ", txpdo[i]);
    printf("\n");
    osal_usleep(1000); // 1kHz周期
}

运行后,若看到状态字0x6041的低字节在0x37/0x27之间切换,说明从站正在响应使能命令;若实际位置0x6064的四个字节持续递增,说明电机在运动。若所有字节恒为0,应检查SM3是否使能、映射是否写入、从站是否进入OP。这些判断依据正是监视器的实用价值所在。

监视器采样本身会引入CPU开销。在1kHz以上周期,建议只记录变化字段或使用DMA/双缓冲,避免在实时回调中做格式化输出。调试阶段可临时降低周期或只抓取前若干帧。

结果判读与常见异常

监视器输出中,若发现TxPDO数据在多个周期内完全不变,可能原因有三:从站未进入OP、SM3未使能、或该PDO被配置为事件性传输且当前无事件。若RxPDO写入后从站无响应,应核对控制字是否满足状态机切换条件(如0x6040从0x06→0x07→0x0F)。若映射长度与SM长度不一致,监视器应在启动时打印映射总位长和SM长度,并给出明确提示,而不是等到状态机转换失败才排查。

通过这个监视器,开发者可以把抽象的PDO映射、SM配置和过程数据帧对应起来,看到每个周期实际收发的字节,从而快速定位映射错误、字节序问题、同步配置偏差和状态机卡滞。它既是学习PDO机制的可视化工具,也是工程调试中不可或缺的观测手段。