基于Python的示波器实时监控实验设计
2024-01-07胡哲邱继云
胡哲 邱继云
摘要:基于Python语言,设计了计算机对示波器SDS5054X的实时监控实验。通过访问示波器IP地址与端口号,建立TCP连接。计算机向示波器发送SCPI指令,读取示波器实时波形并以BMP图片格式保存在电脑里。该实验过程有助于学生加深TCP协议相关理论知识的理解,实现远程访问和操控示波器。同时可使学生熟悉Python语言的集成开发环境Pycharm,有效提高学生编写与调试代码的能力,对提高工程实践能力具有显著作用。
关键词:实验设计;Python;示波器;TCP通信
中图分类号:G482文献标识码:A
ExperimentalDesignofOscilloscopeRealtimeMonitoringBasedonPython
HuZheQiuJiyun
SchoolofElectronicandCommunicationEngineering,SunYatsenUniversityGuangdongShenzhen518107
Abstract:BasedonPythonlanguage,therealtimemonitoringexperimentofoscilloscopeSDS5054Xwasdesigned.ThroughaccessingoscilloscopeIPaddressandportnumber,TCPconnectionisestablished.ThecomputersendsSCPIqueryinstructionstotheoscilloscopeandreadoscilloscoperealtimewaveformandsaveitinBMPpictureformatinthecomputer.TheexperimentalprocesscanhelpstudentsdeepentheunderstandingofTCPprotocoltheoryandaccessoscilloscoperemotely.Atthesametime,studentscanbefamiliarwithPycharm,thePythonintegrateddevelopmentenvironmentandimprovestudents'abilitytowriteanddebugcodeeffectively,whichplaysasignificantroleinimprovingengineeringpracticeability.
Keywords:experimentaldesign;Python;oscilloscope;TCPcommunication
示波器廣泛应用于电子测量行业,它能把人眼看不见的电信号转化为屏幕上的图像,便于人们研究各种电现象的变化过程[1]。而目前高校开设的电学实验中通常是手动操作示波器进行信号测量,未能充分拓展示波器功能。
而计算机编程技术飞速发展,Python因其简单易学、语言资源整合能力和扩展能力强的特点而应用广泛,成为当下企业最热门的编程语言之一。
基于新工科对于人才培养提出多学科交叉融合的培养模式要求[2],本文以鼎阳示波器SDS5054X为核心,应用Python作为编程语言,设计计算机与示波器通信实验,学生通过实验能够由浅入深、更加系统地了解和掌握示波器与通信原理相关的理论,加强Python编程能力的培养。
1实验内容
本实验案例内容要求为:基于Python语言,采用TCP通信协议,通过访问鼎阳示波器SDS5054X的IP地址与相应端口,建立与示波器之间的通信连接,并发送SCPI指令,查看示波器的实时波形并以图像形式保存至电脑里。
2实验总体方案设计
首先,为了建立电脑与示波器的TCP通信,调用函数库中的Socket模块,创建连接。如果创建失败,则返回提示相关连接创建错误。在连接建立后,利用sendall()函数发送SCPI查询指令,recv()函数接收相关查询结果。为了检验多次查询是否会出错且使实验的效果更明显,设置了10次循环,循环结束后关闭Socket模块,结束连接,实验代码设计框图见图1。
3实验原理
3.1TCP通信原理
TCP(英文:TransmissionControlPtotocol)是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议,具有全双工操作、有效流控、传输可靠等特点[3]。TCP建立连接时,客户端和服务器要经过三次握手阶段,当客户端向服务端发起连接时,会先发一包用于询问能否建立连接的SYN包,如果对方同意连接,则会回复SYN+ACK包,客户端收到后,回复ACK包,连接建立。三次握手示意图如图2所示。
处于连接状态的客户端与服务端,都可以发起关闭连接请求,共需要四次挥手进行连接关闭。假设客户端主动发起连接关闭请求,需要先向服务端发起一包FIN包,表示要关闭连接,客户端进入终止等待1状态,这是第一次挥手。随后服务端向客户端发送ACK包,表示进入关闭等待状态,客户端进入终止等待2状态,这是第二次挥手。此时服务端还可以发送未发送的数据,客户端还可以接收数据。待服务端发送完数据后,服务端发送一包FIN包,进入最后确认状态,这是第三次挥手。客户端收到后回复ACK包,进入超时等待状态,经过超时等待后关闭连接,服务端收到ACK包后立刻关闭连接,这是第四次挥手。四次挥手示意图如图3所示。
3.2Socket编程通信
Socket是操作系统提供给开发人员进行网络开发的API接口,这套接口通常可以参数的调整支持多种协议,包括TCP、UDP和IP等。Socket编程通信示意图见图4,主要包含以下三个步骤。
3.2.1建立连接
两端分别有一个Socket,用于两者之间的通信。客户端向服务器发送请求,创建Socket进行连接。服务端则随时监听客户端发起的请求,接收并创建Socket。
3.2.2数据传送
服务端和客户端的输入输出流互相通信。逻辑上可理解为通信进程的双方具有两个流(输出流和输入流)。逻辑上可将两个流理解为两个通信管道的全双工通信模式,一个用于向对方发送数据,另一个用于接收对方的数据。
3.2.3终止连接
客户端访问服务器结束,断开连接,关闭Socket和相关资源(输入输出流等)。服务端监听客户端状态,同时关闭Socket等连接。
3.3通信功能实现
3.3.1建立连接
Socket模块是Python中自带模块,它可以使开发人员不用去关注内部层与层之间的传输,只需在Socket接口发送和接收指令。在调用Socket模块后,需要选择AdressFamily和Type两个参数。本文采用TCP协议连接方式,即参数分别选择为Socket.AF_INET和Socket.SOCK_STREAM,连接至示波器IP与port。鼎阳科技的研发人员将port5025设置为Socket的端口号,不需安装NIVISA。考虑到调用失败或者连接失败的情况,需提示用户连接失败并及时退出,故引入sys模块。代码示例如图5。
3.3.2发送和接收指令
在Python的Socket编程中,有两个发送TCP的函数,send()与sendall()。本文采用sendall()函数,可完整发送TCP数据。将string中的数据发送到连接的Socket,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
Socket.recv(bufsize[,flag])用于接收TCP连接的Socket里的数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。本次实验设置最大数据量是4096字节。部分代码示例见图6:
3.3.3关闭Socket
发送和接收数据完成后,需将Socket及时关闭完全释放资源。close函数可以用于关闭Socket,并且只能TCP连接。关闭后需要延时一段时间,可以调用time模块可以让程序休眠,具体方法是time.sleep(秒数),其中“秒数”以秒为单位,可以是小数。代码示例见图7:
3.4SCPI通信协议说明
可编程仪器标准命令(英语:StandardCommandsforProgrammableInstruments,缩写:SCPI)是一套用于控制可编程测试测量仪器的标准语法和命令,实际是通过ASCII字符串形式在命令与仪器进行交互[4]。SCPI协议建立于IEEE488.2基础上,可用于GPIB、RS232、VXIb总线,通过相同命令来控制不同仪器的相同功能。命令一般由一系列的关键字构成,有的还需要包括参数。
一般的仪器指令大致可以分为控制指令和查询指令,控制指令可以改变仪器运行状态,比如控制示波器的开启和关闭。查询指令可以查询仪器运行状态,比如查询电源的输出电流等,一般以问号结尾。不同品牌的仪器SCPI指令数据格式由仪器厂家定义,通常会有稍许不同,具体的指令需查询仪器厂家提供的数据手册。同时,IEEE488.2标准定义了一组常用命令,可执行复位、自检以及状态操作等功能。常用命令总是以星号(*)开始,长度为3个字符,并可以包括一个或多个参数。以向示波器发送查询指令*IDN*为例,此查询命令可以识别仪器类型和软件版本,响应由四个不同的字段组成,实现代码如图8:
4实验示例
在实验中,常常会受到场地、环境等客观因素限制,不能实地监测示波器波形变化。利用示波器与电脑远程通信,建立相应连接,可以远程实时读取波形,并以图片格式保存在电脑里。具体实现可分为以下几个步骤:
(1)利用socket模块,建立电脑与示波器的连接,进行相互通信。
(2)设置缓冲区的大小。指定chunksize为20Mb,将数据分为多次读取,避免一次性读取内存不足。
(3)示波器向电脑发送SCPI指令PRINBMP,请求将示波器数据保存为BMP格式图片。
(4)读取示波器图片数据,使用open()函数,以二进制格式、只写模式打开文件,将图片数据从内存写入至本地文件中。
(5)使用flush()方法刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要被动地等待输出缓冲区写入。
(6)关闭文件,写入结束。
實现代码如图9:
结语
本文提出基于Python语言,建立与鼎阳示波器SDS5054X之间的TCP连接,通过SCPI指令实现实时读取示波器波形数据,并以BMP格式储存在电脑里。针对该项实验,学生需要搭建Python语言环境,熟悉基本语法和相关通信模块,掌握基本的通信原理与数字示波器测量信号知识。在不断调试整段代码的过程中,可以培养学生基本编程能力和排错能力,加深对Socket编程模块和数据读写操作的理解,为日后进一步完成软硬件结合的工程项目打下初步基础。
参考文献:
[1]李林潇,江先阳.基于LabVIEW的示波器控制与演示系统设计[J].物理实验,2018,38(S1):103107.
[2]赵江萍,姚缨英.新工科背景下的电学实验设计方法探究[J].实验室科学,2021,24(4):5659.
[3]徐宙,刘连照,程彦杰,等.基于C#的数字存储示波器控制软件设计与实现[J].计量与测试技术,2016,43(2):5355+57.
[4]于晓辉,许礼昆,李新波,等.基于单片机的数字示波器实验设计[J].实验室科学,2021,24(3):5356+60.
[5]阮颐,宋清亮,王甲.基于Python的示波器图像数据识别[J].集成电路应用,2020,37(1):1819+22.
[6]刘雪琳,章钰琪,董爱国.基于Python的物理实验数据处理系统设计与实现[J].实验技术与管理,2021,38(3):7478.
[7]郝彦爽,林颖,韩守梅.基于FPGA的数字电子技术实验案例设计[J].实验室科学,2021,24(3):101104.
[8]孙晖,彭里卓.基于树莓派和Python的数字音效处理综合实验设计[J].集成电路应用,2021,38(10):262263.
[9]蔡军,左俊伟,潘峰.基于LabVIEW的谐振式无线电能传输实验系统设计[J].实验技术与管理,2021,38(10):211215.
基金项目:2021年第二批产学合作协同育人项目(项目编号:202102504019)
作者简介:胡哲(1996—),女,汉族,山西大同人,硕士,助理实验师,研究方向为实验教学研究。