对WireShark 中的EtherCAT抓包数据进行解析

对WireShark 中的EtherCAT抓包数据进行解析

EtherCAT数据包结构

EtherCAT数据帧结构如下:

在这里插入图片描述

采用 Python 实现对 EtherCAT 数据包进行解析


import numpy as np
import matplotlib.pyplot as plt
from IPython import embed
from collections import Counter
import  pyshark
import pcapng
from datetime import datetime
import dpkt
import socket
from dpkt.utils import mac_to_str, inet_to_str# https://zhuanlan.zhihu.com/p/582336672#打开抓包文件# 位置寻址
#    - APRD(1): Auto Increment Read
#    - APWR(2): Auto Increment Write
#    - APRW(3): Auto Increment Read Write
# # 节点寻址
#    - FPRD(1): Configuration address Read
#    - FPWR(2): Configuration address Write
#    - FPRW(3): Configuration address Read Write
# # 广播寻址
#    - BRD(1): Broadcast Read
#    - BWR(2): Broadcast Write
#    - BRW(3): Broadcast Read Write
# # 逻辑寻址
#    - LRD(1): Logic Memory Read
#    - LWR(2): Logic Memory Write
#    - LRW(3): Logic Memory Read Write
# # 位置寻址
#    - APMW(13): Auto Increment Read Multiple Writecnt =  2
old_timestamp = 0
file_path = "./TestJoint.pcapng"time_list_pc_to_control = []
time_list_control_to_pc = []
data_list = []joint_cmd = []
joint_fd = []
with open(file_path,"rb") as fp:pcapng_data = dpkt.pcapng.Reader(fp)for timestamp, buf  in pcapng_data:eth = dpkt.ethernet.Ethernet(buf)cnt += 1## Ethernet_II 帧格式# ## 1、目标 Mac 地址# eth.dst# ## 2、源 Mac 地址# eth.src## 3、得到Ethernet II 数据帧的类型。类型字段(Type )用于标识数据字段中包含的高层协议。类型字段取值为0x0800的帧代表IP协议帧;类型字段取值为0x0806的帧代表ARP协议帧。## 0x0800: IP IP协议## IPv4:     0x0800## ARP:      0x0806## IPV6:     0x86DD## EtherCAT: 0x88A4# print(hex(eth.type))# 如果是EtherCAT 的数据帧if(eth.type == 0x88a4):ethercat_data = eth.data## 解析EtherCAT 头,数据帧的前两个字节ethercat_data_head = int.from_bytes(ethercat_data[:2], byteorder='little')### 得到数据的长度  11 bit, 后面有一个bit的保留位ethercat_data_length = (ethercat_data_head & 0x0fff)### 得到EtherCAT 的类型 4bitethercat_data_cmd = (ethercat_data_head & 0xf000) >> 12## 解析一个子报文## 解析子报文的头ethercat_subdata_head = int.from_bytes(ethercat_data[2:12], byteorder='little')## 命令 8 bit## LRW = 12ethercat_subdata_head_cmd = ethercat_data[2]if ethercat_subdata_head_cmd == 12:## 索引 8 bitethercat_subdata_head_index = ethercat_data[3]## 地址区 32 bitethercat_subdata_head_address = int.from_bytes(ethercat_data[4:8], byteorder='little')## 长度 11 bit  216 个字节ethercat_subdata_head_length = int.from_bytes(ethercat_data[8:10], byteorder='little') & 0x0eff## R 3 bitethercat_subdata_head_R = (int.from_bytes(ethercat_data[8:10], byteorder='little') & 0x3000) >> 13## C 1 bitethercat_subdata_head_C = (int.from_bytes(ethercat_data[8:10], byteorder='little') & 0x4000) >> 14## M 1 bit## 0: 表示只有 1 包数据## 1:表示后面还有数据包ethercat_subdata_head_M = (int.from_bytes(ethercat_data[8:10], byteorder='little') & 0x8000) >> 15## 状态位 16 bitethercat_subdata_head_status = int.from_bytes(ethercat_data[10:12], byteorder='little')## 1:表示后面还有数据包if(ethercat_subdata_head_M == 1):ethercat_subdata_data = ethercat_data[12:12 + ethercat_subdata_head_length ]j1_cmd = int.from_bytes(ethercat_subdata_data[4:8], byteorder='little', signed = True)j2_cmd = int.from_bytes(ethercat_subdata_data[16:20], byteorder='little', signed = True)j3_cmd = int.from_bytes(ethercat_subdata_data[28:32], byteorder='little', signed = True)j4_cmd = int.from_bytes(ethercat_subdata_data[40:44], byteorder='little', signed = True) j5_cmd = int.from_bytes(ethercat_subdata_data[52:56], byteorder='little', signed = True)j6_cmd = int.from_bytes(ethercat_subdata_data[64:68], byteorder='little', signed = True) j1_fd = int.from_bytes(ethercat_subdata_data[76:80], byteorder='little', signed = True) j2_fd = int.from_bytes(ethercat_subdata_data[100:104], byteorder='little', signed = True) j3_fd = int.from_bytes(ethercat_subdata_data[124:128], byteorder='little', signed = True) j4_fd = int.from_bytes(ethercat_subdata_data[148:152], byteorder='little', signed = True)j5_fd = int.from_bytes(ethercat_subdata_data[172:176], byteorder='little', signed = True)j6_fd = int.from_bytes(ethercat_subdata_data[196:200], byteorder='little', signed = True) joint_cmd.append([j1_cmd, j2_cmd, j3_cmd, j4_cmd, j5_cmd, j6_cmd])joint_fd.append([j1_fd, j2_fd, j3_fd, j4_fd, j5_fd, j6_fd])joint_cmd_1 = np.mat(joint_cmd)
joint_fd_1 = np.mat(joint_fd)for i in range(6):plt.plot(joint_cmd_1[:,i],label = 'cmd')plt.plot(joint_fd_1[:,i],label = 'fd')plt.xlabel("time[ms]")plt.ylabel("pos[cnt]")plt.legend()plt.show()

下面是从数据包解析得到的关节1 和 关节 5 的关节脉冲指令值以及反馈值。
在开始阶段需要将当前的脉冲指令值和反馈值进行同步一下。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于SpringBoot的校园电竞赛事系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

数据湖和数据仓库的区别

在当今数据驱动的时代,企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案,各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势,帮助读者更好地…

Mysql 刷题Day09

LC 585 2016年的投资 思路: 本题思路好想 , 就是把2015年投资相同的找出来 ,再找出这其中经纬度不同的id对应的2016年的保险。 实际操作中, 发现用group by很麻烦, 那么想到窗口函数也能 分组进行统计 利用 count(…

Lambda表达式的方法引用详解

Lambda表达式的方法引用详解 1. 方法引用的概念与作用 定义:方法引用(Method Reference)是Lambda表达式的一种简化写法,允许直接通过方法名引用已有的方法。核心目的:减少冗余代码,提升可读性,尤其在Lambda仅调用一个现有方法时。语法符号:双冒号 ::。2. 方法引用的四种…

记录python在excel中添加一列新的列

思路是,先将需要添加为新的列存储到一个暂时的列表中,然后用到以下函数来存储 data_.loc[:, "新列的名字"] save_list_ 上面的save_list_就是暂时存储了信息的列表了。 以下是我的代码,供以后快速回忆。 schools_data {"98…

关于flutter中Scaffold.of(context).openEndDrawer();不生效问题

原因: 在 Flutter 中,Scaffold.of(context) 会沿着当前的 context 向上查找最近的 Scaffold。如果当前的 widget 树层级中没有合适的 Scaffold(比如按钮所在的 context 是在某个子 widget 中),就找不到它。 解决办法…

财管-1-财务分析、评价和预测

1.因素分析法: 报告期(实际)指标M1A1 * B1 * C1 基 期(计划)指标M0A0 * B0 * C0……(1) 第一次替代 A1 * B0 * C0……(2) 第二次替代 A1 * B1 * C0……(3…

golang逃逸分析

1.1 逃逸分析是什么 逃逸分析是指编译器在执行静态代码分析后,对内存管理进行的优化和简化。 在编译原理中,分析指针动态范围的方法被称为逃逸分析。通俗来讲,当一个对象的指针被多个方法或线程引用时,则称这个指针发生了逃逸。…

Meetily:AI会议记录,开源、免费、好用(本地AI实时转录、隐私保护一步到位!)

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、初识Meetily:什么是真正的智能会议助手?1. 核心优势一览2. 技术架构揭秘二、实战体验:从安装到使用的完整流程1. 系统要求2. 快速安装指南Wi…

.NET ORM开发手册:基于SqlSugar的高效数据访问全攻略

SqlSuger是一个国产,开源ORM框架,具有高性能,使用方便,功能全面的特点,支持.NET Framework和.NET Core,支持各种关系型数据库,分布式数据库,时序数据库。 官网地址:SqlS…

【论文阅读】KIMI-VL TECHNICAL REPORT

KIMI-VL TECHNICAL REPORT 原文摘要 核心模型:Kimi-VL 模型架构:基于 MoE 设计,仅激活语言解码器的 2.8B 参数(Kimi-VL-A3B),在保持高效计算的同时实现高性能。 MoE(Mixture of Experts&#xf…

项目管理学习-CSPM4(2)

1 前言 最近在学习CSPM的课程,部分内容让我受益匪浅。建议需要提升项目管理能力的同学可以通过以考促学的方式进行学习。下面整理了一部分内容和大家分享。CSPM全称China Standards Project Management,中文名为项目管理专业人员能力评价等级证书&#…

【Web前端】ECMAScript 6基础学习

ECMAScript 6 简介 ECMAScript 和 JavaScript 的关系:前者是后者的规格,后者是前者的一种实现,常场合,这两个词是可以互换的。 ECMAScript 6(以下简称 ES6)是 JavaScript 语言的标准,在 2015 年 6 月发布…

基于Python的全卷积网络(FCN)实现路径损耗预测

以下是一份详细的基于Python的全卷积网络(FCN)实现路径损耗预测的技术文档。本方案包含理论基础、数据生成、模型构建、训练优化及可视化分析,代码实现约6000字。 基于全卷积网络的无线信道路径损耗预测系统 目录 问题背景与需求分析系统架构设计合成数据生成方法全卷积网络…

AI数字人一体机和智慧屏方案:开启智能交互新纪元

在当今这个信息化飞速发展的时代,AI技术正以前所未有的速度改变着我们的生活方式和工作模式。特别是在人机交互领域,AI数字人的出现不仅极大地丰富了用户体验,也为各行各业提供了前所未有的创新解决方案。本文将重点介绍由广州深声科技有限公…

练习实践--deepseek的使用环境搭建回顾--火山方舟

快速回顾 有更多第三方可以提供免费的大模型体验服务,比如硅基流动/火山方舟,通过选择指定模型,生成模型id和自己的API-KEY这两个信息,可以在第三方集成ai工具,如cherry studio上使用; 参考来源 来自阮一…

Adminer 连接mssql sqlserver

第一步 docker-compose.yml adminer部分: version: 3.8 services: adminer: image: adminer:latest container_name: adminer restart: unless-stopped volumes: - ./freetds/freetds.conf:/etc/freetds.conf:rw # 确保 :rw 可读写 co…

JWT令牌详解及Java中的使用实战

JWT令牌详解及Java中的使用实战 摘要 本文将深入解析**JWT(JSON Web Token)**的核心概念,通过图文并茂的方式详解其工作原理,并手把手教你在Java中实现JWT的生成、验证与解析。无论你是认证授权新手还是想巩固知识的老手&#x…

晶圆隐裂检测提高半导体行业效率

半导体行业是现代制造业的核心基石,被誉为“工业的粮食”,而晶圆是半导体制造的核心基板,其质量直接决定芯片的性能、良率和可靠性。晶圆隐裂检测是保障半导体良率和可靠性的关键环节。 晶圆检测 通过合理搭配工业相机与光学系统&#xff0c…

Java 的 ReentrantLock

Java中的ReentrantLock是java.util.concurrent.locks包下提供的一个可重入互斥锁,用于替代synchronized关键字实现更灵活的线程同步。以下是其核心特性和使用方法的详细说明: 核心特性 可重入性 同一个线程可以重复获取同一个锁(锁的持有计数…