0 工具准备
1.EtherCAT主站
2.EtherCAT从站(本文使用步进电机驱动器)
3.Wireshark
1 抓包分析
1.1 报文总览
本文设置从站1的对象字典,设置对象字典主索引为0x2000,子索引为0x00,设置值为1500。主站通过发送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,也就是SM0缓冲区空闲,从站没有需要读取的消息,可以直接进入下一阶段。
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数据,显示了对象字典对应的名称已经正确的主索引、子索引、SDO处理结果:3。
值得一提的是,如果设置的值超过了对象字典的允许范围导致设置不成功,会返回传输中止请求:
使用SDO写报文时可以利用这一特点,判断自己写入的值是否合理。
2 总结
EtherCAT主站SDO写报文可以分为以下5个阶段:
①检查SM1缓冲区是否空闲,不空闲则先将邮箱消息读出
②检查SM0缓冲区是否空闲,不空闲则等待从站将邮箱消息读走
③发送CoE请求给从站
④检查SM1缓冲区是否满,满则代表已经可以从邮箱读出SDO数据
⑤读取邮箱数据,查看返回结果是否正常