3、EtherCAT报文类型详解:APRD、APWR、FPRD、FPWR、BRD、BWR、LRW、LWR、ARMW、FRMW

各位同学,咱们今天来啃一块硬骨头——EtherCAT的报文类型。说实话,我刚接触EtherCAT那会儿,看到这堆缩写也是一脸懵。APRD、FPRD、LRW……这都什么跟什么?

但搞运动控制,这关必须过。你想想看,你写的程序要跟伺服驱动器通信,发什么报文、怎么发、什么时候发,全得靠这些指令。搞不清楚,调试的时候就会抓瞎。

我个人习惯把EtherCAT报文分成三大类:单播广播多播。咱们一个一个来拆。

3.1 单播报文:APRD、APWR、FPRD、FPWR

单播,说白了就是“点对点”。主站指定一个从站,只跟它说话。

APRD(Auto Increment Physical Read)

这个报文用从站的物理位置来寻址。第一个从站地址是0,第二个是1,依此类推。主站发一个APRD,报文经过一个从站,地址就自动加1。直到地址匹配,那个从站就把数据填回去。

关键点:APRD的地址是动态的。如果中间某个从站掉线了,后面的地址全乱套。我在项目中遇到过,产线上有个从站接触不良,结果整个链路上的数据都读错了。排查了整整一下午。

APWR(Auto Increment Physical Write)

跟APRD类似,不过是写操作。主站往指定位置的从站写数据。同样依赖物理位置,同样脆弱。

避坑指南:我曾经在一个多轴同步项目里用APWR写参数,结果因为从站上电顺序不同,地址对不上,导致参数写到了错误的驱动器上。后来我改用FPRW,再没出过这种问题。

FPRD(Fixed Physical Read)

这个就稳多了。FPRD用从站的固定物理地址(通常是拨码开关设定的地址)来寻址。不管从站接在哪个位置,地址不变。

嗯,这里要注意:FPRD的地址是静态的,但需要你提前给每个从站分配好。我一般会在设计阶段就规划好地址表,贴在现场的机柜上。

FPWR(Fixed Physical Write)

固定地址写。跟FPRD配对使用。我个人习惯在初始化阶段用FPWR写配置,运行阶段用FPRD读状态。

3.2 广播报文:BRD、BWR

广播,就是“一呼百应”。主站发一条,所有从站都收到。

BRD(Broadcast Read)

主站发BRD,所有从站同时把自己的数据填到报文里。注意,是“同时”。每个从站只填自己负责的那一段数据,互不干扰。

为什么会这样?因为EtherCAT的帧结构里,每个从站都有固定的数据位置。主站事先分配好了,谁填哪一段,清清楚楚。

BWR(Broadcast Write)

所有从站同时接收相同的数据。比如你要让所有伺服同时急停,发一条BWR就行,效率极高。

经验之谈:广播报文虽然快,但别滥用。我曾经在一个项目里用BWR同时写100个从站的参数,结果总线负载瞬间飙升,导致其他实时数据丢包。后来我改成分批写,问题解决。

3.3 多播报文:LRW、LWR

多播,介于单播和广播之间。主站指定一组从站,只跟它们通信。

LRW(Logical Read Write)

这是EtherCAT里最常用的报文,没有之一。LRW同时完成读和写操作。主站发一条LRW,指定逻辑地址范围,范围内的从站同时读和写。

在运动控制中,PDO(过程数据对象)的交换几乎全靠LRW。每个周期,主站发一条LRW,所有驱动器同时上报位置、速度,同时接收新的目标值。效率极高。

// 伪代码示例:LRW报文处理
uint8_t lrw_frame[] = {
    0x00, 0x00,           // 逻辑地址起始
    0x40, 0x00,           // 数据长度(64字节)
    0x03,                 // 命令:LRW
    // ... 后续数据
};

LWR(Logical Write)

只写不读。如果你只需要下发数据,不需要回读,用LWR更省带宽。比如更新一组参数,用LWR就够了。

3.4 特殊报文:ARMW、FRMW

这两个比较特殊,属于“读后写”的原子操作。

ARMW(Auto Increment Read Multiple Write)

先读一个从站的数据,然后把这个数据写到多个从站。注意,读和写是原子操作,中间不会被其他报文打断。

我在同步抓取项目中用过ARMW。主站先读主手的当前位置,然后同时写到所有从手,实现位置同步。效果很好,但要注意数据一致性。

FRMW(Fixed Read Multiple Write)

跟ARMW类似,但用固定地址读。更稳定,更可靠。我个人更推荐用FRMW,除非你确定物理位置不会变。

核心总结:

  • 单播(APRD/APWR/FPRD/FPWR):点对点,适合配置和诊断
  • 广播(BRD/BWR):一对多,适合急停、同步事件
  • 多播(LRW/LWR):组通信,PDO交换首选
  • 特殊(ARMW/FRMW):原子操作,适合同步控制

3.5 报文类型选择策略

说了这么多,到底怎么选?我给大家一个实用建议:

场景 推荐报文 原因
初始化配置 FPWR / FPRD 地址固定,可靠
周期PDO交换 LRW 读写一体,效率高
紧急停止 BWR 广播,响应最快
多轴同步 FRMW 原子操作,数据一致
故障诊断 APRD / FPRD 逐站读取,定位准确

你想想看,搞运动控制,说白了就是跟时间和数据赛跑。选对报文类型,能省下不少调试时间。

3.6 报文处理流程图

下面这张图是我自己画的,把EtherCAT报文处理的逻辑串了一遍。你对照着看,应该能更清楚。

EtherCAT报文处理流程 EtherCAT主站 选择报文类型 单播(APRD等) 多播(LRW等) 广播(BRD等) 指定从站响应 组内从站响应 所有从站响应 数据返回主站

这张图把整个流程串起来了。主站先选报文类型,然后根据类型决定是单播、多播还是广播,从站响应后数据再返回主站。嗯,逻辑很清晰。

我的建议:刚开始学的时候,别急着背所有报文。先把LRW和BWR用熟,这两个覆盖了90%的运动控制场景。其他的遇到再查,慢慢就记住了。

好了,EtherCAT的报文类型就讲到这里。记住,报文只是工具,关键是你怎么用它来解决问题。下一章咱们聊聊数据帧的结构,那个更底层,也更有意思。


公众号:蓝海资料掘金营,微信deep3321