Python自动化测试:利用PyVISA实现多品牌仪器统一控制

## 1. 为什么你需要PyVISA:告别手动拧旋钮的苦日子 如果你在实验室或者研发部门工作,每天都要和各种测试仪器打交道——比如Keysight的示波器、Tektronix的信号源、Rohde & Schwarz的频谱仪——那你一定对下面这个场景不陌生:为了测一组数据,你得先在A品牌的仪器上按几个菜单,记下读数;然后拔掉线,接到B品牌的仪器上,再按一套完全不同的菜单,再记读数。整个过程不仅繁琐、容易出错,而且一旦测试项多起来,加班到深夜就成了家常便饭。更头疼的是,不同品牌的仪器,它们的控制命令、软件接口甚至连接方式都可能不一样,想写个自动化脚本把它们串起来?光是研究各家的SDK和协议就够喝一壶了。 这就是PyVISA要解决的问题。简单来说,**PyVISA就是仪器控制领域的“普通话”**。想象一下,你手下有来自不同国家(不同品牌)的工程师(仪器),他们各自说着家乡话(厂商私有协议)。你要指挥他们协同工作,要么自己学会所有语言,要么强制他们都说同一种语言。PyVISA做的就是后一件事:它定义了一套统一的、基于Python的“语言”(API),让你可以用同样的几句“口令”(代码),去命令Keysight、Tektronix、R&S等几乎所有主流品牌的仪器。你不再需要关心这台示波器用的是SCPI命令的哪个变种,那条线是走GPIB、USB还是以太网,PyVISA的“翻译官”(资源管理器)会帮你搞定一切。 我刚开始做自动化测试的时候,也走过弯路,试图为每一类仪器写一套专用的控制脚本。结果就是脚本库越来越臃肿,维护起来简直是噩梦。后来用上PyVISA,我才真正体会到什么叫“一次编写,到处控制”。它的核心价值就在于**标准化**和**抽象化**。你写的控制逻辑(比如“设置频率->设置功率->读取结果”)是通用的,底层通讯的脏活累活都交给PyVISA和它背后的VISA库。这对于需要频繁更换仪器、或者搭建多品牌混合测试系统的场景来说,效率提升是颠覆性的。 ## 2. 搭建你的统一控制台:PyVISA环境配置全攻略 万事开头难,但PyVISA的环境搭建其实比你想象的要简单。很多人一听到要装驱动、配库就头大,其实跟着步骤走,十分钟就能搞定。这里我把自己踩过坑的实践经验总结出来,保你一次成功。 ### 2.1 核心三件套:Python、PyVISA与VISA库 首先,你得有一个Python环境。我强烈建议使用Anaconda来管理,它能很好地处理包依赖。安装好Python后,打开你的终端(Windows是CMD或PowerShell,Mac/Linux是Terminal),安装PyVISA核心包: ```bash pip install pyvisa ``` 这一行命令就装好了PyVISA这个“总指挥”。但光有指挥不行,还得有能听懂命令并传达给仪器的“通讯员”,这就是**VISA库**。PyVISA本身并不直接和硬件通讯,它需要一个后端(backend)。最常用、最稳定的后端就是各个仪器厂商提供的VISA库,比如NI-VISA、Keysight IO Libraries Suite、R&S VISA等。它们才是真正负责GPIB、USB、LAN等底层通信的“司机”。 > 注意:很多新手会混淆`pyvisa`和`pyvisa-py`。`pyvisa`是我们安装的包,它是调用VISA库的接口。而`pyvisa-py`是另一个可选的后端,它是一个纯Python实现的VISA库,不需要安装厂商驱动。对于绝大多数有稳定厂商驱动的场景,**我推荐使用厂商VISA库(如NI-VISA)作为后端**,兼容性和性能都更好。`pyvisa-py`更适合快速原型验证或者在不方便安装大型驱动的环境中使用。 那么,该选哪个厂商的VISA库呢?如果你的实验室仪器品牌混杂,我首推**NI-VISA**。不是因为NI的仪器多,而是因为NI-VISA的兼容性做得最好,它就像一个“万能适配器”,能很好地识别和支持其他品牌的仪器。你可以从National Instruments官网下载安装。安装过程基本就是一路“Next”,但记得勾选安装“NI-VISA Runtime”和“NI-VISA Driver”。 ### 2.2 验证安装:让你的Python“看见”仪器 安装完NI-VISA后,别急着写代码。我们先用一个图形化工具来确保一切就绪。NI会自带一个叫“Measurement & Automation Explorer (NI MAX)”的软件。打开它,你应该能在“我的系统”->“设备和接口”下,看到所有已连接的仪器(无论是NI的还是其他品牌的),比如GPIB、USB、LAN设备。如果能在这里看到你的仪器,并且能“打开VISA测试面板”成功通信,那说明底层驱动没问题。 接下来,回到Python,让我们写三行代码来验证PyVISA环境: ```python import pyvisa rm = pyvisa.ResourceManager() print(rm.list_resources()) ``` 运行这段代码。`pyvisa.ResourceManager()`这行会创建一个资源管理器,它是PyVISA所有操作的起点。默认情况下,它会自动寻找你系统上已安装的VISA库(比如NI-VISA)。`list_resources()`方法会扫描所有总线(GPIB, USB, LAN等),并返回一个列表,里面是所有识别到的仪器地址。 如果你看到了类似`('GPIB0::14::INSTR', 'USB0::0x1234::0x5678::INSTR', 'TCPIP0::192.168.1.100::inst0::INSTR')`的输出,那么恭喜你,你的PyVISA统一控制台已经成功搭建!每一个字符串就是一个仪器的“门牌号”(资源描述符)。如果返回一个空列表`()`,别慌,这通常意味着:1. 仪器没开机或没连接好;2. NI MAX里也没找到,需要检查驱动和连接线;3. 你的PyVISA可能错误地使用了`pyvisa-py`后端,而它可能不支持你的连接方式。 ### 2.3 关于后端选择的深入探讨 刚才提到后端选择,这里再展开一下。创建资源管理器时,你可以显式指定用哪个后端: ```python # 使用默认的IVI后端(即NI-VISA等厂商库) rm_ivi = pyvisa.ResourceManager() # 或者明确指定IVI库文件路径(高级用法,用于解决多个VISA库冲突) # rm_ivi = pyvisa.ResourceManager('C:\\Windows\\System32\\visa32.dll') # 使用纯Python的pyvisa-py后端 rm_py = pyvisa.ResourceManager('@py') ``` 怎么知道当前用的是哪个后端呢?打印一下资源管理器对象就知道了:`print(rm)`。在99%的正式测试环境中,我都使用默认的IVI后端(即NI-VISA)。`pyvisa-py`后端虽然免驱动,但在处理某些复杂命令、二进制数据块传输或特定型号仪器时,可能会遇到兼容性问题。它更适合教育、演示或对稳定性要求不高的快速脚本开发。 ## 3. 跨品牌仪器控制实战:从“Hello World”到批量测试 环境配好了,现在我们来真刀真枪地操作仪器。不管面前是安捷伦、泰克还是罗德,我们的代码写法都是一样的。这种一致性正是PyVISA的魅力所在。 ### 3.1 与仪器对话的基础语法:问与答 控制仪器的核心就是两种操作:**写**(发送命令)和**读**(查询结果)。在PyVISA里,这对应两个最基本的方法:`write()`和`query()`。 假设我们有一台任意品牌的示波器,它的VISA地址是`TCPIP0::192.168.1.101::inst0::INSTR`(这是一个常见的LAN连接地址)。第一步,打开连接: ```python import pyvisa rm = pyvisa.ResourceManager() # 打开仪器会话 scope = rm.open_resource('TCPIP0::192.168.1.101::inst0::INSTR') ``` `open_resource`方法返回一个`Resource`对象(这里叫`scope`),我们后续所有操作都通过它进行。接下来,几乎每个仪器都支持一个标准命令:`*IDN?`(身份识别查询)。这是我们的“Hello World”: ```python idn_response = scope.query('*IDN?') print(f"仪器身份: {idn_response}") # 输出可能类似:'KEYSIGHT TECHNOLOGIES,DSOX1102G,MY12345678,07.50.2023112200\n' ``` 看,我们用`query()`方法发送了`*IDN?`命令,并一次性收到了仪器的回复。`query()`等于`write()`命令后紧跟一个`read()`,非常适合这种“一问一答”的模式。如果只是发送设置命令而不需要返回值,比如重置仪器,就用`write()`: ```python scope.write('*RST') # 发送复位命令 scope.write(':CHANNEL1:SCALE 0.5') # 设置通道1垂直档位为0.5V/div ``` 这里有个**我踩过的坑**:不同品牌仪器对SCPI命令的格式要求可能略有不同。有的要求命令全大写,有的不区分;有的命令前缀是`:`,有的可能是`:`。虽然PyVISA帮你解决了底层通信,但命令字符串本身需要你按照仪器手册来写。一个好习惯是,在编写正式脚本前,先用仪器自带的软件或NI MAX的VISA测试面板手动发送几条命令,确认命令格式正确。 ### 3.2 构建健壮的通信:超时与错误处理 实际自动化测试中,仪器可能忙、可能死机、网络可能延迟。如果你的脚本傻傻地等下去,整个测试流程就卡住了。因此,**设置超时(timeout)是必须的**。 ```python # 设置读写超时时间为5000毫秒(5秒) scope.timeout = 5000 idn = scope.query('*IDN?') ``` 如果5秒内没收到回复,PyVISA会抛出一个`VisaIOError`异常。我们需要用`try...except`来捕获并处理它,让脚本更健壮: ```python import pyvisa from pyvisa import VisaIOError rm = pyvisa.ResourceManager() try: scope = rm.open_resource('TCPIP0::192.168.1.101::inst0::INSTR') scope.timeout = 3000 # 3秒超时 idn = scope.query('*IDN?') print(f"连接成功: {idn.strip()}") except VisaIOError as e: print(f"仪器通信超时或失败: {e}") # 这里可以加入重试逻辑或记录日志 except Exception as e: print(f"发生未知错误: {e}") finally: # 确保无论如何都尝试关闭连接 if 'scope' in locals(): scope.close() ``` 这段代码就是一个简单的通信模板。在实际项目中,我通常会把这个连接和异常处理逻辑封装成一个单独的类或函数,比如`connect_instrument(visa_address)`,这样代码更清晰,也便于复用。 ### 3.3 多仪器协同作战:一个简单的自动化测试案例 现在,我们来模拟一个真实场景:用一台Tektronix信号源产生一个1kHz的正弦波,然后用一台Keysight示波器去测量这个波形的频率和幅度。两台仪器通过LAN连接。 ```python import pyvisa import time rm = pyvisa.ResourceManager() # 1. 连接两台仪器 # 假设信号源地址是 TCPIP0::192.168.1.102::inst0::INSTR sig_gen = rm.open_resource('TCPIP0::192.168.1.102::inst0::INSTR') # 假设示波器地址是 TCPIP0::192.168.1.101::inst0::INSTR oscilloscope = rm.open_resource('TCPIP0::192.168.1.101::inst0::INSTR') # 为两者设置合理的超时 sig_gen.timeout = 5000 oscilloscope.timeout = 8000 # 示波器自动测量可能耗时稍长 try: # 2. 配置信号源 sig_gen.write('*RST') # 复位 sig_gen.write('SOURce1:FREQuency 1000') # 设置频率1kHz sig_gen.write('SOURce1:VOLTage:AMPLitude 1.0') # 设置幅度1Vpp sig_gen.write('SOURce1:FUNCtion SINusoid') # 设置波形为正弦波 sig_gen.write('OUTPut1 ON') # 打开输出 print("信号源配置完成,输出已开启。") # 等待信号稳定 time.sleep(2) # 3. 配置并操作示波器 oscilloscope.write('*RST') oscilloscope.write(':AUToscale') # 自动设置 time.sleep(3) # 等待自动设置完成 # 进行自动测量:频率和峰峰值 oscilloscope.write(':MEASure:SOURce CHANnel1') oscilloscope.write(':MEASure:FREQuency') # 设置测量频率 oscilloscope.write(':MEASure:VPP') # 设置测量峰峰值 # 查询测量结果 freq = oscilloscope.query(':MEASure:FREQuency?') vpp = oscilloscope.query(':MEASure:VPP?') print(f"测量结果 - 频率: {float(freq):.2f} Hz, 峰峰值: {float(vpp):.3f} V") except pyvisa.VisaIOError as e: print(f"仪器通信错误: {e}") except Exception as e: print(f"其他错误: {e}") finally: # 4. 清理现场 sig_gen.write('OUTPut1 OFF') sig_gen.close() oscilloscope.close() print("仪器已关闭,连接已释放。") ``` 这个脚本虽然简单,但涵盖了多仪器控制的精髓:**依次连接、分别配置、协同触发、集中获取数据**。你会发现,控制Tektronix信号源和Keysight示波器的代码结构完全一致,只是具体的SCPI命令字符串不同。这就是PyVISA带来的标准化好处。你可以很容易地把这个脚本扩展成循环,让信号源扫描一系列频率点,同时示波器记录每个点的幅度,从而实现一个自动化的频响测试。 ## 4. 进阶技巧与性能优化:让你的脚本更专业 掌握了基础操作,我们来看看如何让PyVISA脚本跑得更快、更稳、更易维护。这些都是我在实际项目中积累的经验。 ### 4.1 高效数据读写:别让传输拖了后腿 当需要从仪器读取大量数据时(比如示波器的一整条波形曲线),低效的读写会成为性能瓶颈。一个常见的场景是读取示波器的波形数据,这些数据通常是二进制格式,传输效率远高于文本格式。 ```python # 假设示波器已连接为 `scope` # 1. 首先,告诉示波器我们想要二进制数据 scope.write(':WAVeform:FORMat WORD') # 设置数据格式为16位有符号整数(常用) scope.write(':WAVeform:SOURce CHANnel1') # 设置波形源为通道1 scope.write(':WAVeform:POINts:MODE RAW') # 设置取点模式为原始点 # 2. 然后,查询波形数据。注意,对于二进制数据,我们通常用 `query_binary_values` 方法 scope.write(':WAVeform:DATA?') # 发送查询数据的命令 # 读取二进制数据。‘h’表示读取的是16位有符号整数(short),‘d’表示双精度浮点数 waveform_data = scope.query_binary_values('h', datatype='h', container=list) print(f"读取到 {len(waveform_data)} 个数据点。") # 此时 waveform_data 是一个Python列表,包含了电压值(可能需要根据Y轴增量、偏移量进行换算) ``` 使用`query_binary_values`比先`query`再解析字符串快得多,尤其是数据量大的时候。关键是要搞清楚仪器返回的二进制格式(是`‘h’`、`‘f’`还是`‘d’`),这需要查阅仪器的编程手册。 另一个提升效率的技巧是**减少通信回合**。仪器通信的延迟(尤其是GPIB和网络)可能比命令执行时间还长。尽量把多个设置命令合并成一条复合命令发送,或者使用仪器的“宏”或“脚本”功能。 ```python # 低效做法:多次 write # scope.write(':CHANnel1:SCALE 0.1') # scope.write(':CHANnel1:OFFSet 0.05') # scope.write(':TIMebase:SCALE 0.001') # 高效做法:用分号分隔,一次发送(如果仪器支持) scope.write(':CHANnel1:SCALE 0.1;:CHANnel1:OFFSet 0.05;:TIMebase:SCALE 0.001') ``` ### 4.2 资源管理与脚本结构:写出可维护的代码 当你的测试系统有十几台仪器,脚本有几千行时,良好的代码结构就至关重要了。我的经验是,**将仪器封装成类**。 ```python class Oscilloscope: def __init__(self, visa_address): self.rm = pyvisa.ResourceManager() self.instr = self.rm.open_resource(visa_address) self.instr.timeout = 10000 self.idn = self.instr.query('*IDN?').strip() print(f"已连接: {self.idn}") def set_channel(self, ch=1, scale=1.0, offset=0.0): """设置通道参数""" self.instr.write(f':CHANnel{ch}:SCALE {scale}') self.instr.write(f':CHANnel{ch}:OFFSet {offset}') def auto_scale(self): """执行自动设置""" self.instr.write(':AUToscale') time.sleep(3) # 等待自动设置完成 def measure_vpp(self, ch=1): """测量指定通道的峰峰值""" self.instr.write(f':MEASure:SOURce CHANnel{ch}') self.instr.write(':MEASure:VPP') time.sleep(0.1) # 等待测量完成 result = self.instr.query(':MEASure:VPP?') return float(result) def close(self): """关闭连接""" self.instr.close() print(f"{self.idn} 连接已关闭。") # 使用封装好的类 my_scope = Oscilloscope('TCPIP0::192.168.1.101::inst0::INSTR') my_scope.auto_scale() vpp = my_scope.measure_vpp(ch=1) print(f"通道1峰峰值: {vpp} V") my_scope.close() ``` 这样封装之后,你的主测试逻辑会变得非常清晰,就像在操作一个个有明确功能的对象。仪器地址、超时时间、品牌特定的命令细节都被隐藏在类内部。如果将来换了另一台不同型号的示波器,你只需要修改这个类的内部实现,或者创建一个新的子类,主测试流程的代码可能完全不用动。 ### 4.3 调试与日志:快速定位问题 自动化测试脚本在无人值守运行时,详细的日志是排查问题的唯一线索。一定要养成记录日志的习惯。 ```python import logging import pyvisa # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('instrument_test.log'), logging.StreamHandler()]) logger = logging.getLogger(__name__) def safe_query(instr, command): """一个安全的查询函数,附带日志记录""" logger.info(f"发送查询: {command}") try: response = instr.query(command).strip() logger.info(f"收到响应: {response}") return response except pyvisa.VisaIOError as e: logger.error(f"查询 {command} 时发生VISA IO错误: {e}") raise except Exception as e: logger.error(f"查询 {command} 时发生未知错误: {e}") raise # 在代码中使用 rm = pyvisa.ResourceManager() scope = rm.open_resource('TCPIP0::192.168.1.101::inst0::INSTR') idn = safe_query(scope, '*IDN?') ``` 同时,PyVISA本身也提供了详细的调试功能,可以在创建资源管理器时开启: ```python rm = pyvisa.ResourceManager() # 设置日志级别为DEBUG,可以看到所有底层VISA库的调用细节 import logging pyvisa.logger.setLevel(logging.DEBUG) ``` 当遇到奇怪的通信问题时,打开DEBUG日志,你能看到PyVISA发送和接收的每一个字节,这对于诊断命令格式错误、终止符问题等非常有帮助。 ## 5. 常见“坑”与避坑指南 用了这么多年PyVISA,我总结了一些最常见的错误和解决办法,希望能帮你节省大量排查时间。 **坑1:`VisaIOError: VI_ERROR_RSRC_NFOUND` (资源未找到)** * **现象**:运行`rm.list_resources()`返回空列表,或者`open_resource`失败。 * **原因**:这是最典型的问题。1. 仪器电源没开或线没接好;2. 没有安装正确的VISA驱动(NI-VISA等);3. 仪器被其他软件独占占用(如厂商的桌面软件);4. 防火墙或杀毒软件阻止了通信(常见于LAN连接)。 * **解决**:首先打开NI MAX,看仪器是否出现在列表中并能正常通信。如果NI MAX里都看不到,问题肯定在驱动或物理连接。如果NI MAX里能看到但PyVISA看不到,尝试重启电脑(有时能解决驱动加载问题),或者检查是否有其他VISA软件冲突。 **坑2:`VisaIOError: VI_ERROR_TMO` (超时错误)** * **现象**:执行`query()`或`read()`时长时间卡住,然后报超时。 * **原因**:1. 发送的命令仪器不认识,它没有回复;2. 仪器正在执行一个耗时很长的操作(如自校准);3. 读写超时时间设置太短。 * **解决**:首先检查命令拼写是否正确,最好先用仪器前面板或厂商软件手动执行一次。其次,合理增加`timeout`值。对于已知的耗时操作,可以在发送命令后主动`time.sleep()`几秒。另外,确保每条查询命令`*IDN?`都带问号,而设置命令如`*RST`没有问号。 **坑3:数据读取不完整或乱码** * **现象**:读取的数据被截断,或者包含奇怪的字符。 * **原因**:1. 终止符(terminator)不匹配。仪器返回数据时会在末尾加一个终止符(如`\n`换行符),如果PyVISA期待的终止符和仪器发送的不一样,就会提前结束读取或一直等待。2. 编码问题(极少数情况)。 * **解决**:显式设置仪器的终止符。通常在打开资源后立即配置: ```python instrument = rm.open_resource('GPIB0::22::INSTR') instrument.read_termination = '\n' # 设置读取终止符为换行 instrument.write_termination = '\n' # 设置写入终止符为换行 ``` 你可以查阅仪器手册,看它使用什么终止符。常见的还有`\r\n`。也可以在NI MAX的VISA测试面板里观察原始通信数据。 **坑4:多线程或多进程同时访问同一仪器** * **现象**:脚本偶尔崩溃,报资源冲突错误。 * **原因**:VISA库和仪器会话通常不是线程安全的。多个线程同时调用同一个`Resource`对象的方法会导致不可预知的行为。 * **解决**:**不要在线程间共享`Resource`对象**。如果需要在多线程环境中控制仪器,每个线程应该创建自己的资源管理器(`ResourceManager`)和仪器会话。更好的架构是使用一个专用的“仪器控制线程”或进程,通过队列(queue)接收其他线程的指令,串行化所有仪器操作。 **坑5:SCPI命令的兼容性** * **现象**:代码在A品牌仪器上运行正常,换到B品牌同类型仪器就报错。 * **原因**:虽然PyVISA解决了通信层的问题,但SCPI命令层并非100%统一。不同品牌、甚至同品牌不同系列的仪器,对某些命令的支持程度和语法可能有细微差别。 * **解决**:编写通用脚本时,尽量使用最基础、最通用的SCPI命令(如`*IDN?`, `*RST`, `*OPC?`)。对于特定功能,可以将品牌相关的命令封装在独立的函数或配置文件中。在脚本开头,可以通过`*IDN?`返回的字符串来判断仪器型号,从而动态选择要发送的命令集。这需要前期做一些调研和测试,但一旦做好,脚本的适应性会大大增强。 说到底,PyVISA是一个强大的工具,但它不是魔法。它把我们从复杂的底层通信协议中解放出来,让我们能专注于测试逻辑本身。真正的挑战在于理解你的测试需求,设计稳健的流程,并处理好各种边界情况。当你看着自己编写的脚本,一键启动后,多台不同品牌的仪器有条不紊地自动完成一系列复杂测试,并生成整齐的报告时,那种成就感,绝对值得你花时间去掌握它。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

