6. 测量同步

编写远程控制应用程序时,测量同步是一个关键要素。忽略应用程序的测量同步特性,会导致程序运行出现意外,测量结果不可重复,让您感到沮丧。测量同步不当的一个明显迹象是,您必须在应用程序中插入固定暂停才能使其正常运行。

在本章的一开始,我们先定义什么是测量同步

现在的测量仪器非常复杂,具有自己的操作系统。测量应用程序不必时刻关注仪器的状态。测量同步方法可以让您确保在程序的重要时刻点(同步点)仪器正处于预期状态中。

下图展示了示波器和生成非周期信号的被测设备 (DUT) 的测量同步示例:

CH6_MeasSyncWithScope_16x9.png

从上图中可以看出,应用程序需等待仪器完成操作,因此出现了空闲时间。注意,这些空闲状态的时长不一。空闲时间必须根据不同的条件(例如电脑速度、不同的仪器稳定时间和采集时间)加以调整。如何调整空闲时间呢?最合适的方法是让仪器在准备就绪时予以响应。在下文的注释内容后面,本章介绍了不同的同步方法。

附加注释:

  • 始终在单次采集模式下操作示波器、频谱分析仪和功率计等采集仪器。这样一来,您才能确定测量结果来自最后一次采集,而不是之前的采集或尚未完成的采集。最重要的是:任何同步方法在单次采集模式下才能正常运行。
  • 基本设置和触发设置不需要进行同步。唯一的重点在于,最后您需要确保所有设置均已应用(同步点“SettingsApplied”)。
  • 触发信号到达后,示波器开始采集波形。应用程序必须等待示波器完成采集(同步点“AcquisitionFinished”)。
  • 在此同步点之后读取波形,确保结果来自最后一次采集。

同步机制概述

接下来我们将由简到繁依次介绍四种不同的同步机制:

  • *OPC? 查询
  • 状态字节 (STB) 轮询
  • 等待服务请求 (SRQ)
  • 服务请求 (SRQ) 事件

*OPC? 查询同步

这种同步方法最简单,也最为常用。

向仪器发送 *OPC? 查询命令后,仪器会延迟响应,直到完成所有待处理的操作。因此,程序会在 VISA Read 操作中进入空闲,等待仪器响应 *OPC? 查询。相比仪器响应,仪器产生的延迟才重要。

注意,由于 *OPC? 是一个查询命令,您必须使用 VISA Read() 函数读取仪器的响应。否则,仪器将在下一次查询时生成错误消息“Query Interrupted”。使用 *OPC? 查询和所有其他查询时,都必须注意这一点。

使用这种同步方法时,另一个参数也非常重要,那就是 VISA Timeout。VISA Timeout 机制可用于定义 VISA Read 操作在因 VISA 超时错误而结束之前等待的最长时间。由于这是一个独立数值,并且取决于当前任务的持续时间,因此您需要确保正确设置 VISA 超时。如果超时值过小,常规操作期间可能出现意外错误,超时值过大则会导致真正发生错误时程序无响应。

优点:

  • 在大多数情况下都简单有效。
  • 不使用会话的控制通道(参阅 STB 轮询方法),因此也适用于 RawSocket串行连接。

缺点:

  • 阻止程序与仪器通信,直到仪器响应。这在长时间操作中是个严重的问题,因为应用程序会长时间无响应。

状态字节 (STB) 轮询同步

罗德与施瓦茨仪器驱动程序使用这种方法。如果您使用直接 SCPI 命令,可参阅本章末尾介绍的实现示例。首先来看一下这种同步方法的具体流程。稍后我们会详细解释这种方法。

在解释这个流程图之前,我们需要了解一下仪器的状态子系统,这是一种寄存器层次结构,其中位于顶端的主寄存器被称为状态字节(STB)。这是 IEEE 488.2 标准定义的 8 位寄存器。寄存器的每个位都有不同的含义,是状态寄存器层次链中各寄存器的摘要标志。所有罗德与施瓦茨仪器的远程控制使用手册都介绍了完整的状态子系统结构(您可以使用“状态字节”来搜索相关内容)。下图显示了状态字节寄存器和事件状态寄存器(ESR):

  • 如流程图所示,首先将 ESE 滤波器设为 1(第 0 位 = 1)。这表示只关注 ESR 第 0 位“OPC”。您只需在启动连接后或在 *RST 命令后发送一次该命令。
  • 接下来,使用 *ESR?命令查询 ESR 寄存器值。这是一个事件寄存器,您可以在读取时清除其数值。这会将 ESR 第 0 位“OPC”重置为 0。
  • 接下来,发送希望同步的命令。在本例中,我们希望同步 SCPI 命令 SING,该命令使示波器能够进行单次采集。根据字符串末尾的 *OPC(没有问号!),仪器知道在该字符串中的所有命令执行完毕后,将 ESR 第 0 位“OPC”设为 1。因此,在此之前您必须将其重置为 0。否则,该位可能在之前的操作中已被设为 1,这会导致 STB 轮询在第一次迭代后错误结束循环。
  • 接下来,进入状态字节轮询循环。您需要查询状态字节,直到 第 5 位“事件状态摘要”设为 1。您可以通过两种方式检索状态字节值,例如使用 SCPI 命令 *STB?,或者使用特殊的 VISA 函数 ReadSTB()。这两种方法有何不同呢?*STB? 是标准的 SCPI 命令,并使用 VISA I/O 缓冲区。ReadSTB() 函数通过单独的控制通道进行通信,不会干扰标准 SCPI 写/读通信。这种方法还经过了优化,响应速度更快。我们建议在循环中加入渐进式轮询延迟。例如,前 10 次轮询无延迟,下一个 100 次轮询延迟 1 毫秒,再下一个 1000 次轮询延迟 10 毫秒,以此类推。为了防止无限循环,罗德与施瓦茨仪器驱动程序使用 OPC Timeout超时机制。
  • 循环结束后再次重置 ESR 第 0 位“OPC”,此时您需要使用 SCPI 命令 *ESR?

