使用波形SDK
介绍
WaveForms SDK是WaveForms安装中提供的一套工具,用于开发使用Digilent测试和测量设备的定制软件解决方案。波形SDKAPI支持多种编程语言,便于跨许多不同平台使用。
通常测试和测量设备是通过个人计算机的波形应用程序控制和配置的。这样的设置在给定的环境中可能是不可能的,或者在WaveForms的脚本环境之外可能需要大量的自动信号测量。WaveForms SDK提供了必要的工具,帮助为任何问题制定完美的解决方案。
示例应用程序
本指南通过两个示例应用程序的实现来演示WaveForms SDK的用例以及正确的工作流程。一个用Python实现的示例应用程序将配置一个Digilent Test and Measurement设备,以用示例填充数据缓冲区。然后,这些示例被用来生成一个图形图像,该图形图像在本地托管的网页上共享。另一个例子将展示如何使用测试和测量设备的数字I/O线作为输入和输出。
库存
-
一种勤奋测试测量装置
-
数字发现-不支持模拟IO示例
-
MTE电缆,BNC示波器探头,和/或BNC到Minigrabber夹电缆,这取决于您使用的设备和您想要运行的示例。
-
一台装有波形的计算机
-
WaveForms应用程序和WaveForms SDK都可以按照波形入门指南.
-
1.SDK概述
WaveForms SDK包含在WaveForms中,并与应用程序一起安装。SDK可以通过一个动态库与C/ c++, c#, Python和Visual Basic一起使用。
在Windows上,动态库可以在C:\Windows\System32\dwf.dll和在Linux上在/usr/lib/libdwf.so.x.x.x处找到。
32位系统的静态库在C:\Program Files\Digilent\ WaveFormsSDK\lib\x86, 64位系统的静态库在C:\Program Files (x86)\Digilent\ WaveFormsSDK\lib\x64。
C头文件位于C:\Program Files\Digilent\ WaveFormsSDK\inc (Windows 32位),C:\Program Files (x86)\Digilent\ WaveFormsSDK\inc (Windows 64位)和/usr/local/include/digilent/waveforms (Linux)。
其他的工作代码示例,每种描述的编程语言都提供了SDK,可以在C:\Program Files\Digilent\ WaveFormsSDK样本Windows 32位,C:\Program Files (x86)\Digilent\ WaveFormsSDK样本Windows 64位和/usr/local/share/digilent/waveforms/sample Linux上找到。
2.实现示例应用程序
2.1设置
在计算机的某个地方创建一个新文件夹。这将是一个项目目录,所有与SDK项目相关的文件都将存储在这个目录中。
Dwfconstants.py必须复制到项目目录中,其位置与操作系统:
-
Win32:C:\Program Files\Digilent\ WaveFormsSDK \ \ py样品
-
Win64:C:\Program Files (x86)\Digilent\ WaveFormsSDK \ \ py样品
-
Linux:/usr/local/share/digilent/waveforms/samples/py
对于模拟IO示例,需要几个Python包,并通过调用来安装
PIP安装matplotlib numpy烧瓶mpld3
2.2脚本实现
下面给出了每个示例应用程序的代码片段。要查看特定示例的代码,请打开下面相应的下拉菜单。
- 模拟输入输出示例
-
在项目目录中,创建一个名为main.py的文件,并用文本编辑器打开。在文件的顶部,像这样声明这些导入:
从ctypes进口*从dwfconstants进口*进口数学进口时间进口matplotlib。pyplot作为plt,mpld3进口sys进口numpy从io进口BytesIO,StringIO从瓶进口瓶,响应
必须加载dll,而加载的方法取决于操作系统。添加下面几行代码来完成这项工作。
如果sys.平台.startswith(“赢”): dwf=cdll。dwfelifsys.平台.startswith(“达尔文”): dwf=cdll。LoadLibrary(“/图书馆/框架/ dwf.framework / dwf”)其他的: dwf=cdll。LoadLibrary(“libdwf.so”)
接下来的几行代码声明了一些用于配置Test和Measurement设备的helper变量。还声明了一个样本缓冲区,它将很快被从设备中获取的数据填充。将代码片段添加到项目代码中:
#声明ctype变量hdwf=c_int()sts=c_byte()hzAcq=c_double(100000)# 100千赫nSamples=200000rgdSamples=(c_double * nSamples)()cAvailable=c_int()cLost=c_int()cCorrupted=c_int()fLost=0fCorrupted=0
接下来,打开第一个可用的设备。的API返回用于配置设备的设备句柄。添加下面的代码:
#打开设备dwf。FDwfDeviceOpen(c_int(-1),byref(hdwf))如果hdwf。价值==hdwfNone。价值: szerr=create_string_buffer(512)dwf。FDwfGetLastErrorMsg(szerr)打印(str(szerr。价值))打印("打开设备失败")辞职()
被测量的信号将来自设备本身。它被配置为在设备的波道1上输出一个正弦波。添加以下代码:
#打开波形通道1,设置波形为正弦,设置频率为1hz,振幅为2v,并启动波形dwf。FDwfAnalogOutNodeEnableSet(hdwf,c_int(0),AnalogOutNodeCarrier,c_bool(真正的))dwf。FDwfAnalogOutNodeFunctionSet(hdwf,c_int(0),AnalogOutNodeCarrier,funcSine)dwf。FDwfAnalogOutNodeFrequencySet(hdwf,c_int(0),AnalogOutNodeCarrier,c_double(1))dwf。FDwfAnalogOutNodeAmplitudeSet(hdwf,c_int(0),AnalogOutNodeCarrier,c_double(2))dwf。FDwfAnalogOutConfigure(hdwf,c_int(0),c_bool(真正的))
然后,设备的示波器通道被配置为采样,并启动,添加了以下代码:
#使能示波器通道1,设置输入范围为5v,设置采集模式为记录,设置采样频率为100kHz,设置记录长度为2秒dwf。FDwfAnalogInChannelEnableSet(hdwf,c_int(0),c_bool(真正的))dwf。FDwfAnalogInChannelRangeSet(hdwf,c_int(0),c_double(5))dwf。FDwfAnalogInAcquisitionModeSet(hdwf,acqmodeRecord)dwf。FDwfAnalogInFrequencySet(hdwf,hzAcq)dwf。FDwfAnalogInRecordLengthSet(hdwf,c_double(nSamples / hzAcq。价值))# -1无限的记录长度#等待至少2秒的偏移量稳定时间.睡眠(2)打印(“从示波器”)dwf。FDwfAnalogInConfigure(hdwf,c_int(0),c_int(1))
然后,下一个代码片段轮询设备的状态,将所有可用的样本读入缓冲区。当缓冲区未满时,它将继续这样做。
cSamples=0而cSamples<nSamples: dwf。FDwfAnalogInStatus(hdwf,c_int(1),byref(sts))如果cSamples==0和(sts==DwfStateConfig或sts==DwfStatePrefill或sts==DwfStateArmed):#收购尚未开始。继续#获取可用、丢失和损坏的样本数量dwf。FDwfAnalogInStatusRecord(hdwf,byref(cAvailable),byref(cLost),byref(cCorrupted))cSamples +=cLost。价值#设置丢失和损坏的标志如果cLost。价值: fLost=1如果cCorrupted。价值: fCorrupted=1#跳过阅读样本,如果没有的话如果cAvailable。价值==0:继续#如果缓冲区溢出,则限制可用的样本如果cSamples + cAvailable。价值>nSamples: cAvailable=c_int(nSamples-cSamples)#读取通道1的可用样本到缓冲区dwf。FDwfAnalogInStatusData(hdwf,c_int(0),byref(rgdSamples,运算符(c_double)* cSamples),cAvailable)#获取通道1的数据cSamples +=cAvailable。价值
取样后,最好是关闭波和关闭设备进行清理。
# reset wavegen停止它,关闭设备dwf。FDwfAnalogOutReset(hdwf,c_int(0))dwf。FDwfDeviceCloseAll()
图形图像是由采样的数据创建的,图像保存在自己的缓冲区中,以供web服务器使用。
#从样本中生成图形图像,并将其存储在字节缓冲区中plt。情节(numpy。fromiter(rgdSamples,dtype=numpy。浮动))生物=BytesIO()plt。savefig(生物,格式=“png”)
最后,当web服务器收到HTTP请求时,它会返回图形图像。
#启动web服务器,仅当运行为主如果__name__==“__main__”:应用程序=瓶(__name__)@应用程序。路线(' / ')defroot_handler():返回响应(生物。getvalue(),mimetype=“图像/ png”)#返回图形图像的响应应用程序。运行()
以上代码的完整副本可下载在这里.
- 数字IO的例子
-
在项目目录中,创建一个名为main.py的文件,并用文本编辑器打开。在文件的顶部,像这样声明这些导入:
从ctypes进口*从dwfconstants进口*进口时间进口sys
必须加载dll,而加载的方法取决于操作系统。添加下面几行代码来完成这项工作。
如果sys.平台.startswith(“赢”): dwf=cdll。dwfelifsys.平台.startswith(“达尔文”): dwf=cdll。LoadLibrary(“/图书馆/框架/ dwf.framework / dwf”)其他的: dwf=cdll。LoadLibrary(“libdwf.so”)
接下来的几行代码声明了一些用于配置Test和Measurement设备的helper变量。还声明了一个样本缓冲区,它将很快被从设备中获取的数据填充。将代码片段添加到项目代码中:
hdwf=c_int()dwRead=c_uint32()
以下将确定波形的当前版本:
版本=create_string_buffer(16)dwf。FDwfGetVersion(版本)打印(“DWF版本:“+str(的版本。价值))
接下来,打开第一个可用的设备。的API返回用于配置设备的设备句柄。添加下面的代码:
打印(“先打开设备”)dwf。FDwfDeviceOpen(c_int(-1),byref(hdwf))如果hdwf。价值==hdwfNone。价值:打印("打开设备失败")szerr=create_string_buffer(512)dwf。FDwfGetLastErrorMsg(szerr)打印(str(szerr。价值))辞职()
通过屏蔽相应的位来启用某些行上的输出(禁用的行只能用作输入):
#使能8个LSB IO引脚的输出/掩码,从DIO 0到7dwf。FDwfDigitalIOOutputEnableSet(hdwf,c_int(0 x00ff))
在循环中,计算引脚的当前值,然后将该值输出到启用的行上。读取和显示数字I/O线的状态。在下一次迭代之前等待0.5秒。
试一试:#以100000000开头pin_state=0 x80而真正的:#计算新的输出值pin_state=pin_state *2如果pin_state>0 x80: pin_state=0 x01#设置启用IO引脚的值dwf。FDwfDigitalIOOutputSet(hdwf,c_int(pin_state))#从设备中获取数字IO信息dwf。FDwfDigitalIOStatus(hdwf)#读取所有引脚的状态,无论输出是否开启dwf。FDwfDigitalIOInputStatus(hdwf,byref(dwRead))# print(dwRead作为bitfield(32位,去掉前面的0b))打印("数字IO引脚:",箱子(dwRead。价值)(2:].zfill(16))时间.睡眠(0.5)
按Ctrl+C退出循环,然后关闭Test & Measurement设备,使其可用于其他软件(如波形)。
除了KeyboardInterrupt:# ctrl+c退出通过最后:#关闭打开的连接dwf。FDwfDeviceClose(hdwf)
上述代码的完整副本可以下载在这里.
3.运行应用程序
要运行上一步中创建的Python脚本并查看示例应用程序的结果,请遵循下面的说明。
- 模拟输入输出示例
-
此时,将测试和测量设备的Wavegen通道1和Scope通道1引脚连接在一起。将设备插入计算机。在控制台中,调用
python main.py
控制台应该有类似如下的输出:
DWF版本:b'3.10.9'打开第一个设备产生正弦波…开始示波器记录已完成*服务烧瓶应用程序“主”(惰性加载)*环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。使用一个生产WSGI服务器代替。*调试模式:off *在http://127.0.0.1:5000/上运行(按CTRL+C退出)
打开网页浏览器并导航到http://127.0.0.1:5000采样后的正弦波曲线图如图所示:
- 数字IO的例子
-
数字I/O行0到7将同时用作输入和输出,而行8到15将仅用作输入。通过连接引脚0到引脚8,引脚1到引脚9等创建一个简单的环回连接(按照接线图到右边)。这样,在第0-7行上输出的任何信息都可以在第8-15行上使用。脚本的输出将显示两个字节,第一个字节是从第15-8行读取的信息,第二个字节是在第7-0行读取的位。
将设备插入计算机,并在控制台调用:
python main.py
控制台应该有类似如下的输出:
DWF版本:b'3.16.13'打开第一个设备数字IO Pins: 0000000100000001数字IO Pins: 0000001000000010数字IO Pins: 0000010000000100数字IO Pins: 0000100000001000数字IO Pins: 0001000000010000数字IO Pins: 0010000000100000…
可以通过按Ctrl+C退出代码。