普源精电RIGOL DS2202A示波器保存波形到CSV文件过慢解决方法:保存为WFM格式、通过LAN接口使用SCPI+PyVISA控制

news/2025/10/16 19:25:42/文章来源:https://www.cnblogs.com/gongye/p/19141967

提示:本文包含AI编写的代码。

前言

最近我正在研究学校的这个包浆示波器,发现它在保存内存所有采样点为CSV文件时的速度非常堪忧,于是准备研究一下解决办法。
通过自行搜索和询问群友,我找到了以下两种方法。

方法一:保存为WFM格式

在存储菜单中,选择“保存波形”,示波器会在U盘中新建一个WFM格式的文件。不同于CSV将采样数据格式化为字符串后再保存,WFM文件似乎是直接存储二进制,保存只需不到2分钟。对于14Mpts的波形,我存储的CSV文件的文件大小为303MiB,而WFM波形仅有不到14MiB。但这个文件无法直接打开,需要通过一个Python库进行读取。

首先安装RigolWFM:https://pypi.org/project/RigolWFM/ 。这个库似乎是经过对WFM文件逆向后编写的,支持日狗示波器的大部分机型。
按照RigolWFM文档,编写如下代码,成功读取波形。

import matplotlib.pyplot as plt
import RigolWFM.wfm as rigolfilename = "example.wfm"
scope = "DS2000"scope_data = rigol.Wfm.from_file(filename, scope)ch = scope_data.channels[0]
plt.plot(ch.times, ch.volts)
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.grid()
plt.show()

方法二:通过LAN接口,使用SCPI+PyVISA控制

似乎大部分仪器都支持SCPI。RIGOL官方提供的编程手册包含了非常多的指令,看起来用LabView做自动化测试的就是通过这个SCPI接口完成的。

将示波器通过网线连接到路由器,并在计算机上安装PyVISA、NI VISA。打开NI硬件配置工具,点击加号,手动输入示波器的IP地址。网上的教程似乎都是要用“NI MAX”配置,但我安装完NI MAX后连在哪里启动都找不到,可能是版本不同吧。

根据PyVISA手册中的描述,打开Python命令行,输入以下代码。

import pyvisa
rm = pyvisa.ResourceManager()
print(rm.list_resources())

输出如下。

('TCPIP0::192.168.31.92::inst0::INSTR', 'ASRL3::INSTR', 'ASRL4::INSTR')

可以看到成功找到了示波器。

我参考了一个1000系列的Python库[2] ,修改了一些SCPI指令,完成了截图和读取波形的程序。

截图程序如下。

import pyvisa
import matplotlib.pyplot as plt
import time
from PIL import Image
import iovisa_address = "TCPIP0::192.168.31.92::inst0::INSTR"rm = pyvisa.ResourceManager()
scope = rm.open_resource(visa_address)
print(scope.query("*IDN?"))# 截图并显示,计时
time_start = time.time()
while True:scope.write(":DISPlay:DATA?")raw_image = scope.read_raw()[11:]filename = "scope_screenshot.bmp"with open(filename, "wb") as f:f.write(raw_image)# 实时刷新窗口里的图片try:img = Image.open(io.BytesIO(raw_image))if "fig" not in locals():fig, ax = plt.subplots()im = ax.imshow(img)plt.axis("off")plt.ion()plt.figure(figsize=(10, 10))plt.show()else:im.set_data(img)fig.canvas.draw()fig.canvas.flush_events()except Exception as e:print(f"图片显示失败: {e}")print(f"截图并显示耗时: {time.time() - time_start:.2f} 秒")time_start = time.time()# time.sleep(1)

一次截图需要约2秒。

读取波形程序如下。

