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。
  • 总线无关:上层代码不关心物理连接方式,只关心资源地址和读写操作,从而实现“一次编写,多总线复用”。
VISA 不是仪器驱动,也不是总线驱动。它是一层“通信中间件”:总线驱动负责把数据送到硬件,VISA 负责把不同总线的差异统一成一致的编程模型。

二、历史演进:从 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 统一 I/O 接口层 viOpen · viWrite · viRead · viClose · 资源名解析 · 超时与状态码 GPIB 驱动 GPIB0::12::INSTR 串口驱动 ASRL3::INSTR USB 驱动 USB0::0x2A8D::INSTR LAN 驱动 TCPIP0::192.168.1.10::INSTR GPIB 电缆 RS-232 / RS-485 USB 线缆 以太网 / LAN GPIB 仪器 串口仪器 USB 仪器 LAN 仪器 软件层 硬件层

四、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 会话。对上层而言,这些差异都转化为统一的属性设置,例如超时时间、终止符、读写缓冲区大小。

学习 VISA 时,建议先掌握“资源名 → 打开 → 配置属性 → 读写 → 关闭”这一固定流程。无论底层是什么总线,这个流程都成立,差别只在资源名和少量属性上。

五、典型场景与常见误区

假设一个测试系统同时包含 GPIB 电源、串口温控器和 LAN 示波器。使用 VISA 后,程序可以统一写成:打开三个资源,分别设置超时和终止符,然后循环执行写命令、读响应、解析数据。若某台仪器升级为 USB 接口,只需替换资源字符串,业务逻辑几乎不动。

常见误区包括:把 VISA 当成仪器驱动,认为调用 VISA 就能直接理解 *IDN? 之外的仪器语义;忽略资源字符串格式,导致 viOpen 返回错误;不设置超时,程序在仪器无响应时永久阻塞;混用不同厂商的 VISA 实现,造成运行库冲突。复盘时,应优先检查资源名、VISA 版本、总线驱动和仪器地址是否一致。

在同一台计算机上安装多个 VISA 实现时,可能出现 DLL 冲突或资源管理器无法识别仪器。工程上建议统一使用一种 VISA 实现,并在部署文档中记录版本和配置路径。

理解 VISA 的定义、演进和分层位置,是后续学习资源管理、消息读写、事件处理和错误排查的基础。只有把 VISA 看作“总线无关的统一 I/O 层”,才能在多仪器、多总线的测试系统中写出可维护、可移植的通信代码。