在Python编程环境下控制R&S仪器

在Python编程环境下控制R&S仪器

用python控制R&S仪器,实现仪器自动化操作 用python控制R&S仪器,实现仪器自动化操作

仪器控制程序SCPI程控交换语言python实现

仪器控制程序SCPI程控交换语言python实现

仪器控制程控语言python实现,采用SCPI标准语言格式,获取数字万用表,示波器等电压,电流,电阻,频率数据

Tektronix示波器控制Python

Tektronix示波器控制Python

电脑远程控制Tektronix示波器,实现截图,并保存测试数据功能,根据所提供线路名自动修改TestScreen名称。

基于Python的虚拟仪器技术研究及实现.zip

基于Python的虚拟仪器技术研究及实现.zip

基于Python的虚拟仪器技术研究及实现

Python控制安捷伦信号源频谱仪自动扫频测试程序

Python控制安捷伦信号源频谱仪自动扫频测试程序

可修改仪器ip地址 扫频中心频率 扫频带宽 扫频步进 读取峰值 拟合谱线 目前已实现的有安捷伦信号源N5173B 安捷伦频谱仪E4440A 有问题可私信 能力范围内也可帮忙修改

基于Python的新型仪表自动化测试系统.pdf

基于Python的新型仪表自动化测试系统.pdf

