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改成5s

if (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 datagrams
        list_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 FSM
        ec_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 sent
            list_for_each_entry_safe(datagram, n,
                    &master->datagram_queue, queue) {
                if (datagram->device_index == dev_idx) {
                    //在这里加行log
                    printk(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去匹配对应的发送报文,然后将发送报文从内部的发送队列中删除。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

WSL移动ubuntu到其他盘的几个问题以及安装,使用过程中遇到bug记录

这里写目录标题 无法正常修改Ubuntu系统的默认用户解决方案1&#xff1a;解决方案2&#xff1a; 出现 id xxx no such userGUI不能正常显示 无法正常修改Ubuntu系统的默认用户 ubuntu移动到其他盘可以参考WSL Ubuntu子系统迁移到非系统盘 下面问题是我安装时遇到的&#xff0c…

蓝桥杯c/c++程序设计——接龙数组

问题描述 对于一个长度为 K的整数数列&#xff1a;A1,A2,...,AK我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1的末位数字 (2≤i≤K)。 例如 12,23,35,56,61,1112,23,35,56,61,11 是接龙数列&#xff1b;12,23,34,5612,23,34,56 不是接龙数列&#xff0c;因为 56 的…

蓝桥杯:日期问题

目录 引言一、日期问题1.题目描述2.代码实现3.测试 二、回文日期1.题目描述2.代码实现3.测试 引言 关于这个蓝桥杯的日期问题&#xff0c;其实有一个明确的思路就感觉很简单&#xff0c;这个思路就是不用依照日期的顺序去把每一天走完&#xff0c;而是根据一个数加一&#xff…

生成模型 | 三维重建(3D reconstruction)调研及总结【20231219更新版】

本文是关于三维重建的论文调研&#xff0c;主要集中于基于图片到3d的模型&#xff0c;其中期刊会议标志如下&#xff1a; [&#x1f916; ICCV 2023 ] 1.3D综述系列 2019_Image-based 3D Object Reconstruction: State-of-the-Art and Trends in the Deep Learning Era 论文地…

树莓派,opencv,Picamera2利用舵机云台追踪人脸(PID控制)

一、需要准备的硬件 Raspiberry 4b两个SG90 180度舵机&#xff08;注意舵机的角度&#xff0c;最好是180度且带限位的&#xff0c;切勿选360度舵机&#xff09;二自由度舵机云台&#xff08;如下图&#xff09;Raspiberry CSI 摄像头 组装后的效果&#xff1a; 二、项目目标…

【K8s】4# 使用kuboard部署开源项目实战

文章目录 1.开源项目2.实战2.1.创建spring-blade命名空间2.2.导入 spring-blade 到 K8S 名称空间2.3.设置存储卷参数2.4.调整节点端口2.5.确认导入2.6.查看集群2.7.导入配置到 nacos2.8.启动微服务工作负载 3.验证部署结果3.1.Nacos3.2. web 4.问题汇总Q1&#xff1a;Nacos启动…

Blender插件-The Grove 10 树木生长动画植物插件

注意&#xff1a;Blender和The Grove的版本匹配。 亲测Blender 2.9与The Grove 10可以配合使用&#xff0c;Blender 3.6会报错&#xff0c;具体看报错记录。 一、下载 CG咖官网地址&#xff1a; Blender插件-树木生长插件植物生成插件 The Grove 10插件资产库 CSDN下载地址…

EasyExcel使用: RGB字体,RGB背景颜色,fillForegroundColor颜色对照表

EasyExcel使用: RGB字体&#xff0c;RGB背景颜色&#xff0c;fillForegroundColor颜色对照表 使用EasyExcel导出表格可能会对字体颜色和单元格背景颜色进行自定义的修改。 可以自定义字体颜色或者每个单元格的颜色 要想自定义颜色&#xff0c;需要重写CellWriteHandler接口&am…

gem5 garnet l1 l2 cache的创建与相连

gem5 garnet l1 l2 cache的创建与相连 主要就是这个图&#xff1a; 细节 我们用的是gem5/configs/deprecated/example/fs.py #fs.py 引入了上两层路径&#xff0c;也就是当前可以看到 gem5/configs/路径。 addToPath("../../")#fs.py引入了gem5/configs/ruby/Ru…

Spring Boot集成RocketMQ之消息对象序列化

以下源码基于rocketmq-spring-boot-start 2.1.1版本&#xff0c;其它版本可能会有差异 一. 前言 当我们在Spring Boot项目中集成RocketMQ后&#xff0c;只需要在配置文件(application.yml)中添加rocketmq的相关配置&#xff0c;即可使用rocketMQTemplate发送对象消息。登录Ro…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图&#xff1a; 上图&#xff0c;我们模拟一个 1.0 的路由通过 AS 65101 来传递 1&#xff1a;通过图可知&#xff0c;A 与 B 之间的 Peer 为 EBGP&#xff0c;B 与 E 之间为 Peer IBGP&#xff0c;E 与 F 之间为 Peer EBGP 邻接 2&a…

1.使用 Blazor 利用 ASP.NET Core 生成第一个 Web 应用

参考 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/create 1.使用vs2022创建新项目 选择 C# -> Windows -> Blzxor Server 应用模板 2.项目名称BlazorApp下一步 3.选择 .NET6.0 或 .NET7.0 或 .NET8.0 创建 4.运行BlazorApp 5.全部选择是。 信…

【CF闯关练习】—— 800分段

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

基于西门子博途电机运行时间的先起先停控制

这是我同事在2019年做的一个功能&#xff0c;基于这个功能&#xff0c;可以形成类似的其他更多的功能&#xff0c;这些功能在一些项目上的实用性还是比较强&#xff01; 1&#xff0c;控制目标博途工控人平时在哪里技术交流博途工控人社群 根据需要启动电机的数量&#xff0c…

PhysX——源码编译

从git下载源码 git主页 https://github.com/NVIDIA-Omniverse/PhysXclone地址 https://github.com/NVIDIA-Omniverse/PhysX.git源码编译 运行PhysX需要两个编译器的支持&#xff0c;CMake 3.12 或以上版本以及Python 2.7.6 版本 进入工程的 physx 目录&#xff0c;运行generate…

案例109:基于微信小程序的高校寻物平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

KubePi JWT 默认密钥权限绕过漏洞复现(CVE-2023-22463)

0x01 产品简介 KubePi 是一款简单易用的开源 Kubernetes 可视化管理面板。 0x02 漏洞概述 KubePi 存在权限绕过漏洞,攻击者可通过默认 JWT 密钥获取管理员权限控制整个平台,使用管理员权限操作核心的功能。 0x03 影响范围 KubePi <= 1.6.2 0x04 复现环境 FOFA: ti…

CUMT--Java复习--泛型与集合

目录 一、泛型 1、概述 2、通配符 3、有界类型 二、集合 1、概述 2、迭代器接口 三、集合类 1、Collection接口 2、List接口 3、Set接口 4、Queue接口 5、Map接口 四、集合转换 五、集合工具类 一、泛型 1、概述 从JDK5.0开始&#xff0c;Java引入泛型类型&…

微服务之服务注册与发现

服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要 Service Provider 地址就行了。当下用于服务注册的工具非常多 ZooKeeper&#xff0c;Consul&…