优点:

  • 不阻止与仪器的通信。您可以同时发送 SCPI 命令并接收响应。
  • 适合长时间操作,例如自校正或自测试。

缺点:

  • 实现过程更加复杂。
  • 不适用于 RawSocket 和串行连接,因为这些连接不支持控制通道函数 VISA ReadSTB()。

使用服务请求 (SRQ) 的高级方法

等待服务请求 (SRQ) 同步

这种方法与状态字节轮询同步类似,但不使用 STB 轮询循环,而是使用函数 VISA WaitOnEvent(),该函数配置为等待服务请求事件。本章末尾提供了这种同步方法的示例。

利用这种同步机制时,您需要:

  • 重置 *ESE 1 和 *SRE 32后进行一次性设置(参阅上图中的仪器状态子系统寄存器)。这会将 ESE 滤波器设为响应 ESR OPC 位,跟使用 STB 轮询的同步方法一样。如果 STB 寄存器的事件状态摘要位设为 1,“*SRE 32”会将 SRE 滤波器设为生成服务请求
  • 在发送同步命令之前,使用 VISA EnableEvent()函数启用服务请求事件。
  • 发送同步命令,命令末尾需包含 ;*OPC
  • 回调 VISA WaitOnEvent()函数。函数将一直等待,直到服务请求事件到达或达到超时。
  • 使用 VISA DisableEvent()函数禁用服务请求事件。

优点:

  • 与之前的方法相比,不需要实现 STB 轮询循环。
  • IO 跟踪数据更短,更易于读取。

缺点:

  • VISA WaitOnEvent()执行期间,LabVIEW 和 MATLAB 中的应用程序不可中断。这不适合需要较长时间才能完成的命令,例如自测试查询命令 *TST?
  • RawSocket 和串行连接不支持。

服务请求 (SRQ) 事件同步

这种方法的核心在于您可以启动仪器任务,然后专心处理其他工作。仪器完成任务后,VISA 会回调您选择的函数。这种函数被称为事件处理器

本章末尾提供了 C# 和 LabWindows/CVI 编程环境此类同步方法的示例。

利用服务请求事件同步机制时,您需要:

  • 重置 *ESE 1 和 *SRE 32后进行一次性设置(参阅上图中的仪器状态子系统寄存器)。这会将 ESE 滤波器设为响应 ESR OPC 位,跟使用 STB 轮询的同步方法一样。如果 STB 寄存器的事件状态摘要位设为 1,*SRE 32会将 SRE 滤波器设为生成服务请求。
  • 在发送同步命令之前,您必须使用 VISA InstallHandler()函数注册回调函数,并使用 VISA EnableEvent()函数启用服务请求机制。
  • 发送同步命令,命令末尾需包含 ;*OPC。命令执行完成后,VISA 会回调您注册的函数。

优点:

  • 您可以同时执行其他任务。
  • 非常适合多线程应用程序。

缺点:

  • 实现过程更加复杂。
  • RawSocket 和串行连接不支持。
  • 不支持在 LabVIEW 和 MATLAB 中使用。

直接 SCPI 命令示例

上文中使用 *OPC? 查询同步方法的测量任务示例,包括:

  • STB 轮询同步
  • 等待服务请求同步
  • 服务请求事件同步(Python、C# 和 LabWindows/CVI 环境)

仪器驱动程序示例

上文中的测量任务示例:

其他资源

有关测量同步的更多信息,可以参阅以下应用指南:

请求信息

如果您有任何疑问或需要了解更多信息,请填写此表格,我们会尽快回复您。

推广许可

你的申请已提交,我们稍后会联系您。
An error is occurred, please try it again later.