news 2026/4/15 2:55:05

通过EtherCAT报文中的LRW字段分析位置指令与位置反馈的方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通过EtherCAT报文中的LRW字段分析位置指令与位置反馈的方案

引言

作为这篇博客使用抓包盒进行EtherCAT报文时间抖动的分析方法-CSDN博客的延申,在报文有时间戳的情况下,通过提取出来LRW字段中的Target Position 与 Actual Positon 数据,画成曲线,可以直观得分析出指令跟随情况。

解决的问题

先说下为什么想到这么做:在自研的主站控制自研的从站运行时,出现了从站抖动的情况。

从主站端打印出发送的位置指令 与 接受到的 位置反馈 数值,无异常。

从站端打印出接受到的位置指令,与实际的位置反馈 数值,指示出为主站发送的问题。

于是,为了找出究竟谁说了谎,直接抓取网络报文,从报文中提取出来相应字段,继续分析。

具体方法

1、首先抓取到通讯过程的报文,并筛选出主站发送的部分,且保存为pcap格式。

2、提取出LRW字段,与时间戳字段,另存为CSV文件,用于后续的python数据处理。可通过这条指令解决:

tshark -r "name.pcap" -n -Y "ecat.cmd == 12" -T fields -e esl.timestamp -e ecat.data -E separator=, > "lrwtimestamp_data.csv"

输出的CSV文件内容示例:第一列为64位的硬件时间戳,单位为ns。第二列为LRW的28个Byte。

0x00012f1db1c69c48,00000f00a89effff0800eaff000052ff8c2dffff37120f9fffff0800 0x00012f1db1e521b8,00000f00a89effff0800ebff00005dffea2affff3712099fffff0800 0x00012f1db203a8e0,00000f00a89effff0800e5ff00000cffea2affff3712039fffff0800 0x00012f1db2222bf8,00000f00a89effff0800e3ff000021ffe42dffff3712fc9effff0800 0x00012f1db240b078,00000f008a9effff0800e6ff000031ff6830ffff3712f69effff0800 0x00012f1db25f3638,00000f008a9effff0800d9ff00003fff3531ffff3712ef9effff0800 0x00012f1db27db770,00000f008a9effff0800f2ff000028ff2733ffff3712e99effff0800 0x00012f1db29c3bf0,00000f008a9effff0800e4ff000027ffee36ffff3712e39effff0800 0x00012f1db2bac5e8,00000f008a9effff0800f4ff0000a1ff913dffff3712dd9effff0800 0x00012f1db2d945b8,00000f006c9effff0800d9ff0000d1fe7d42ffff3712d79effff0800

本例中LRW内的报文按此组织:

PACKED_BEGIN typedef struct PACKED { int16_t targetTorque; uint16 controlword; int32 targetPostion; int8_t modeOperation; int8_t node; }PDO_Outputs; PACKED_END PACKED_BEGIN typedef struct PACKED { int16_t actTorque; int16_t errCode; int16_t actCurrent; int32_t actVelocity; uint16 statusWord; int32 actualPostion; int8_t actRunMode; int8_t node; }PDO_Input; PACKED_END

从代码中可知,targetPostion为bit4-bit7。actualPostion为bit22-25。

3、通过python代码将上述csv文件中的数据提取出 时间戳 位置指令 位置反馈 ,并画出图,示例代码如下:

import csv import struct import matplotlib.pyplot as plt csv_file = "lrwtimestamp_data.csv" LRW_LENGTH = 28 time_s = [] target_pos = [] actual_pos = [] # ---------- 读 CSV 并解析 ---------- with open(csv_file, newline="") as f: reader = csv.reader(f) for row in reader: if len(row) < 2: continue # 时间戳:hex ns → s t_ns = int(row[0], 16) t_s = t_ns * 1e-9 data = bytes.fromhex(row[1]) if len(data) != LRW_LENGTH: continue target = struct.unpack_from("<i", data, 4)[0] actual = struct.unpack_from("<i", data, 22)[0] time_s.append(t_s) target_pos.append(target) actual_pos.append(actual) # 时间轴归零(推荐) t0 = time_s[0] time_s = [t - t0 for t in time_s] # Following Error following_error = [a - t for a, t in zip(actual_pos, target_pos)] # ---------- 单位换算 ---------- target_pos_deg = [p / 1024.0 for p in target_pos] actual_pos_deg = [p / 1024.0 for p in actual_pos] following_error_deg = [a - t for a, t in zip(actual_pos_deg, target_pos_deg)] # ---------- 创建 Figure 和子图 ---------- fig, (ax1, ax2) = plt.subplots( 2, 1, sharex=True, figsize=(10, 6) ) # ---------- 子图 1:Target vs Actual ---------- ax1.plot(time_s, target_pos_deg, label="TargetPosition") ax1.plot(time_s, actual_pos_deg, label="ActualPosition") ax1.set_ylabel("Position (°)") ax1.set_title("Target vs Actual Position (LRW)") ax1.legend() ax1.grid(True) # ---------- 子图 2:Following Error ---------- ax2.plot(time_s, following_error_deg, label="Following Error") ax2.set_xlabel("Time (s)") ax2.set_ylabel("Error (°)") ax2.set_title("Following Error") ax2.grid(True) plt.tight_layout() plt.savefig( "lrw_position_and_following_error_deg.png", dpi=300, bbox_inches="tight" ) plt.show()

4、输出的图像示例如下:

从图中看,位置指令是按预期发送的,位置反馈出现了波动,定位出了是从站的问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 18:58:19

GPT-SoVITS最新版本更新日志:新增功能与性能优化汇总

GPT-SoVITS&#xff1a;低资源语音克隆的技术突破与工程实践 在短视频、播客和虚拟人内容爆发的今天&#xff0c;个性化语音合成已不再是实验室里的“黑科技”&#xff0c;而是创作者手中实实在在的生产力工具。想象一下&#xff1a;你只需录一分钟朗读&#xff0c;就能让自己的…

作者头像 李华
网站建设 2026/4/13 20:37:19

novelWriter小说创作终极指南:从零开始的高效写作系统

novelWriter小说创作终极指南&#xff1a;从零开始的高效写作系统 【免费下载链接】novelWriter novelWriter is an open source plain text editor designed for writing novels. It supports a minimal markdown-like syntax for formatting text. It is written with Python…

作者头像 李华
网站建设 2026/4/13 23:00:02

27、深入探索WPF图形与动画技术

深入探索WPF图形与动画技术 1. WPF图形绘制基础 WPF(Windows Presentation Foundation)提供了丰富的图形处理能力,允许开发者以多种方式使用不同类型的图形对象。WPF主要提供了两组用于不同目的的图形类,下面为你详细介绍: - DrawingXXX类 :这组类以Drawing开头,用…

作者头像 李华
网站建设 2026/4/14 16:09:38

DankDroneDownloader:大疆无人机固件自由下载神器

你是否曾经为无法获取特定版本的大疆无人机固件而烦恼&#xff1f;当厂商限制固件下载权限时&#xff0c;技术爱好者们该如何应对&#xff1f;DankDroneDownloader正是为解决这一痛点而生的专业工具&#xff0c;让你重新获得对无人机固件的完全控制权。 【免费下载链接】DankDr…

作者头像 李华
网站建设 2026/4/4 13:19:07

dupeguru终极指南:3步快速清理重复文件,免费释放硬盘空间!

dupeguru终极指南&#xff1a;3步快速清理重复文件&#xff0c;免费释放硬盘空间&#xff01; 【免费下载链接】dupeguru Find duplicate files 项目地址: https://gitcode.com/gh_mirrors/du/dupeguru 还在为电脑里堆积如山的重复文件发愁吗&#xff1f;存储空间告急&a…

作者头像 李华
网站建设 2026/4/12 18:01:02

Jellyfin媒体播放器:打造专属桌面影音中心

Jellyfin媒体播放器&#xff1a;打造专属桌面影音中心 【免费下载链接】jellyfin-media-player Jellyfin Desktop Client based on Plex Media Player 项目地址: https://gitcode.com/GitHub_Trending/je/jellyfin-media-player Jellyfin媒体播放器是开源媒体平台Jellyf…

作者头像 李华