基于Python的新型仪表自动化测试系统.pdf

程控电源控制python脚本。

程控电源控制python脚本。

可以用脱离python开发环境通过界面的方式设置电压值。

[电子书]python仪器监控数据采集

[电子书]python仪器监控数据采集

真实世界的Python仪器监控 数据采集与控制系统自动化

Python语言下的自动化测试系统设计.pdf

Python语言下的自动化测试系统设计.pdf

Python语言下的自动化测试系统设计.pdf

keithley_model:通过python控制keithley机

keithley_model:通过python控制keithley机

keithley_model 如果您对代码有任何疑问,请通过python控制keithley机,欢迎与我联系。

Agilent-VISA示例代码
Python 控制agilent 34410A multimeter示例代码

Agilent-VISA示例代码 Python 控制agilent 34410A multimeter示例代码

Agilent-VISA示例代码 Python 控制agilent 34410A multimeter示例代码

电子测量中的基于Python的虚拟仪器技术研究及实现

电子测量中的基于Python的虚拟仪器技术研究及实现

随着计算机技术、测量仪器技术以及软件技术的高速发展,微机以及DSP提供了强大的计算能力使得在一定的实时性要求下,软件可以代替许多原来由硬件完成的功能,这标志着“软件即仪器(The software is the instrument)”时代的到来。它的出现彻底改变了传统的仪器观,开辟了测量技术的新纪元。   虚拟仪器的基本思想是利用计算机来管理仪器、组织仪器系统,进而逐步取代仪器完成各种功能,最终取代传统电子仪器。虚拟仪器实质上是软硬件结合、虚实结合的产物,利用高性能的模块化硬件,结合高效灵活的软件来完成各种测试、测量和自动化的应用。在虚拟仪器系统中,硬件通常仅仅是为了解决信号输入输出,软件

