0 工具准备
1.EtherCAT主站
2.EtherCAT从站(本文使用步进电机驱动器)
3.Wireshark
1 抓包分析
1.1 报文总览
本文读取从站1的对象字典,读取对象字典主索引为0x2000,子索引为0x00。主站通过发送SDO读报文实现对该对象字典的读取,这一过程使用Wireshark抓包如下:
1.2 SDO读取阶段1:检查SM1缓冲区是否空闲
这一阶段主站通过FPRD报文去读取SM1缓冲区是否空闲。当bit3为0时表示当前SM1缓冲区为空闲状态,没有需要读取的邮箱信息,如果bit3为1表示当前SM1缓冲区满有需要读取的邮箱信息。
本例中返回的数据为0x80,也就是SM1缓冲区空闲,没有需要读取的消息,可以直接进入下一阶段。否则需要先将邮箱内消息读出。
1.3 SDO读取阶段2:检查SM0缓冲区是否空闲
这一阶段主站通过FPRD报文去读取SM0缓冲区是否空闲。当bit3为0时表示当前SM0缓冲区为空闲状态,表示可以写入邮箱消息,如果bit3为1表示当前SM0缓冲区满要一直等到从站将邮箱消息取走缓冲区空闲。
本例中返回的数据为0x02,也就是SM1缓冲区空闲,没有需要读取的消息,可以直接进入下一阶段。
1.3 SDO读取阶段3:发送CoE请求给从站
这一阶段主站通过FPWR报文发送CoE请求给从站请求从站上传SDO(服务数据对象)信息。
1.4 SDO读取阶段4:检查SM1缓冲区是否满
这一阶段主站间隔一小段时间发送FPRD报文去读取SM1状态寄存器,检查其缓冲区是否已满,已满则代表从站已经处理完毕了CoE请求,将SDO数据放到了邮箱内。
可以看到最后一次FPRD报文返回的SM1状态寄存器值为0x09,这表示有SDO数据可以从邮箱读取了。
1.5 SDO读取阶段5:读取邮箱数据
最后一个阶段的操作就是去读取邮箱数据,去哪里读呢?去主站初始化阶段获取到的主站读邮箱偏移地址处去取。
可以看到从站返回的FPRD报文内已经填充了SDO数据,显示了对象字典的值和其对应的名称。
2 总结
EtherCAT主站SDO读报文可以分为以下5个阶段:
①检查SM1缓冲区是否空闲,不空闲则先将邮箱消息读出
②检查SM0缓冲区是否空闲,不空闲则等待从站将邮箱消息读走
③发送CoE请求给从站
④检查SM1缓冲区是否满,满则代表已经可以从邮箱读出SDO数据
⑤读取邮箱数据,拿走SDO数据