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报文处理的逻辑串了一遍。你对照着看,应该能更清楚。
这张图把整个流程串起来了。主站先选报文类型,然后根据类型决定是单播、多播还是广播,从站响应后数据再返回主站。嗯,逻辑很清晰。
我的建议:刚开始学的时候,别急着背所有报文。先把LRW和BWR用熟,这两个覆盖了90%的运动控制场景。其他的遇到再查,慢慢就记住了。
好了,EtherCAT的报文类型就讲到这里。记住,报文只是工具,关键是你怎么用它来解决问题。下一章咱们聊聊数据帧的结构,那个更底层,也更有意思。
公众号:蓝海资料掘金营,微信deep3321