Real World Instrumentation with Python

Real World Instrumentation with Python

Real World Instrumentation with Python.pdf

Python VISA -- control GPIB, USB, Serial-开源

Python VISA -- control GPIB, USB, Serial-开源

一个Python软件包,带有与“虚拟仪器软件体系结构” VISA库的绑定,以便通过GPIB,RS232或USB控制测量设备和测试设备。 注意:PyVisa的开发已移至github https://github.com/hgrecco/pyvisa。此页面仅具有历史意义!

Python控制程控电源控制pyd文件

Python控制程控电源控制pyd文件

Python控制程控电源控制pyd文件

Real World Instrumentation with Python-带书签目录超清文字版

Real World Instrumentation with Python-带书签目录超清文字版

Real World Instrumentation with Python-带书签目录超清文字版 这个是带完整目录书签的文字版本,文本内容可以复制的哦

Python语言在自动化测试系统设计中的运用分析.pdf

Python语言在自动化测试系统设计中的运用分析.pdf

Python语言在自动化测试系统设计中的运用分析.pdf

罗德与施瓦茨 SMW FSW 是德科技电源 Python驱动类 - 射频自动化测试

罗德与施瓦茨 SMW FSW 是德科技电源 Python驱动类 - 射频自动化测试

【资源介绍】 本资源为射频自动化测试中,常用高端仪器的Python驱动类封装,旨在解决手动操作效率低下、SCPI命令复杂难记的问题。提供了罗德与施瓦茨信号源、频谱仪及是德科技电源的即用型Python控制类,助您快速搭建自动化测试平台。 【核心文件】 - `Instrument_control.py` : 包含三个核心类: 1. `RSSMW_SG` 类:控制罗德SMW200A等信号源(设置频率、功率、调制波形等) 2. `RSFSW_SA` 类:控制罗德FSW等频谱仪(设置中心频率、读取ACLR、功率等) 3. `KeysightPowerSupply` 类:控制是德科技电源(设置电压、电流、读取值等) 【资源特点】 - **开箱即用**:代码经过整理,注释清晰,实例化后可直接调用。 - **面向对象**:将复杂的SCPI命令封装成简单易懂的方法(如`set_frequency(2.1)`)。 - **稳定可靠**:包含完善的仪器连接状态检查和异常处理机制。 - **模块化设计**:与测试逻辑分离,方便集成到您自己的项目中。 【适用人群】 - 射频工程师、测试工程师 - 需要控制罗德/是德仪器进行自动化测试的研发人员 - 学习Python仪器编程的学生和爱好者 【使用说明】 1. 确保已安装PyVISA库 (`pip install pyvisa`) 2. 根据实际仪器IP地址修改资源中的类 3. 在主程序中导入类并调用相关方法即可 【注意事项】 - 本资源为免费分享,仅供学习交流使用。 - 请确保仪器IP地址、型号和功能与代码兼容。 - 后续将分享基于此驱动构建的完整自动化测试项目(如ACLR、EVM测试),欢迎关注!

【创新未发表】典型日功率平衡与绿电直连指标核算研究(Matlab代码、Python、数据、word论文)

【创新未发表】典型日功率平衡与绿电直连指标核算研究(Matlab代码、Python、数据、word论文)

内容概要:本研究聚焦于典型日功率平衡与绿电直连的指标核算,旨在通过Matlab与Python编程工具,结合实际数据与算法模型,对绿色电力直接连接系统在典型日运行条件下的功率供需平衡状况进行量化评估与分析,并形成完整的理论体系与技术实现路径,配套提供可运行的代码、详实的数据集及规范的学术论文撰写范本;适合人群:适用于从事新能源电力系统、综合能源管理、碳中和与绿色电力交易等相关领域研究的科研人员、高校研究生及工程技术人员,尤其适合具备Matlab或Python编程基础、正在开展相关课题或项目研发的专业人士;使用场景及目标:①用于科研论文写作与课题申报,作为创新未发表成果的技术支撑;②用于教学案例演示,帮助学生理解绿电直连机制与功率平衡建模过程;③服务于实际工程项目中绿电接入方案的可行性分析与指标验证;其他说明:该资源属于原创未发表研究成果,涵盖从数据预处理、模型构建、算法求解到结果可视化与论文撰写的全流程,强调技术实现与学术表达的统一,适合作为科研工作的完整解决方案。

