IgH调试注意事项

1,不要在虚拟机测试,否则IgH无法收发数据包

现象:虚拟机中运行IgH master并绑定网卡后,主站由ORPHANED状态转换成IDLE状态,但无法收发数据报。

这是因为虚拟机用的是虚拟网卡,需通过iptables将数据包到转发到真实的网卡上,实现收发数据的目的。但IgH替换了网卡驱动程序,收到数据包后,处理流程没有走内核的网络协议栈,所以工作中tcp/ip层的iptables就不起作用,导致IgH无法正常收发报文。

虚拟机网络原理参考:ubuntu20.04 搭建kernel调试环境第六篇(下)-网络原理-CSDN博客  

解决:物理机安装ubuntu用来测试IgH。

2,获取IgH的INFO、WARNING、ERR信息

root@ubuntu:/home/gsf# echo 7 7 7 7 > /proc/sys/kernel/printk

#define EC_MASTER_INFO(master, fmt, args...) \printk(KERN_INFO "EtherCAT %u: " fmt, master->index, ##args)#define EC_MASTER_WARN(master, fmt, args...) \printk(KERN_WARNING "EtherCAT WARNING %u: " fmt, master->index, ##args)#define EC_MASTER_ERR(master, fmt, args...) \printk(KERN_ERR "EtherCAT ERROR %u: " fmt, master->index, ##args)

3,获取IgH的DEBUG信息

root@ubuntu:/home/gsf# vim /etc/init.d/ethercat

#MASTER_ARGS= 改成下面MASTER_ARGS="debug_level=2"

务必注意:注意,make modules_install install后,需要重新修改

DEBUG主要是输出一些收发报文的数据,比如:

[73996.353863] EtherCAT DEBUG 0: ec_master_send_datagrams(device_index = 0)
[73996.353863] EtherCAT DEBUG 0: Adding datagram 0x2E
[73996.353864] EtherCAT DEBUG 0: frame size: 46
[73996.353864] EtherCAT DEBUG 0: Sending frame:
[73996.353864] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 
[73996.353867] EtherCAT DEBUG: 05 2E 01 00 20 01 02 00 00 00 02 00 00 00 00 00 
[73996.353869] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
[73996.353871] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 

4,dmesg日志不全

现象:IgH源码中加了很多打印,连接从站后,发现dmesg会失了部分日志。

下面的下图显示的是ec_master_idle_thread --> ecrt_master_send --> ec_master_send_datagrams发送数据报文时,增加的printk打印。

datagram->index用的是master->datagram_index++,初始化是master->datagram_index为0,所以所有主站发送的数据报文的index应该是从0递增的,最大值255(master->datagram_index是uint8_t类型),到最大值后又从0开始计数。

原因:主站初始化时,ec_master_idle_thread线程循环执行,循环时间比较短,见下面代码:

ec_master_idle_thread函数:if (ec_fsm_master_idle(&master->fsm)) {set_current_state(TASK_INTERRUPTIBLE);schedule_timeout(1);   --------------- 1个jiffies} else {schedule();  ---------切换到其他线程执行,如果系统空闲,会继续执行该线程}

不接从站,printk信息比较少,可以完整输出。接上从站,代码流程复杂,自己加了很多printk,由于循环时间短,每轮循环都有大量的信息,来不及输出,就丢失了部分log。

解决:

方法一:直接修改主站的循环周期

