通过单个接口-VISA(虚拟仪器软件架构应用程序编程接口(API)),可配置和控制串行、GPIB和VXI仪器。它是调用每个仪器的底层驱动程序的高层驱动程序。本应用笔记介绍了VISA,并介绍了如何使用VISA在Visual Basic中使用Measurement Studio VISA (CWVISA) ActiveX控件,通过单一编程接口执行串行、GPIB和VXI仪器的仪器控制。
VISA是NI开发的驱动程序软件架构,用于统一与串口、GPIB和VXI仪器的通信,简化仪器控制程序。VISA API通过操作系统调用以及NI-488.2和NI-VXI驱动程序软件访问串口、GPIB和VXI仪器,如图1所示。
VISA具有下列优点:
在紧凑的命令集中进行仪器编程的内置功能。
CWVISA是对VISA API进行抽象的ActiveX控件,因此可通过交互式属性页和简化API与串口、GPIB和VXI仪器交互。例如,CWVISA属性页可用于交互式查找仪器并与之通信、发现接口问题或在设计期间验证与仪器的通信。VISA ActiveX控件可用于任何ActiveX控件容器,包括Microsoft Visual Basic、Visual C++和Borland Delphi。
| 首先在用户界面表单上放置CWVISA控件。注意,Visual Basic将该控件命名为CWVisa1。右键单击控件,选择属性。本应用笔记的其他部分将介绍如何使用属性页选择资源和通信属性、测试通信、解析仪器数据,以及如何通过简化API以编程方式控制通信。 |
确定仪器资源名称
资源是要与之通信的串口、GPIB或VXI仪器或控制器。资源名称指定VISA资源的确切名称和位置。例如,资源名称ASRL1::INSTR表示计算机COM端口1上的仪器,GPIB0::13::INSTR表示地址13上的GPIB仪器。
与仪器交互的第一个挑战通常是确定其地址和资源名称。CWVISA在计算机上搜索所有可用的COM端口和活动GPIB和VXI仪器;它包括资源名称列表中的所有可用资源。如已知要与之通信的仪器的资源名称,或要在运行时更改资源,可通过编程指定资源名称,如以下代码所示:
CWVisa1.RsrcName = "GPIB::13::INSTR"
配置读取和写入设置
在RdWrt属性页配置下列常规接口和通信设置。图3显示了配置通信设置的一种方法。
串口I/O协议-选择正常或ASRL488。如串口仪器接受488.2格式的命令,请使用ASRL488设置。ASRL488设置可像对待其他基于消息的设备一样与仪器进行通信,如下例所示:
变体变灰状态
'设置I/O协议ASRL488数据传输
CWVisa1.RdWrt.IOProtocol = cwvisaProtocolASRL488
'清除设备
CWVisa1.清除
写入"*IDN?"至仪器
CWVisa1.写入"*IDN?"
'获取串行轮询值(状态字节)
状态 = CWVisa1.ReadSTB
'在用户界面的文本框中读取并显示响应
文本1.文本 = CWVisa1.读取
GPIB I/O协议-为常规IEEE488通信选择常规,为高速488数据传输选择HS488。
VXI I/O协议-对于大多数VXI仪器,选择正常。少数仪器支持FDC(快速数据通道)I/O。
交换字节反转设备的字节。如设备为Big Endian,请启用该选项。请参考设备文档确定仪器是否以Big Endian格式返回数据。
'Big Endian格式(最高有效字节优先)
CWGPIB1.交换字节 = True
终止符指定用于终止读取操作的字符。请参考仪器文档,确定是否需要使用终止符,以及终止符必须是什么。
'使用回车符作为终止符
CWVisa1.RdWrt.终止字符 = 13
'启用使用终止符
CWVisa1.RdWrt.终端字符启用 = True
配置接口设置
与串口或VXI仪器通信时,需设置一些额外的接口属性。
串口通信-使用串口属性页设置波特率、数据位、停止位和流控制方法,如图4所示,或通过编程设置串口属性,如下例所示:
CWVisa1.Asrl.波特率 = 9600
CWVisa1.Asrl.DataBits = cwasrlDataBits8
CWVisa1.Asrl.StopBits = cwasrlStopBits1
CWVisa1.Asrl.FlowControl = cwasrlFlowNone
VXI通信-使用VXI存储器属性页设置VXI寄存器访问的相关属性。基于寄存器的仪器具有称为寄存器的处理器设备,可在处理过程中临时存储数据。源和目标属性应用于高层寄存器访问操作,而窗口属性应用于底层寄存器访问。使用访问权限属性指定VME访问权限。,并使用地址增量在每次传输后使用转入或转出方法将目标地址加1。
图5显示了使用VXI仪器传输数据的一种方法。
可通过编程设置相同的通信属性。下列范例配置CWVisa1控件访问FIFO(非递增地址):
'源访问权限转换为数据权限
CWVisa1.VxiMemory.SrcAccessPriv = cwVxiMemoryDataPriv
'字节顺序至Big Endian转换
CWVisa1.Vxi存储器.源字节顺序 = cwVxi存储器BigEndian
'地址增量为0
CWVisa1.Vxi存储器.源增量 = 0
测试仪器通信
Measurement Studio可轻松测试通信,从而验证仪器是否正常工作。
1.打开测试属性页。通过该属性页可写入和读取基于消息的命令。所有串口和GPIB仪器以及许多VXI仪器都能识别各种基于消息的命令字符串。
2.在发送字符串字段中输入命令,例如*idn?识别查询。请参考仪器文档确定可识别哪些基于消息的字符串。
3.按执行。注意“接收字符串”显示控件中的响应。图6显示了从NI GPIB和串口设备仿真器收到的响应。也可按写入将数据写入仪器,按读取从仪器读取响应。
打开VISA会话
打开会话句柄并从程序中开始与仪器通信。会话句柄是CWVISA控件与资源的连接或链接,可使用打开方法打开。打开方法初始化资源,并使用属性页中指定的设置或通过编程配置VISA通信会话。例如,当用户单击前面板上的打开会话按钮时,可能需要打开VISA会话,如以下事件过程所示:
'打开会话
私有子OpenSession_单击()
End Sub
数据传输
CWVISA可与串口、GPIB以及基于消息和基于寄存器的VXI仪器和控制器进行通信。基于消息的仪器实现定义的VXIbus寄存器和通信协议,并识别Word串口协议。所有串口和GPIB仪器以及许多VXI仪器都能识别各种基于消息的命令字符串。您将使用一组标准的方法调用来写入和读取所有基于消息的仪器。CWVISA控件提供了一套可与VXI仪器配合使用的寄存器访问方法。对于高层寄存器访问,请使用输入和输出方法。对于低层寄存器访问,请使用Peek和Poke方法。
基于消息的同步I/O-使用写入和读取方法执行基于消息的同步I/O。例如,下列代码向仪器发送识别查询,然后在用户界面的文本框中显示仪器响应:
CWVisa1.打开
CWVisa1.写入"*IDN?" & vbLf
文本1.文本 = CWVisa1.读取
基于消息的异步I/O-可使用写入异步和读取异步执行异步I/O,使写入和读取操作立即开始并返回。ReadAsync方法完成后,CWVISA控件将生成一个事件并将数据传递给DataReady事件程序。WriteAsync方法完成后,CWVISA控件将生成一个WriteComplete事件。可使用这些异步方法和事件在较长的读取或写入操作中继续执行其他任务。例如,调用ReadAsync时,程序完成读取数据,CWVISA控件生成DataReady事件,调用下列事件过程:
私有子CWVisa1_数据就绪(ByVal taskNumber As Integer, data As Variant)
End Sub
使用输入和输出方法访问高层寄存器-如需从高层VXI寄存器读取数据,可使用In8、In16和In32方法读取8、16和32位值,如下例所示:
'从VXI总线A32空间的偏移量0读取32位值
X = CWVisa1.In32 cwVxiA32Space, 0
使用相应的输出方法将数据写入指定的偏移量,如下例所示:
'在VXI总线的局部空间从偏移量0写入32位值Y
CWVisa1.Out32 cwVxiLocalSpace, 0, Y
使用速览和速览方法访问底层寄存器-使用速览和速览方法之前,使用MapAddress方法将VXI内存空间的一部分映射到本地内存。MapAddress将地址空间、VXI基地址、存储器大小(以字节为单位)和建议的本地地址作为参数。该方法返回映射至指定基VXI地址的实际本地地址。然后使用Peek和Poke方法从映射空间读取和写入数据。
下列代码映射了本地内存中的一个空间,查看和戳探该空间,然后取消映射该空间:
'映射A16空间中的16字节内存
X = CWVisa1.映射地址(cwVxiA16Space, &hC000, 64, False, 0)
'读取地址空间开始处的16位值
Y = CWVisa1.Peek16(X)
'将16位值35写入地址空间第二个字节的寄存器
CWVisa1.Poke16 X + 2, 35
释放本地内存空间
CWVisa1.取消映射地址
注:使用映射地址方法映射VXI地址空间的区域至本地内存。检查映射窗口大小和窗口基本属性,确保未访问该窗口之外的区域。
使用事件同步通信
事件提供VISA资源和程序之间的通信。如希望程序响应下列任意条件,可定义相应事件的事件程序:
CWVISA控件将事件排入队列,以便后续访问和处理。CWVISA在所有事件类型上自动调用启用事件方法,但调用打开方法时触发除外。可使用启用事件方法仅添加要放置在事件队列中的事件。例如,下列Visual Basic代码为VxiVmeInterrupt事件启用事件队列,当事件发生时,事件将被放入队列,而不是调用其事件过程:
CWVisa1.启用事件cwvisa事件VXIVME中断
下列Visual Basic代码检查事件队列以确定队列中是否存在VXIVMEInterrupt事件,如果存在,则获取中断的StatusId值:
显示返回事件为CWVisa事件
显示状态为布尔
stat = CWVisa1.WaitOnEvent(cwvisaEventVXIVMEInterrupt, 0, ReturnEvent)
如果状态然后
结束If
如关注在程序的特定点发生的事件,可清空队列或禁用事件队列。使用丢弃事件方法清空队列中所有同类型的事件:
CWVisa1.丢弃事件cwvisa事件VXIVME中断
如需禁用队列中的事件,可使用禁用事件方法:
CWVisa1.禁用事件cwvisaEventVXIVME中断
解析数据
仪器通常用于发回加密的二进制字符串或包含头信息和数据信息的字符串。将这些字符串解析为可用的数据格式通常令人沮丧。CWVISA控件提供内置的数据解析功能,可更方便地使用仪器数据。
使用解析属性页创建解析任务。解析任务描述了如何解析数据。然后通过代码执行该任务,自动解析仪器返回的数据。可指定任意数量的解析任务,从而以不同方式解析与仪器的每种交互。
CWVISA控件提供一个名为数值解析器的内置任务。数字解析器将带分隔符的字符串转换为数字数组,移除字符串首和其他非数值信息。例如,假设有一台仪器响应DATA?命令,返回一个以逗号分隔的数字列表,列表前带有一些头信息。字符串可能类似于WFM3.246,3.295,4.653,3.334。如果没有数字解析器任务,您将解析字符串以获取每个ASCII表示的数字并将其转换为实际数值类型。通过数字解析器任务,可使用相同的方法调用解析和读取数据。下列Visual Basic代码演示了如何打开VISA会话句柄、使用Data?命令查询基于消息的仪器并读取解析后的数据:
'变体将包含双精度数组 - 解析后的数据
变体Dim数据
'打开VISA会话
CWVisa1.打开
将数据写入仪器
CWVisa1.写入“数据?”
'读取响应
data = CWVisa1.Tasks.Item("Number Parser")。读取
关闭VISA会话
使用关闭方法释放资源并结束VISA会话。在下列事件程序中,用户单击关闭会话命令按钮时VISA会话结束:
'关闭会话
私有子关闭会话_单击()
End Sub
NI VISA是用于多种仪器控制的解决方案。Measurement Studio提供属性页,可将VISA仪器控件交互式集成到程序中。例如,CWVISA控件查找所有VISA资源,因此只需从列出的资源中进行选择。CWVISA提供了一个测试属性页,用于与仪器交互和解决通信问题。使用解析属性页可指定解析任务,使数据以可用格式返回程序。通过Measurement Studio VISA API,可与串口、GPIB和VXI仪器进行同步和异步通信,并使用事件处理和队列功能加快程序执行。