将使用NI-488函数的GPIB-VXI/C程序转换成NI-VISA程序



主要软件:
主要软件版本: 3.0
主要软件修正版本: N/A
次要软件: N/A
硬件: GPIB>>Plug-in Controllers>>GPIB-VXI/C

问题: 怎样将使用NI-488函数的GPIB-VXI/C程序转换成NI-VISA程序

解答: 对于基于消息的编程设计,典型的来说,一个NI-488程序通过结合VXI设备的第一和第二GPIB地址调用ibdev()来获取一个特定设备的句柄。在NI-VISA中,程序结合VXI设备的逻辑地址(这是一个较普通的地址,因为其是VXI设备)调用viOpen()来获取其句柄。对数据块的读和写的调用,以及其他的一些IEEE-488通信(诸如读取状态字节以及清空缓存),都在NI-488与NI-VISA之间具有一一映射关系。其中需要注意的一点区别是,当等待服务请求的时候,VISA程序需要首先通过调用viEnableEvent()来激活相应事件。在程序末尾,需要使用viClose()而不是ibonl来关闭设备句柄。

基于寄存器的编程设计不具有一个直接的映射关系。因为使用GPIB-VXI的寄存器访问包含了向控制器本身发送请求的操作(使用局部命令集),NI-488程序会使用包含GPIB-VXI 控制器第一和第二GPIB地址的ibdev()函数。在NI-VISA中,您将使用包含VXI设备逻辑地址的viOpen()函数-这无论对于基于消息的设备还是对于基于寄存器的设备来说都是一样的,并且也是一个更加自然和直观的API-同时VISA句柄会向控制器传送必要的消息。针对设备编程,以下NI-488消息和NI-VISA操作大致等同:

NI-488 NI-VISA
   “Laddrs?” or “DLAD?”   viFindRsrc()
  “RMentry?” or “DINF?”   viGetAttribute()
“Cmdr?” viGetAttribute() with VI_ATTR_CMDR_LA
“LaSaddr?”   viGetAttribute() with VI_ATTR_GPIB_SECONDARY_ADDR  
“Primary?” viGetAttribute() with VI_ATTR_GPIB_PRIMARY_ADDR
“WREG” or “A16” viOut16() with VI_A16_SPACE
“RREG?”or “A16?” viIn16() with VI_A16_SPACE
“A24” viOut16() with VI_A24_SPACE
“A24?” viIn16() with VI_A24_SPACE
“SrcTrig” viAssertTrigger()


需要注意的是,对于INSTR寄存器访问操作viOut16() 和 viIn16(),你传送的是一个在指定地址空间中的相对设备偏移。这点和GPIB-VXI局部命令集中接收绝对地址的情况有所不同。如果您的程序中当前使用了绝对寻址并且你并不想将其转换成设备相对偏移,您可以考虑使用MEMACC资源,它可以用来接收绝对寻址。您可以使用viOut8() 和viIn8()操作来进行8位访问,但这并不是被局部命令集所支持的一个特性。VISA亦定义了访问A32空间的32位操作,但由于这些操作并未在GPIB-VXI得到实现,他们会返回错误。

如果您曾使用过DMAmove代码工具,那么现在您可以使用viMoveInxx() 和 viMoveOutxx()操作。他们利用了GPIB-VXI的DMA功能,但仅需要一次单独的操作调用,而不是通过多次的调用来传输命令和数据块同时还需要轮询以等待操作完成。使用VISA来移动数据块意味着您再无须加载DMAmove代码工具,因为NI-VISA会总动地下载一个独立的代码工具来处理这些类似的操作。

总体来说,使用NI-VISA来对受控于GPIB-VXI的VXI设备编程与对那些受控于诸如PCI-MXI-2 或 VXIpc-860的本地VXI控制器编程没有什么不同。尽管对于基于寄存器的程序来说,将代码从NI-488移植到NI-VISA并不是一件轻松的事,但更加简单的API以及对本地VXI控制器的兼容性等优点使得这一转换变得具有相当的价值。

相关链接:

附件:





报告日期: 06/17/2006
最近更新: 09/27/2008
文档编号: 3YG82O5N