ec_master_idle_thread函数://ec_master_set_send_interval(master, 1000000 / HZ);
ec_master_set_send_interval(master, 5000000); -------改动1,主站周期从4ms改成5sif (ec_fsm_master_idle(&master->fsm)) {// set_current_state(TASK_INTERRUPTIBLE);// schedule_timeout(1); msleep(100); ----------改动2,注掉上面2行} else {//schedule(); msleep(100); ----------改动2,注掉上面1行}

方法二:间接修改主站的循环周期

因为ec_master_idle_thread 每个周期都会执行ecrt_master_send --> ec_master_send_datagrams发送数据报文,所以可以在发送报文时加个延时:

ec_master_idle_thread函数://ec_master_set_send_interval(master, 1000000 / HZ);
ec_master_set_send_interval(master, 5000000); -------改动1,主站周期从4ms改成5s-----------------------------------------------------------------------------void ec_master_send_datagrams(ec_master_t *master, /**< EtherCAT master */ec_device_index_t device_index /**< Device index. */)
{do {frame_data = NULL;follows_word = NULL;more_datagrams_waiting = 0;// fill current frame with datagramslist_for_each_entry(datagram, &master->datagram_queue, queue) {if (datagram->state != EC_DATAGRAM_QUEUED ||datagram->device_index != device_index) {continue;}……list_add_tail(&datagram->sent, &sent_datagrams);datagram->index = master->datagram_index++;EC_MASTER_DBG(master, 2, "Adding datagram 0x%02X\n",datagram->index);msleep(100); ------------在这里加个延时

修改后,log是全的。报文从0开始,发送、接收是一一对应的:

5,过滤掉IgH主站插网线之前的log

IgH主站网卡没有插网线,意味着网卡的link_state处于down状态,ec_master_idle_thread周期性执行ecrt_master_send发送数据报文,在ecrt_master_send中如果网卡处于link down状态,则会设置报文为EC_DATAGRAM_ERROR,在这里加个printk(见下代码),log中过滤关键字EC_DATAGRAM_ERROR就可以了。

void ecrt_master_send(ec_master_t *master)
{ec_datagram_t *datagram, *n;ec_device_index_t dev_idx;if (master->injection_seq_rt != master->injection_seq_fsm) {// inject datagram produced by master FSMec_master_queue_datagram(master, &master->fsm_datagram);master->injection_seq_rt = master->injection_seq_fsm;}ec_master_inject_external_datagrams(master);for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);dev_idx++) {if (unlikely(!master->devices[dev_idx].link_state)) {// link is down, no datagram can be sentlist_for_each_entry_safe(datagram, n,&master->datagram_queue, queue) {if (datagram->device_index == dev_idx) {//在这里加行logprintk(KERN_ERR "geshifei %s %d:  set datagram->state = EC_DATAGRAM_ERROR\n",__func__, __LINE__);datagram->state = EC_DATAGRAM_ERROR;list_del_init(&datagram->queue);}}

6,IgH发送、接收的报文怎么看

以IgH读从站状态的广播报文0x0130为例,打开DEBUG后,demsg看到的报文:

发送报文:

[18773.590655] geshifei ec_master_send_datagrams 1059:  Adding datagram datagram->index=0
[18773.590656] EtherCAT DEBUG 0: frame size: 46
[18773.590656] EtherCAT DEBUG 0: Sending frame:
[18773.590658] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 
[18773.590664] EtherCAT DEBUG: 07 00 00 00 30 01 02 00 00 00 00 00 00 00 00 00 
[18773.590669] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
[18773.590674] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 

响应报文:

[18773.710617] EtherCAT DEBUG 0: Received frame:
[18773.710618] EtherCAT DEBUG: FF FF FF FF FF FF 6E 24 08 29 52 19 88 A4 0E 10 
[18773.710624] EtherCAT DEBUG: 07 00 01 00 30 01 02 00 00 00 02 00 01 00 00 00 
[18773.710628] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
[18773.710633] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 
[18773.710636] geshifei ec_master_receive_datagrams 1224:  datagram->index=0

7,wireshark报文怎么看

1)注意source mac被从站改动过,为什么改,不清楚,感觉没必要。

2)正常情况下,发送的报文WC = 0,响应报文的WC不为0(存在从站的情况下)

所以可通过上面两个特征来判断哪个是发送报文,哪个是接收报文。

datagram->index用的是master->datagram_index++,初始化是master->datagram_index为0,所以所有主站发送的数据报文的index应该是从0递增的,最大值255(master->datagram_index是uint8_t类型),到最大值后又从0开始计数。

响应的报文,不会(也不能)修改Index值,因为IgH主站程序收到响应报文后,需要根据报文的index去匹配对应的发送报文,然后将发送报文从内部的发送队列中删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296501.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有关List的线程安全、高效读取:不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue

有关List的线程安全 队列、链表之类的数据结构也是极常用的&#xff0c;几乎所有的应用程序都会与之相关。在java中&#xff0c; ArrayList和Vector都使用数组作为其内部实现。两者最大的不同在与Vector是线程安全的。 而ArrayList不是。此外LinkedList使用链表的数据结构实现…

【VB测绘程序设计】案例4——简单的四则运算练习Select Case语句的使用(附源码)

【VB测绘程序设计】案例4——简单的四则运算练习(附源码) 文章目录 前言一、界面预览二、程序介绍总结前言 在新手学习VB程序设计中,四则运算是基础,通过设计的TexT、按钮、label等控件,定义变量,实现简单程序的编写,提高对VB程序的入门训练。 一、界面预览 二、程序介…

【MybatisPlus快速入门】(2)SpringBoot整合MybatisPlus 之 标准数据层开发 代码示例

目录 1 标准CRUD使用2 新增3 删除4 修改5 根据ID查询6 查询所有7 MyBatis-Plus CRUD总结 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节中我们重点学习的是数据层标准的CRUD(增删改查)的实现与分页功能。代码比较多&#xff0c;我们一个个来学习…

【开源】基于JAVA语言的企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

九、W5100S/W5500+RP2040之MicroPython开发<HTTPOneNET示例>

文章目录 1. 前言2. 平台操作流程2.1 创建设备2.2 创建数据流模板 3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;MicroPython和树莓派PICO正…

2023,测试开发人的年终总结

根据TesterHome社区发帖整理。从该年终总结可以看出当前测试行业&#xff0c;哪怕是测试开发也是竞争很厉害。作为测试同仁&#xff0c;不但要掌握功能测试、接口测试、性能测试&#xff0c;掌握各种工具使用&#xff0c;还得懂开发&#xff0c;懂Java/Python&#xff0c;懂VUE…

【零基础入门Docker】什么是Dockerfile Syntax

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门Docker专栏https://blog.csdn.net/arthas777/category_12455882.html 目录 编写Dockerfile和Format的语法 2. MAINTAINER 3. RUN 4. ADD 6. ENTRYPOINT 7. CMD 8. EXPOSE 9. VOLUME 11. USER 12. ARG …

MySQL创建member表失败

最近在做一个项目&#xff0c;在台式机上可以跑通&#xff0c;也测试了各个已完成的接口&#xff0c;提交到了GitHub后想着用宿舍的电脑跑一下&#xff0c;在测试member表相关接口时就出错了。报了SQL语法错误&#xff0c;但SQL语句很简单&#xff0c;就根据手机号查询不至于出…

实习课知识整理4:点击某个商品如何跳转到并展示出商品详情页

项目情景&#xff1a;当我们点击某个商品时&#xff0c;我们需要查看商品的具体的信息并进行购买的操作 简单理解以下就是&#xff0c;当我们点击一个url链接时&#xff0c;该链接需要携带一个参数到后端&#xff0c;一般设为商品的Id&#xff0c;然后后端通过Id从数据库中查找…

NGUI基础-三大基础组件之Root组件

NGUI NGUI&#xff08;Next-Gen UI&#xff09;是一款用于Unity游戏引擎的UI插件&#xff0c;它提供了一套功能强大、灵活易用的界面开发工具。在NGUI中&#xff0c;Root&#xff08;根节点&#xff09;是一个重要的概念。 基础组件之Root Root是NGUI中的最高层级节点&#…

linux运行可执行文件,通过c语言调用java的main方法

前言&#xff1a;以前一直在做Android开发&#xff0c;在某本书上看过一句话“Android上面不只有App类的程序可以运行&#xff0c;能在linux下运行的程序&#xff0c;也可以在Android上面运行” 一.编写C语言部分代码 1.定义java.h头文件 #include <jni.h>#ifndef _JAV…

计算机网络概述(下)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天继续计算机网络概述的学习&#xff0c;下面&#xff0c;让我们一起进入计算机网络概述的世界吧&#xff01;&#xff01;&#xff01; 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…