對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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82211.shtml
英文地址,請注明出處:http://en.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關鍵字實現更靈活的線程同步。以下是其核心特性和使用方法的詳細說明: 核心特性 可重入性 同一個線程可以重復獲取同一個鎖(鎖的持有計數…