pyvisa手册

pyvisa手册

一个python的库, 用于使用python语言对可编程仪器的开发

最新推荐最新推荐

recommend-type

Python解惑之True和False详解

主要给大家介绍了关于Python中常用的数据类型bool(布尔)类型的两个值:True和False的相关资料,通过示例代码给大家进行了解惑,让对这两个值有所疑惑的朋友们能有起到一定的帮助,需要的朋友下面来一起看看吧。
recommend-type

Python中的True,False条件判断实例分析

本文实例讲述了Python中的True,False条件判断用法。分享给大家供大家参考。具体分析如下: 对于有编程经验的程序员们都知道条件语句的写法: 以C++为例: 复制代码 代码如下:if (condition)  {      doSomething();  } 对于Python中的条件判断语句的写法则是下面的样子: 复制代码 代码如下:if (condition):      doSomething() 那么对于条件语句中的condition什么时候为真什么时候为假呢? 在C++/Java等高级语言中,如果条件的值为0或者引用的对象为空指针,那么该条件即为False。 在Pyth
recommend-type

浅谈Python里面None True False之间的区别

None虽然跟True False一样都是布尔值。 虽然None不表示任何数据,但却具有很重要的作用。 它和False之间的区别还是很大的! 例子: >>> t = None >>> if t: ... print("something") ... else: ... print("nothing") ... nothing 区分None和False.使用is来操作! >>> if t is None: ... print("this is None!") ... else: ... print("this is ELSE!") ... this is None! >>> 虽然是个小小
recommend-type

Python返回真假值(True or False)小技巧

主要介绍了Python返回真假值(True or False)小技巧,本文探讨的是最简洁的条件判断语句写法,本文给出了两种简洁写法,需要的朋友可以参考下
recommend-type

python 输入年份 如果是闰年输出True 否则输出False 示例

python 输入年份 如果是闰年输出True 否则输出False 示例
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti