EtherCAT SDO报文分析
EtherCAT网络帧结构
完整的EtherCAT报文由以下三部分组成:
-
Ethernet Header(以太网头部):包含源MAC地址、目的MAC地址及帧类型标识(0x88A4表示EtherCAT协议),总长度14字节。
-
Ethernet Data(数据段):包含EtherCAT协议定义的子报文(Datagram),用于传输具体指令与数据。
-
FCS(Frame Check Sequence):4字节的CRC校验字段,用于数据完整性验证。
SDO Download服务分析
以对象字典索引0x2002为例,执行以下操作:
-
向子索引0x01写入4字节数据
0x0100ACD3
。 -
向子索引0x02写入3字节数据
0x23456
。
wireshark筛选制定对象字的方法:(eth.type == 0x88a4) && (ecat_mailbox.coe) && (ecat_mailbox.coe.sdoidx==0x2002)
报文抓取与解析
通过Wireshark过滤COE(CANopen over EtherCAT)协议内容,捕获SDO下载服务报文:
-
EtherCAT Header解析:
-
CMD:0x05,表示FPWR(Configured Physical Address Write)命令,用于从站非周期性数据写入。
-
Index:0xE8,标识从站逻辑地址映射。
-
ADP(Address Pointer):0x03EC,表示从站物理地址,由主站自动分配。
-
ADO(Address Offset):0x1000,指向从站DPRAM(分布式过程数据内存)的偏移地址,由ESI(EtherCAT从站信息)文件定义。
-
Length:16字节,表示数据段长度,对应SDO下载服务的有效载荷。
-
-
EtherCAT Mailbox协议解析:
-
CoE SDO Request:服务类型为“Initial Download Request”(操作码0x23),总长度10字节。
-
SDO请求字段:
-
Object Index:0x2002(2字节),目标对象字典索引。
-
Subindex:0x01(1字节),目标子索引。
-
Data:0x0100ACD3(4字节),写入的32位数据。
-
-
-
Working Counter机制:
从站成功执行写操作后,Working Counter(WKC)值递增。通过对比写请求前后的WKC值(如0x0000→0x0001),可验证操作是否成功。
多Datagram现象分析
在抓包结果中观察到两个EtherCAT Datagram,原因如下:
-
单缓冲Mailbox实现:当Mailbox输出缓冲区(MBX Out)配置为0x80字节时,需填充完整缓冲区后从站方可读取数据。
-
数据填充逻辑:实际SDO下载服务仅占用16字节,剩余缓冲区需通过附加Datagram(如向偏移地址0x107F写入1字节标志位)补足,以触发从站读取操作。
SDO Initiate Download过程
1512行和1514行是ethercat模拟canopen协议中SDO服务的请求下载报文(只有ethercat主站才能主动发起报文)。1512行是主站发起请求下载报文,1514行是请求下载报文经过指定从站时,从站将下载数据0x0100acd3放进自己的SMbuffer,然后将working counter加1放入ethercat报文中,最后回到主站。
可以看FPWR中的SDO req 为0x23这是请求写4字节数据
0x23就是SDO的命令符,请求写4个字节
1518行和1520行是对SDO Initiate download的响应(SDO Res);报文由ethercat主站发起,经过指定从站时将128字节数据放在报文中最后回到主站。注意这128字节数据是定义的MBX out缓冲区的大小。
在FPRD这段报文中, COE部分显示的是SDO req,这就是SDO应答的意思,0x60就是表示写成功应答;在ethercat通信中,SDO的写请求与写成功应答都是由主站发起的
initiate download指令,是请求写从站的DPRAM中的MBX out缓冲区(缓冲区为空的时候才能写),即Ado为0x1000的偏移地址;写成功后由从站将WKC加1并生成一个事件。然后从站的应用读取这片区域后,会将数据写道MBX in缓冲区,准备主站的写应答命令,相应的SM通道解锁该内存区域,保证了主站下一次的写入操作。
在FPWR之后主站发送FPRD命令就是为了确认从站是否真的被正确的写入数据,从站在被成功写入数据后,会将数据放到MBX in缓冲区,让主站去读,这个过程如下: