完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、项目描述
(1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发、保存截图、运行脚本等功能; (2)环境配置:windows10 PC、Tek示波器(兼容3k、5k系列); (3)使用vxi11完成示波器的通信等操作、使用PySimpleGUI开发工具界面; (4)对tekvisa的原始指令进行二次封装,提高编写脚本的效率; 2、原理介绍 (1)VISA、e*Scope与Socket 有三种方式可以建立电脑与示波器之间的连接,分别是visa、escope和socket。 visa是Virtual Instrument Software Architecture的缩写,是一套由NI主导的,定义了设备和计算机之间的通信方式的协议。目前主流的设备厂商一般都会有基于VISA所封装好的库,例如tek的有tekVisa等。这些封装库定义了设备和计算机之间的会话连接、资源访问、信息交互等方式,可以很方便的实现PC和OSC之间的交互。需要注意的是,visa的封装已经做到了接口无关,计算机可以使用多种接口(GPIB、USB、LAN、Serial等)完成和设备的交互。而剩下两种都是通过网线做交互的。 1、项目描述 (1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发、保存截图、运行脚本等功能; (2)环境配置:windows10 PC、Tek示波器(兼容3k、5k系列); (3)使用vxi11完成示波器的通信等操作、使用PySimpleGUI开发工具界面; (4)对tekvisa的原始指令进行二次封装,提高编写脚本的效率; 2、原理介绍 (1)VISA、e*Scope与Socket 有三种方式可以建立电脑与示波器之间的连接,分别是visa、escope和socket。 visa是Virtual Instrument Software Architecture的缩写,是一套由NI主导的,定义了设备和计算机之间的通信方式的协议。目前主流的设备厂商一般都会有基于VISA所封装好的库,例如tek的有tekVisa等。这些封装库定义了设备和计算机之间的会话连接、资源访问、信息交互等方式,可以很方便的实现PC和OSC之间的交互。需要注意的是,visa的封装已经做到了接口无关,计算机可以使用多种接口(GPIB、USB、LAN、Serial等)完成和设备的交互。而剩下两种都是通过网线做交互的。 escope是示波器内集成的一套程序,可以使主机在和设备接上网线,配置完成IP后,直接点开网页,输入示波器的IP地址即可获取示波器的实时界面。类似一种KVM技术。 socket是指对于一些示波器,支持使用Socket网络编程实现数据的交互。在该协议下,对示波器的操作完全按照Socket套接字的方式执行。 (2)tekVisa、pyvisa和vxi11 tekVisa是tek公司推出的一套基于VISA规范的API库,用户可以使用tekVisa来自行开发工具。除此之外,tek还推出了tekVisa的官方版的简单易用的图形化工具openChoice,工具可以完成和示波器的交互。界面如下图所示。这个工具虽然简单使用,但是对于很多操作来说都非常的”不智能“,例如对于示波器的某些操作需要一些较长的时间,此时希望程序能在执行该操作后等待几秒钟再执行下一条,但是对于这样的一个简单的动作,openChoice却无法完成,不得不利用卡bug的方法来完成”等待“的动作。也是基于此原因,令作者产生了自行开发一套更加简单易用的工具的想法。 除了上述的tekVisa以及基于tekVisa开发的官方工具OpenChoise外,还需要每台示波器的指令集才能完成对示波器的操控。事实上,计算机和示波器之间的通信原理实际上可以描述为,使用网线将PC和OSC互联,配置好IP后,使用基于Visa协议的工具建立计算机和示波器之间的通信的通道。而我们对示波器的操作,实际上是封装成了一条一条的指令,单独列在另一份随示波器提供给用户的文档里。不同的机器有不同的指令集。对于tek的设备来说,其指令的格式如下所示: 例如:DPO5104示波器中将CH1的标签名字命名为test的操作指令为,CH1:label:name “test” 将上述指令输入到command输入框中,点击write主机就通过OpenChoise调用TekVisa中的API将该指令发到设备端,设备端解析后会自行执行相应的动作。 tekVisa的API是基于C语言的,实际上python中也提供了visa的封装库,叫做pyvisa,使用pip install pyvisa即可完成安装。pyvisa是将visa库的接口做了符合python使用习惯的封装。该python库是开源的,经笔者测试部分功能还存在bug(例如LAN connection功能有问题,疑似和IO Buffer有关),况且VISA协议是一套很大的协议,包括很多接口形式,但实际上本次使用LAN口来通信,因此很多接口我们都是用不上的,因此有没有一个小一点的专门针对网络的封装库呢? 感谢伟大的Python开发者们,经寻找发现使用vxi11可以很好的符合我们的需求(pip install vxi11),vxi-11是一套网络协议,是专门用于仪器和主机间通信的一套协议。实际上我们可以看到tekVisa中的LAN接口的连接也是基于vxi11实现的。因此本次项目使用vxi11来做设备和主机之间的通信功能。 (3)PySimpleGUI 有了基本的骨架后,剩下的实际上就是添加一副易于操作和显示的皮囊。为加快开发效率,这里选择了PySimpleGUI来做界面的开发。PySimpleGUI是一套优秀的GUI框架。相比于tkinter来说,PySimpleGUI的设计更符合我们普通人的行为习惯,只需要按照我们想要的顺序将对象放在数组里,最终这些对象也都是按照我们拜访的顺序出现在窗口中。最终完成品的界面如下所示:其界面将一些常用的设置放在了面板上、提供了保存文件的接口、提供了运行脚本的入口和一个输出界面。 3、程序实现 (1)使用vxi11建立计算机和示波器之间的联系 核心代码如下:调用vxi11的Instrument方法,参数中的IP地址为device的IP,可以是静态IP也可以是动态分配的IP。 import vxi11 inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’) print(inst.ask(‘*IND?’)) 之后发送指令*IDN?验证是否连接成功,可以返回设备的设备名,即说明连接成功。 (2)向示波器发送指令,读取返回结果和查询指令。 其中ask的函数实际上等价于write+read。这三个指令用于计算机向示波器发送对应的指令,并读取示波器返回的数据。不同示波器的指令不同,需要在官网上找到自己型号的示波器,然后下载对应的文档。例如:《MSO3000-and-DPO3000-Programmer-Manual》类似的文档,里面包含所有可使用的指令。另外,部分指令使用时需要拓展模块,如果示波器上没有相应的配件的话,也无法执行。 inst.write(‘*IND?’) print(inst.read()) print(inst.ask(‘*IDN?’)) (3)从示波器里读出一张图片,并保存在本地路径下。 核心代码如下所示:需要注意的是,不同的示波器存图的方式是不一样的,对于没有安装操作系统的示波器,可以通过hardcopy的方式来将图片发送给计算机,对于有安装操作系统的,可以先使用hardcopy将截图存在本地,然后使用filesystem.read来将结果读出发送给主机。 #以下MDO3054示波器的保存图片的方式,使用的hardcopy import vxi11 inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’) inst.write(‘HARDCopy:PRINTer:ADD “labprn2”, “”, “192.168.1.177”’) inst.write(‘HARDCopy:ACTIVeprinter “labprn2”’) inst.write(‘Hardcopy start’) image = inst.read_raw() my_file = open(“D:/workspace/python/test2.png”, “wb”) my_file.write(image) my_file.close() inst.close() #以下是DPO5104B示波器的保存图片的方式,使用的filesystem.read() inst = vxi11.Instrument(‘TCPIP::192.168.1.201::INSTR’) inst.write(‘HARDCOPY:PORT FILE’) inst.write(‘HARDCOPY:FILENAME “C:/Windows/temp”’) inst.write(‘Hardcopy start’) time.sleep(0.5) inst.write(‘filesystem:readfile “C:/Windows/temp.png”’) image = inst.read_raw() temp = filePath+‘/’+fileName+“.png” my_file = open( temp , “wb”) my_file.write(image) inst.write(‘FILESystem:DELEte “C:/Windows/temp.png”’) inst.close() (4)关于图形界面的使用 项目里代码主要用来设计图形用户界面,关于PysimpleGUI的使用,本文不再赘述,基本上是笔者用过的最好用的GUI框架。下文中会给出源代码和最终的可执行程序的链接,供大家学习和使用。 (5)其他 除此之外,本项目使用pyinstaller来将脚本封装为一个exe的可执行文件,封装的时候发现windows defender会报警,网上搜索提示说是和icon有关,使用自带的icon会设计系统调用等内容,导致报警,后续自行从网上扣了个图作为icon。 本项目将指令做了二次封装。使得脚本的编写更加简单。例如,正常情况下,执行测量I2C的建立时间的操作,需要如下指令: MEASUrement:MEAS1:TYPe delayMEASUrement:MEAS1:SOUrce1 CH2MEASUrement:MEAS1:SOUrce2 CH1MEASUrement:MEAS1:DELay:DIREction backwardsMEASUrement:MEAS1:DELay:EDGE1 riseMEASUrement:MEAS1:DELay:EDGE2 rise 使用封装之后的指令: delay》》ch2》》rise》》ch1》》rise 脚本还封装了其他常用的操作,可以根据sample里的描述自行设计脚本,加速测试的效率。 当然,最后不能忘的还是最初让笔者决定开发小助手工具的动机:wait。项目里使用time.sleep()函数,来为程序做延时。脚本里当键入wait指令时,会在该位置处暂停2s钟,等待示波器的测试结果稳定,然后再继续执行。 4、测试结果 经测试,本项目的核心功能:自动测量及存图,效果良好。且脚本很简单:可以在1分钟内完成i2c的所有测试项(大约15张图)的测量和保存。大大提升了研发效率。 #设置ch1的label的名称为name label》》ch1》》clk label》》ch2》》dat #等待2s wait #一次性执行完频率、上升沿、下降沿、高电平、低电平的测试并存图 time》》FRU_clk》》ch1 #一次性执行完上升沿、下降沿、高电平、低电平的测试并存图 data》》FRU_dat》》ch2 #测量建立时间 delay》》ch2》》fall》》ch1》》rise wait save》》FRU_setup wait #测量保持时间 delay》》ch1》》fall》》ch2》》fall wait save》》FRU_hold wait |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:14 , Processed in 0.844138 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号