import pyvisa
import matplotlib.pyplot as plt
import numpy as np
import time
import tqdmvisa_address = "TCPIP0::192.168.31.92::inst0::INSTR"rm = pyvisa.ResourceManager()
print(rm.list_resources())
# rm.close()
scope = rm.open_resource(visa_address)
scope.timeout = 30000print(scope.query("*IDN?"))scope.write("STOP")
scope.write(":WAV:SOUR CHAN1")
scope.write(":WAV:MODE RAW")
scope.write(":WAV:FORM BYTE")pre = scope.query_ascii_values(":WAVeform:PREamble?")
# <format>,<type>,<points>,<count>,<xincrement>,<xorigin>,<xreference>,<yincrement>,<yorigin> ,<yreference>
pre_dict = {"format": int(pre[0]),"type": int(pre[1]),"points": int(pre[2]),"count": int(pre[3]),"xincrement": float(pre[4]),"xorigin": float(pre[5]),"xreference": float(pre[6]),"yincrement": float(pre[7]),"yorigin": float(pre[8]),"yreference": float(pre[9]),
}
max_num_pts = 250000
num_blocks = pre_dict["points"] // max_num_pts
last_block_pts = pre_dict["points"] % max_num_ptstime_start = time.time()full_data = np.array([])
for i in tqdm.tqdm(range(num_blocks + 1), ncols=60):if i < num_blocks:scope.write(":WAV:STAR %i" % (1 + i * max_num_pts))scope.write(":WAV:STOP %i" % (max_num_pts * (i + 1)))else:if last_block_pts:scope.write(":WAV:STAR %i" % (1 + num_blocks * max_num_pts))scope.write(":WAV:STOP %i" % (num_blocks * max_num_pts + last_block_pts))else:breakdata = scope.query_binary_values(":WAV:DATA?", datatype="B", container=np.array)full_data = np.concatenate((full_data, data))print(len(full_data))Y_voltage, X_time = (np.arange(len(full_data)) * pre_dict["xincrement"],(full_data - pre_dict["yreference"] - pre_dict["yorigin"]) * pre_dict["yincrement"],
)print(f"耗时: {X_time.time() - time_start:.2f} 秒")
plt.plot(Y_voltage, X_time)
plt.show()# 保存数据到CSV文件
np.savetxt("waveform_data.csv",np.column_stack((Y_voltage, X_time)),delimiter=",",header="Time (s), Voltage (V)",comments="",
)
print("数据已保存到 waveform_data.csv")

一次截图大致需要76秒,可算出传输速率大约为184kB/s,看起来读取波形速度慢不是USB或者以太网接口的问题。

参考文献

[1] https://pyvisa.readthedocs.io/en/latest/
[2] https://github.com/jeanyvesb9/Rigol1000z#
[3] https://blog.csdn.net/weixin_73011353/article/details/137994653

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

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

相关文章

动手学深度学习——引言

机器学习中的关键组件 1.数据 数据集由一个个样本组成。样本由一组特征或者协变量组成 2.模型 深度学习的模型由神经网络交织在一起构成。 3.目标函数 一个定义的函数,希望优化它到最小值。有时候被称为损失函数,但是…

CF1989E Distance to Different

首先想一想最终的 \(b\) 的形式应该是什么样子,我们断言:\(b\) 为左右两边各接了一个单调下降和单调上升的段,中间一定可以被划分为若干个单峰回文子段。发现子段内元素必定固定,所以考虑 DP 段的个数,此时除了旁…

详细介绍:学习:uniapp全栈微信小程序vue3后台(29)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

lianxi

import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from multiprocessing import freeze_support import sys def load_data(): tran…

AngularJS:构建更智能的Web应用框架

AngularJS是一个强大的JavaScript MVC框架,通过扩展HTML语法、双向数据绑定和依赖注入等特性,让开发者能够更高效地构建动态Web应用。虽然官方支持已于2022年结束,但其设计理念和功能仍值得学习借鉴。AngularJS Ang…

给档案装上“智慧大脑”:文档抽取技术的四大赋能场景

随着数字化转型的深入,档案管理正从传统的实体保管向数字化、智能化的知识服务转变。在这一变革中,文档抽取技术作为自然语言处理和人工智能的关键分支,正扮演着愈发重要的角色。本文将深入探讨文档抽取技术如何重塑…

P11816QOJ1250 Pionki 轮廓线DP

判定有解是一个比较经典的Hall定理。 也即,将 \(a\) 看作正数,将 \(b\) 看作负数,那么一个在 \((i,j,k)\) 的 \(1\),可以与一个在 \((a,b,c)(a\ge i,b\ge j,c\ge k)\) 的 \(-1\) 进行匹配。 根据 Hall 定理,有 \(…

Zookeeper 技术详细介绍 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Bug——PaddleX人脸识别报错:Process finished with exit code -1073741819 (0xC0000005) - 教程

Bug——PaddleX人脸识别报错:Process finished with exit code -1073741819 (0xC0000005) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

linux系统scatter/gather I/O技术

struct iovec 是一种用于分散/聚集 I/O 操作的数据结构,它允许在一次系统调用中从多个非连续内存缓冲区读取或写入多个非连续内存缓冲区。 该结构通常与 readv 和 writev 等函数一起使用。#include <sys/uio.h>…

PostgreSQL 为什么不选择 B+ 树索引? - Lafite

我们知道,MySQL 的索引设计使用了 B+Tree,而 PostgreSQL 使用了 B-Tree, 那 PostgreSQL 为什么不使用 B+Tree 做索引结构呢?今天就来聊一聊这个话题。 B+Tree 和 B-Tree B+TreeB+Tree 主键索引的叶子节点存储数据,…

Joeys shell

您熟悉bash的语法吗?"Youre afraid of bugs? Get a bug!" --Joey Tribbiani, "FRIENDS". 想找个mini shell来看看源码,浏览了些网页,有“这玩意也配叫shell?”之感。bash-1.14.7.tar.gz 1996…

Redis 集群从部署到可视化管理全流程(超详细实战指南)

一、为什么需要 Redis 集群? Redis 单机模式存在三大瓶颈: 容量瓶颈:单机内存有限,无法存储海量数据; 并发瓶颈:单线程处理能力有限,高并发下性能易打满; 高可用瓶颈:单机故障会导致服务中断,无自动容灾能力…

什么是BPM流程自动化?从“财务报销”入手,一文读懂企业效率引擎

在企业的日常运营中,我们总能听到“数字化转型”、“降本增效”这样的热词。但它们究竟意味着什么?对于终日忙于具体事务的部门负责人和一线员工而言,这些宏大的概念,有时远不及一张迟迟未能签批的报销单来得真切。…

软件工程学习日志2025.10.16

📚 今日学习主题 NoSQL数据库基础与MongoDB实际操作 💡 核心知识点总结NoSQL数据库特点• 灵活的可扩展性:轻松应对数据量增长 • 灵活的数据模型:不受固定表结构限制 • 与云计算紧密融合:适合分布式环境部署 …

P1072 [NOIP 2009 提高组] Hankson 的趣味题

P1072 [NOIP 2009 提高组] Hankson 的趣味题题目传送门 欢迎光顾我的博客 (下面称 \(V\) 为 \(a_0,a_1,b_0,b_1\) 的值域) 我们在小学二年级就学过,对于两个正整数 \(a,b\) ,可以分别将它们表示为 \(mx,my\) ,其中…

Apifox 9 月更新| AI 生成接口测试用例、在线文档调试能力全面升级、内置更多 HTTP 状态码、支持将目录转换为模块 - 实践

Apifox 9 月更新| AI 生成接口测试用例、在线文档调试能力全面升级、内置更多 HTTP 状态码、支持将目录转换为模块 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

Pasos和RAFT算法

Pasos和RAFT算法Paxos 提出时间1990年,RAFT提出时间2013年。RAFT 是Paxos的简化版,或者说是提高投票效率,但是降低了投票公平性的妥协方案。 RAFT 分布式raft(Replicated And Fault Tolerant)选举算法原理分成三个角…

25w41a快照测评:鹦鹉螺成精了?长矛教你戳穿末影人!

25w41a快照测评:鹦鹉螺成精了?长矛教你戳穿末影人! 🚨 快照速递:1.21.11 第一个测试版来啦! 家人们谁懂啊!Mojang 突然扔出 25w41a 快照,本以为是修 bug 的小更新,结果直接塞了一堆新玩具 —— 鹦鹉螺能穿装…

Day15-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\classlei

Object类 clone() 用于创建对象的副本,是实现对象复制的重要方式 @Override public clonetest clone() {// 注意返回类型是clonetest而非Objecttry {// 调用Object类的clone()方法,正常情况下clone()方法返回object类…