2. VISA基础概念
在测试测量系统中,仪器与计算机之间的通信往往涉及多种物理总线:老式台式仪器常用 GPIB,现代仪器可能使用 USB、LAN,工业现场还常见串口(RS-232/RS-485)。如果每换一种总线就要重写一套通信代码,测试软件的开发和维护成本会急剧上升。VISA(Virtual Instrument Software Architecture,虚拟仪器软件架构)正是为解决这一问题而诞生的标准 I/O 软件层。
一、VISA 的定义与核心思想
VISA 是由 IVI 基金会(原 VXIplug&play 系统联盟)制定并维护的一套仪器通信应用编程接口标准。它位于操作系统与仪器驱动之间,向上为应用程序提供统一的函数调用,向下屏蔽不同总线在协议、时序、寻址方式上的差异。
VISA 的核心思想可以概括为三点:
- 统一接口:无论底层是 GPIB、串口、USB 还是 LAN,应用程序都调用同一组函数,如
viOpen、viWrite、viRead、viClose。 - 资源抽象:每台仪器被抽象为一个“资源”,通过资源字符串(Resource Name)唯一标识,例如
GPIB0::12::INSTR、ASRL3::INSTR、TCPIP0::192.168.1.10::inst0::INSTR。 - 总线无关:上层代码不关心物理连接方式,只关心资源地址和读写操作,从而实现“一次编写,多总线复用”。
二、历史演进:从 VXI 到多总线统一
VISA 的发展与仪器总线演进紧密相关。20 世纪 80 年代末,VXI 总线出现,需要一套跨厂商的软件标准来管理模块化仪器。1993 年前后,VXIplug&play 联盟推出 VISA 规范,最初主要服务于 VXI 和 GPIB。随着 USB、LAN 仪器普及,VISA 逐步扩展支持串口、USB、TCP/IP、VXI-11、HiSLIP 等。如今,主流实现包括 NI-VISA、Keysight IO Libraries、R&S VISA 等,它们都遵循同一套 API 语义,但在安装包、配置工具和平台支持上各有差异。
| 阶段 | 主要总线 | VISA 关注点 |
|---|---|---|
| 早期 | GPIB、VXI | 统一寄存器与消息基仪器访问 |
| 扩展期 | 串口、USB | 增加串行与 USB INSTR/USBTMC 支持 |
| 网络化 | LAN、VXI-11、HiSLIP | 远程资源发现与高速网络传输 |
| 现代 | 多总线混合 | 统一资源名、统一错误模型、跨平台 |
三、VISA 在测试测量系统中的位置
一个典型的测试测量软件栈自下而上通常包括:物理仪器 → 总线硬件 → 总线驱动 → VISA → 仪器驱动 → 测试应用。VISA 处于承上启下的位置:向下调用各总线驱动,向上为仪器驱动或直接为应用提供 I/O 服务。
这种分层带来两个直接好处。第一,替换总线时上层代码改动极小。例如把 GPIB 仪器换成 LAN 仪器,只需修改资源字符串,viWrite 和 viRead 的调用逻辑基本不变。第二,VISA 提供统一的超时、状态码和事件机制,便于构建稳定的自动化测试程序。
四、VISA 与各总线的抽象关系
VISA 对总线的抽象主要体现在资源字符串和属性模型上。资源字符串由接口类型、板卡号、主地址、次地址和资源类组成。例如:
GPIB0::12::INSTR // GPIB 板卡 0,主地址 12 的仪器
ASRL3::INSTR // 串口 3
USB0::0x2A8D::0x1301::MY123456::INSTR // USB 仪器
TCPIP0::192.168.1.10::inst0::INSTR // LAN 仪器
不同总线的差异被封装在 VISA 内部:GPIB 需要处理主/次地址和握手,串口需要配置波特率、数据位、停止位和流控,USB 需要处理 USBTMC 端点,LAN 需要处理 VXI-11 或 HiSLIP 会话。对上层而言,这些差异都转化为统一的属性设置,例如超时时间、终止符、读写缓冲区大小。
五、典型场景与常见误区
假设一个测试系统同时包含 GPIB 电源、串口温控器和 LAN 示波器。使用 VISA 后,程序可以统一写成:打开三个资源,分别设置超时和终止符,然后循环执行写命令、读响应、解析数据。若某台仪器升级为 USB 接口,只需替换资源字符串,业务逻辑几乎不动。
常见误区包括:把 VISA 当成仪器驱动,认为调用 VISA 就能直接理解 *IDN? 之外的仪器语义;忽略资源字符串格式,导致 viOpen 返回错误;不设置超时,程序在仪器无响应时永久阻塞;混用不同厂商的 VISA 实现,造成运行库冲突。复盘时,应优先检查资源名、VISA 版本、总线驱动和仪器地址是否一致。
理解 VISA 的定义、演进和分层位置,是后续学习资源管理、消息读写、事件处理和错误排查的基础。只有把 VISA 看作“总线无关的统一 I/O 层”,才能在多仪器、多总线的测试系统中写出可维护、可移植的通信代码。