TwinCAT3 EtherCAT抓包
在运用TwinCAT测验EtherCAT EOE功用时,咱们会发现正常是无法运用Wireshark去进行网络抓包抓取EtherCAT报文的,今日这篇文章就带咱们来上手EtherCAT抓包方法。
预备环境。
硬件环境:
EtherKit开发板。
网线一根。
Type-C。USB。线一根。
软件环境。
TwinCAT3。
RT-Thread。studio。
wireshark。
EtherCAT EOE工程下载。
首要 RT-Thread studio 装置 EtherKit。 SD。K 包,然后新建一个示例工程:etherkit_ethercat_eoe,编译并下载程序;
将。电脑。一端网线衔接至 EtherKit 的 ETH0,一起修正。以太网。适配器IP坚持与从站IP在同一网段下:
调查开发板串口状况,此刻可以看到 eoe app 现已正常运行了:
TwinCAT3。 模仿。EtherCAT主站发动。
在发动 TwinCAT3进程中还需求装备ESI文件及装置Twin CAT驱动,可参阅EtherKit用户手册,此处不再胪陈;
接下来咱们主站扫描从站设备,并激活该从站设备:
激活从站设备后可以看到 EtherKit 开发板板载以太网指示灯正常作业,一起默许从站。DC。形式为 SM-Synchron :。
TwinCAT3装备DC-Synchron。
首要咱们需求敞开 wireshark 抓包支撑,右键点击 Device,在。 Ad。apter 中勾选 Promiscuous Mode(use with Wireshark only)来敞开稠浊形式;
接着咱们需求先切换DC形式,由默许的 SM-Synchron 形式切换为 DC-Synchron;
接着咱们点击上方导航栏 TwinCAT->Restart TwinCAT(config Mode);
提示 Restart TwinCAT system in config Mode,点击确认;
shell再次提示 Load IO设备,点击确认;
然后点击激活;
接着咱们再切换回 SM-Synchron,并翻开wireshark,挑选对应的网卡设备,此刻就可以看到ECAT报文了;
EtherCAT数据帧结构。
EtherCAT数据直接运用以太网数据帧进行传输,帧类型为0x88A4。一个EtherCAT数据包含2个字节的数据头和44~1498字节的数据,其间数据区由一个或多个EtherCAT子报文组成,每个子报文对应独立的设备或从站存储区域;
EtherCAT帧结构界说。
EtherCAT帧结构界说。
每个EtherCAT子报文包含子报文头、数据域和相应的作业计数器(WKC,Working Coun。te。r);WKC记录了子报文被从站操作的次数,主站为每个。通讯。服务子报文设置预期的WKC,发送子报文中的作业计数器初值为0,子报文被从站正确处理后,作业计数器将添加一个增量,主站比较回来子报文中的WKC和预期WKC来判别子报文是否被正确处理;WKC由ESC在处理数据帧的一起进行处理,不同的通讯服务对WKC的添加方法不同;
EtherCAT子报文结构界说。
EtherCAT报文剖析。
1.恳求报文。
首要咱们设置过滤规矩:
ecat.cmd==BRD && ecat.ado==0x130。
咱们随机抓取一条BRD报文,主站向从站发送的偏移地址为 0x130 的报文,表明读取从站特定。寄存器。(如设备标识符、状况字等)的值。此类报文在体系初始化或状况监测中常被运用。
2.应对报文。
从站发动进程:主站顺次向偏移地址 0x120 发送 1、2、4、8 指令,操控从站顺次进入初始化(INIT)、预操作(PRE-OP)、安全形式(SAFE-OP)和操作形式(OP):
ecat.ado==0x120 && (ecat.adp==0x03e9 ||ecat.adp==0xffff)。
其间 ecat.adp == 0xffff 表明播送方法,主站向一切从站发送指令;而 ecat.adp==0x03e9(例如)表明特定从站地址(可根据实践地址修正)发送操控指令。
3.操控指令与EOE报文过滤。
咱们运用如下过滤规矩来抓取EtherCAT操控指令与以太网封装(EOE, Ethernet。over EtherCAT)相关的报文:
(ecat.ado==0x120 || ecat_mailbox.eoe) && (ecat.adp==0x03e9 || ecat.adp==0xffff)。
解析阐明。
ecat.ado==0x120:表明抓取拜访地址偏移 0x120 的寄存器指令,此为 从站状况操控寄存器,主站通过它向从站发送形式切换指令(如INIT、PRE-OP、SAFE-OP、OP);
ecat_mailbox.eoe:表明抓取一切 EOE协议封装的以太网数据,EOE答应通过EtherCAT传输规范以太网帧(如TCP/IP、UDP);
ecat.adp==0x03e9:指定从站地址为 0x03e9(十进制1001),用于单个从站点对点通讯;
ecat.adp==0xffff:表明播送指令,主站向一切从站一起建议操作。
运用场景。
此过滤规矩可用于一起监控:
主站对某个从站(或悉数从站)的作业形式操控行为;
通过EOE传输的数据帧(常见于运用TCP/IP通讯的EtherCAT从站,如带IP。接口。的长途IO模块或工业摄像头);
下面是运用Wireshark实践抓包状况:
4. EtherCAT EOE抓包TCP报文。
首要咱们修正工程目录下的 src/hal_entry.c 文件,将该文件悉数替换为如下代码:
/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Iden。ti。fier: Ap。ac。he-2.0** Change Logs:* Date Author Notes* 2024-03-11 Wangyuqiang fi。rs。t version*/#include#include"hal_data.h"#include#include#include#include#include#include#defineBUFSZ (1024)staticconstcharsend_data[] ="This is TCP Server from RT-Thread.";voidhal_entry(void){ rt_kprintf("\nHello RT-Thread!\n"); rt_kprintf("==================================================\n"); rt_kprintf("This example project is an ethercat eoe routine!\n"); rt_kprintf("==================================================\n");}staticvo。idt。cpserv(void*pa。ram。eter){ char*recv_data;/* 用于接纳的指针,后边会做一次动态分配以恳求可用内存 */ socklen_tsin_size; intsock, connected, bytes_received; structsockaddr_inserver_addr, client_addr; rt_bool_tstop = RT_FALSE;/* 中止标志 */ intret; recv_data =rt_malloc(BUFSZ +1);/* 分配接纳用的数据缓冲 */ if(recv_data == RT_NULL) { rt_kprintf("No memory\n"); return; } /* 一个socket在运用前,需求预先创立出来,指定SOCK_STREAM为TCP的socket */ if((sock =socket(AF_INET, SOCK_STREAM,0)) ==-1) { /* 创立失利的错误处理 */ rt_kprintf("Socket error\n"); /* 开释已分配的接纳缓冲 */ rt_free(recv_data); return; } /* 初始化服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port =htons(5000);/* 服务端作业的。端口。*/ server_addr.sin_addr.s_addr = INADDR_ANY; rt_。mems。et(&(server_addr.sin_zero),0,sizeof(server_addr.sin_zero)); /* 绑定socket到服务端地址 */ if(bind(sock, (structsockaddr *)&server_addr,sizeof(structsockaddr)) ==-1) { /* 绑定失利 */ rt_kprintf("Unable to bind\n"); /* 开释已分配的接纳缓冲 */ rt_free(recv_data); return; } /* 在socket上进行监听 */ if(listen(sock,5) ==-1) { rt_kprintf("Listen error\n"); /* release recv buffer */ rt_free(recv_data); return; } rt_kprintf("\nTCPServer W。ai。ting for client on port 5000...\n"); while(stop != RT_TRUE) { sin_size =sizeof(structsockaddr_in); /* 承受一个客户端衔接socket的恳求,这个函数调用是堵塞式的 */ connected =accept(sock, (structsockaddr *)&client_addr, &sin_size); /* 回来的是衔接成功的socket */ if(connected。 < 0) { rt_kprintf("accept connection failed! errno = %dn", errno); continue; } /* 接受返回的client_addr指向了客户端的地址信息 */ rt_kprintf("I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); /* 客户端连接的处理 */ while (1) { /* 发送数据到connected socket */ ret = send(connected, send_data, strlen(send_data), 0); if (ret < 0) { /* 发送失败,关闭这个连接 */ closesocket(connected); rt_kprintf("nsend error,close the socket.rn"); break; } else if (ret == 0) { /* 打印send函数返回值为0的警告信息 */ rt_kprintf("n Send warning,send function return 0.rn"); } /* 从connected socket中接收数据,接收buffer是1024大小,但并不一定能够收到1024大小的数据 */ bytes_received = recv(connected, recv_data, BUFSZ, 0); if (bytes_received < 0) { /* 接收失败,关闭这个connected socket */ closesocket(connected); break; } else if (bytes_received == 0) { /* 打印recv函数返回值为0的警告信息 */ rt_kprintf("nReceived warning,recv function return 0.rn"); closesocket(connected); break; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if (strcmp(recv_data, "q") == 0 || strcmp(recv_data, "Q") == 0) { /* 如果是首字母是q或Q,关闭这个连接 */ closesocket(connected); break; } else if (strcmp(recv_data, "exit") == 0) { /* 如果接收的是exit,则关闭整个服务端 */ closesocket(connected); stop = RT_TRUE; break; } else { /* 在控制终端显示收到的数据 */ rt_kprintf("RECEIVED DATA = %s n", recv_data); } } } /* 退出服务 */ closesocket(sock); /* 释放接收缓冲 */ rt_free(recv_data); return ;}static int tcpserv_app(void){ rt_thread_t tcps = rt_thread_create("tcpserv", tcpserv, RT_NULL, 2048, 18, 10); if(tcps != RT_NULL) { rt_thread_startup(tcps); } return 0;}
编译下载后从头烧录程序并发动,在从站成功衔接到主站后,履行 tcpserv_app 指令来发动一个 TCP Server:
一起咱们翻开 TCP 测验软件,装备 TCP 客户端,装备信息如下:
方针IP:192.168.10.100(从站IP)。
方针端口:5000。
一起翻开 Wireshark ,查看 EtherCAT EOE网络下的 TCP报文可以被成功捕获:
附录1 EtherCAT通讯服务指令。
EtherCAT 子报文一切的服务都是以主站操作描绘的。数据链路层去规则了从站内部物理存储、读写和交流(读取并立刻写入)数据的服务。读写操作和寻址方法一起决议了子报文的通讯服务类型, 由子报文头中的指令字节表明:
主站接纳到回来数据帧后,查看子报文中的WKC,假如不等于预期值,则表明此子报文没有被正确处理。子报文的WKC预期值与通讯服务类型和寻址地址相关。子报文通过某一个从站时,假如是单独地读或写操作, WKC 加1 。假如是读写操作, 读成功时WKC加1,写成功时WKC 加2 ,读写悉数完结时WKC加3,子报文由多个从站处理时, WKC是各个从站处理结果的累加。
附录2 EtherCAT状况码。
内容来源:https://sonybravia.xyz/app-1/slots temple,http://chatbotjud.saude.mg.gov.br/app-1/br.ice-cassino
本文地址:http://w.21nx.com/article/73763623-11e0799981.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。