丢包现象
1. 初始化丢包导致驱动器状态迁移失败
2. 进入OP状态丢包导致重新扫描总线
3. 进入OP状态隔1-2min丢一个包
EtherCAT抓包
用EtherCAT分析仪或者igh自带的虚拟网卡抓包。
igh抓包
正常编译
./configure --prefix=$install_path --with-linux-dir=$path_linux_kernel --enable-8139too=no --enable-generic=yes --host=arm-linux-gnueabihf
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
添加抓包功能编译,--enable-debug-if=yes
./configure --prefix=$install_path --with-linux-dir=$path_linux_kernel --enable-8139too=no --enable-generic=yes --host=arm-linux-gnueabihf --enable-debug-if=yes
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
重新替换掉ko后启动,执行ifconfig -a就可以看到ecdbgm0网卡,ifconfig ecdbgm0 up启动网卡才能抓包。
抓包命令:
tcpdump -i ecdbgm0 -w tmp.cap
过滤
- 使用Wireshark打开tmp.cap并输入过滤条件;
- 点击“文件”-->选择“导出分组解析结果”-->选择“As CSV...”,保存为csv格式,得到两份csv文件;
- 用wps打开csv文件,Time列就是时间戳,相邻两行相减得到发送或者接收包间隔,再降排序,如果最大的间隔是周期的两倍或者以上,说明有丢包。
过滤条件:
过滤发送包:
(eth.type == 0x88a4) && (ecat.cnt == 0)
过滤接收包:
(eth.type == 0x88a4) && (ecat.cnt != 0)
保存csv:
通过分析,发送正常,接收出现丢包(通过分析csv定位丢包,再通过时间戳反相在WireShark中找到丢包位置):
问题分析
初步分析
因为发送正常,接收没有数据包,所以应该在某个驱动器丢的。要进一步分析在哪个驱动器丢的。
驱动器分析
读错误计数器
查阅资料发现驱动器有错误计数器寄存器,读每个驱动器的0x0300和0x0301寄存器。
脚本rx_err_counter.sh读每个驱动器的0x0300和0x0301寄存器(8个驱动器):
#!/bin/bash
echo 0x0300
sudo ethercat reg_read -t uint8 0x0300 -p 0
sudo ethercat reg_read -t uint8 0x0300 -p 1
sudo ethercat reg_read -t uint8 0x0300 -p 2
sudo ethercat reg_read -t uint8 0x0300 -p 3
sudo ethercat reg_read -t uint8 0x0300 -p 4
sudo ethercat reg_read -t uint8 0x0300 -p 5
sudo ethercat reg_read -t uint8 0x0300 -p 6
sudo ethercat reg_read -t uint8 0x0300 -p 7
echo 0x0301
sudo ethercat reg_read -t uint8 0x0301 -p 0
sudo ethercat reg_read -t uint8 0x0301 -p 1
sudo ethercat reg_read -t uint8 0x0301 -p 2
sudo ethercat reg_read -t uint8 0x0301 -p 3
sudo ethercat reg_read -t uint8 0x0301 -p 4
sudo ethercat reg_read -t uint8 0x0301 -p 5
sudo ethercat reg_read -t uint8 0x0301 -p 6
sudo ethercat reg_read -t uint8 0x0301 -p 7
测试方法
1. 启动应该程序
2. 查看是否启动成功
执行dmesg|grep EtherCAT,看到OP状态,表示已经启动成功
3. 查看错误计数器
执行date && ./rx_err_counter.sh
截图记录当前状态
4. 查看是否丢包
执行dmesg|grep EtherCAT;
测试1小时或者出现丢包为止。
OP之后出现“datagram TIMED OUT!”表示有丢包;没有则没有丢包。
5. 出现丢包
执行date && ./rx_err_counter.sh
截图记录当前状态
0x0300和0x0301接收错误计数器,都有8行,第几行出现增加,表示第几个驱动器的线出现问题。
如图第5个驱动器增加,表示其接收到错误包,则第4个和第5个驱动器之间连线有问题。
总结
偶尔丢包是由于线造成的,可能是干扰,换带有屏蔽功能的线就没有丢包了。
其他问题
一直打印丢包
EtherCAT WARNING 0: 500 datagrams TIMED OUT!
EtherCAT WARNING 0: 500 datagrams TIMED OUT!
EtherCAT WARNING 0: 500 datagrams TIMED OUT!
出现这种情况,可能原因:
- 使用generic通用模式的网卡驱动,但是没有网卡没有打开,执行ifconfig ethX up;
- igh开启了冗余功能,但是只用一个网卡导致丢包。备用网卡也要使用,执行命令启动两个网卡
insmod ec_master.ko main_devices=75:42:f5:84:40:e0 backup_devices=75:42:f5:84:40:e8
驱动器报0xFF10
可能原因:
1. 抱闸没有打开;
2. 接线有问题,电机缺相导致;