如果我引诱您进入使用 pyvisa 的 SCPI 自动化领域以充分利用您的测试设备,那么您迟早可能会陷入某种情况,即某些东西不起作用,并且您不知道为什么。或者,也许,您处于某种情况,某些东西确实有效,但您不知道为什么。调试 SCPI 自动化可能有点困难,但您可以采取一些措施来让您的生活更轻松。
你好仪器?你在那里吗?
初学者的一个常见陷阱是在第一步(与乐器建立通信)时失败。调试这些问题可能相当简单,但需要有条不紊的方法。当您发现看不到您的仪器尝试执行 list_resources() 调用,或者您在 *IDN? 的超时时没有得到响应/失败时,需要检查一些事项。
我喜欢先从仪器开始------检查它是否是 SCPI 可编程的,然后导航其设置菜单,以确保选择并正确配置所需的接口类型。这对于每个乐器来说都是不同的,但大多数乐器通常只允许一种类型的接口在任何时候处于活动状态,即使有几种。一些仪器还允许您的接口在模式之间切换 - 例如模拟 COM 端口的 USB-CDC,或充当 USB488 测试和测量类设备的 USB-TMC。
对于 USB,如果您可以选择,使用 USB-TMC 可能是更好的选择,因为您打算将其与 VISA 层一起使用,因为它可以模拟 GPIB 状态行,而 USB-CDC 对于那些想要使用串行库编写程序的人来说更容易使用,但也可以与 VISA 层一起使用,但有一些限制。
对于以太网,请确保您已为您的网络设置了适当的寻址模式 - DHCP 将自动配置来自 DHCP 服务器的地址,该地址可能会随着时间的推移而更改。静态 IP 寻址设置一个固定地址,但您应该确保选择的地址不会与网络上的任何其他节点冲突。
检查此选项后,您应该检查物理链路是否正常运行。对于 USB,这可以通过观看设备管理器 (在 Windows 下)或 lsusb 或 dmesg (在 Linux 下)的结果来完成。在 Windows 下,您的设备应显示在单独的 USB 测试和测量设备部分 中,并显示为 USB 测试和测量设备 (IVI)。

对于USB-TMC设备,无需安装任何驱动程序或构建任何驱动程序,因为NI-VISA安装程序中捆绑的IVI Foundation驱动程序应该会选择硬件。请勿将NI驱动程序向导用于USB-TMC设备,因为您可能会引起驱动程序冲突!
如果您发现您的设备被检测为未知设备,或者带有黄色感叹号,则您可能存在硬件兼容性问题或驱动程序问题。尝试更换 USB 电缆、USB 端口和计算机,看看这是否会发生任何变化。避免使用集线器,尤其是低成本集线器,因为它们可能会导致问题或对外部电磁干扰敏感。尝试更新您的 USB 控制器驱动程序 - 也可能是您的设备可能不喜欢特定的 USB 控制器。最后,我遇到过一些问题,这是由于一台计算机上多个冲突的 VISA 安装造成的------在这种情况下,卸载 NI-VISA、重新启动并重新安装最新版本的 NI-VISA 通常可以解决此问题。
在 Linux 下,您应该在 lsusb 下看到一个新设备。如果没有,请查阅 dmesg ,以获取有关是否检测到设备或枚举期间是否发生错误的进一步提示。如果出现此问题,建议执行类似的故障排除步骤。由于用于 pyvisa-py 的驱动程序是用户空间,因此不需要对 USB-TMC 的内核支持 - 只需确保您安装了 pyusb。
对于以太网,这可以在交换机或仪器上的链路指示灯中看到,并且可以通过检查仪器是否收到 IP 地址来验证。您通常还可以在网络浏览器中访问 IP 地址以确认它是否在网络上 - 如果成功,您就可以继续前进了。
现在检测到硬件,您应该能够与设备通信------在使用 NI-VISA 的 Windows 上,通过调用 NI MAX 检查设备可以轻松检查:

单击设备和 VISA 测试面板,然后选择输入/输出,您可以交互方式发送和接收命令以检查通信。

我不知道 Linux 的直接等价物,但是,应该可以直接转到 Python 并使用以下方法从那里列出设备:
import pyvisa
rm = pyvisa.ResourceManager()
rm.list_resources()
如果您在 Linux 下没有收到任何输出,请确保您安装了 pyvisa-py 和 pyusb,并尝试以 root 用户身份调用 Python,因为您的用户帐户可能没有足够的权限来访问 USB 设备。
从那里,您应该能够使用一个短程序来验证仪器的作,该程序读取仪器的身份并将其打印出来:
import pyvisa
rm = pyvisa.ResourceManager()
instrument = resource_manager.open_resource("RESOURCESTRING")
print(instrument.query("*IDN?")
通常,对于通过 USB/VXI-11/HiSLIP 的仪器,这将起作用。对于通过 TCP/IP 套接字和串行连接连接的仪器以及一些繁琐的仪器,您需要配置终端字符。
对于 TCP/IP 套接字,通常添加 *instrument.read_termination="\n"*就足够了,因为这会告诉 VISA 何时停止读取 - 否则它会等待更多信息,直到超时(默认情况下,两秒钟后)。
有些乐器可能需要同时设置read_termination 和query_termination ,而其他乐器可能需要设置read_termination 和write_termination ,因此通常需要进行实验(或检查手册)以找出适合您的乐器的设置。虽然*'\n'* (换行符) 是最常见的终止,但有些工具可能需要*'\r'* (回车符) 或*'\r\n'* 的组合。
一旦你达到这个阶段,你肯定已经准备好编写更复杂的程序了,但这通常会让你相对较快地陷入一些更深的麻烦。
跟踪执行
假设您现在有一个 pyvisa 程序,事情不可避免地会在某个时候出错,并且由于某种原因,您的脚本可能会失败并出现异常,或者仪器可能会发出哔哔声,表明发生了 SCPI 错误,但实际上发生了什么?很多时候,很难找出答案,尤其是当程序在出现错误之前已经运行了数小时甚至数天时。
要以跨平台的方式深入了解这一点,可能只是修改 您的程序,以便您可以跟踪其执行。这可能涉及将任何写入 和查询 函数替换为您自己的函数,该函数不仅执行函数,而且记录 执行的函数。为此,可以使用 Python 日志记录模块,它将提供便利,例如漂亮的日期/时间戳,能够将输出定向到 STDERR 和日志文件,以及通过设置日志记录级别来抑制打印的能力。
跟踪仪器发送的命令和查询结果绝对有帮助,但有时,这可能会产生误导。这部分是由于 SCPI 命令的性质------写入不需要响应 ,因此在您点击查询 之前,您真的不知道仪器是否在命令上遇到了错误或失败。因此,使用 SYST:ERR 检查错误队列也是一种很好的做法(尽管在普通情况下可能有点矫枉过正?查询。 这将返回一个双元素数组,其中包含错误编号 和描述错误的错误字符串。描述并不总是那么有用,但更现代的设备往往在错误方面更具描述性,有时甚至包括有问题的命令。
负错误代码由 SCPI 标准化,而正错误代码取决于供应商。因此,参考仪器的手册和/或返回的错误文本字符串将是最准确的。
我拥有的设备示例如下所示 --
是德科技 E36103A PSU
-440,"Query UNTERMINATED after indefinite response"
-430,"Query DEADLOCKED"
-420,"Query UNTERMINATED"
-410,"Query INTERRUPTED"
-400,"Query error"
-363,"Input buffer overrun"
-350,"Queue overflow"
-330,"Self-test failed"
-310,"System error"
-277,"Macro redefinition not allowed"
-276,"Macro recursion error"
-273,"Illegal macro label"
-272,"Macro execution error"
-270,"Macro error"
-241,"Hardware missing"
-230,"Data corrupt or stale"
-225,"Out of memory"
-224,"Illegal parameter value"
-223,"Too much data"
-222,"Data out of range"
-221,"Settings conflict"
-213,"Init ignored"
-211,"Trigger ignored"
-200,"Execution error"
-183,"Invalid inside macro definition"
-181,"Invalid outside macro definition"
-178,"Expression data not allowed"
-171,"Invalid expression"
-170,"Expression error"
-168,"Block data not allowed"
-161,"Invalid block data"
-158,"String data not allowed"
-151,"Invalid string data"
-150,"String data error"
-148,"Character data not allowed"
-141,"Invalid character data"
-138,"Suffix not allowed"
-134,"Suffix too long"
-131,"Invalid suffix"
-128,"Numeric data not allowed"
-124,"Too many digits"
-123,"Exponent too large"
-121,"Invalid character in number"
-114,"Header suffix out of range"
-113,"Undefined header"
-112,"Program mnemonic too long"
-109,"Missing parameter"
-108,"Parameter not allowed"
-105,"GET not allowed"
-104,"Data type error"
-103,"Invalid separator"
-102,"Syntax error"
-101,"Invalid character"
-100,"Command error"
514,"LAN config error"
561,"Analog board - failed to save to EEPROM"
564,"Analog board - failed to load from EEPROM"
565,"Analog board - over temperature"
566,"Analog board - command timed out"
601,"Front panel does not respond"
609,"System ADC test failed"
610,"I/O board not plugged in"
611,"Unsupported I/O board"
612,"Analog board does not respond"
613,"Analog bias output ±15V test failed"
614,"EEPROM test failed"
615,"EEPROM save failed"
616,"Model no mismatched"
630,"Fan test failed"
631,"System DAC test failed"
701,"Cal security disabled by jumper"
702,"Invalid state. Cal secured"
703,"Invalid secure code"
704,"Secure code too long"
708,"Cal output disabled"
717,"Cal OVP or OCP status enabled"
721,"Failed to calibrate voltage DAC"
722,"Failed to calibrate voltage ADC"
723,"Failed to calibrate OVP"
724,"Failed to calibrate current DAC"
725,"Failed to calibrate current ADC"
726,"Failed to calibrate OCP"
727,"Invalid Calibration sequence"
728,"Calibration failed"
吉时利 2110 型数字万用表
-101 Invalid character
-102 Syntax error
-103 Invalid separator
-104 Data type error
-105 GET not allowed
-108 Parameter not allowed
-109 Missing parameter
-112 Program mnemonic too long
-113 Undefined header
-121 Invalid character in number
-123 Numeric overflow
-124 Too many digits
-131 Invalid suffix
-138 Suffix not allowed
-148 Character not allowed
-151 Invalid string data
-158 String data not allowed
-160~-168 Block data errors
-170~-178 Expression errors
-211 Trigger ignored
-213 Init Ignored
-214 Trigger deadlock
-221 Settings conflict
-222 Data out of range
-223 Too much data
223 2nd function mismatch
-224 Illegal parameter value
225 Function/range mismatch
-230 Data Stale
-350 Too many errors
-410 Query INTERRUPTED
-420 Query UNTERMINATED
-430 Query DEADLOCKED
-440 Query UNTERMINATED after indefinite response
521 Input buffer overflow
522 Output buffer overflow
531 Insufficient memory
532 Cannot achieve requested resolution
540 Cannot use overload as math reference
550 Command not allowed in local
601 Front panel does not respond
602 RAM read/write failed
603 Front-End MCU does not respond
604 A/D noisy test failed
605 N2 calibration parameter failed
606 N3 calibration parameter failed
607 Buffer1 offset out of range
608 Buffer2 offset out of range
609 DC gain x1 failed
610 DC gain x10 failed
611 DC gain x100 failed
612 Ohms 500 nA source failed
613 Ohms 5 uA source failed
614 DC 1000V zero failed
615 Ohms 10 uA source failed
616 DC current sense failed
617 Ohms 100 uA source failed
618 DC high voltage attenuator failed
619 Ohms 1 mA source failed
620 AC rms zero failed
621 AC rms full scale failed
624 Unable to sense line frequency
640 Meas setting failed
641 Meas reading failed
642 Board Protect failed
650 Panel failed
651 Panel Program Checksum Error
罗德与施瓦茨 HMC8043/HMP4040 PSU
0, “No error“
-100, “Command error“
-102, “Syntax error“
-221, “Settings conflict“
-350, “Queue overflow“
B&K Precision 8600 型直流电子负载
101 DESIGN ERROR: Too many numeric suffices in Command Spec
110 No Input Command to parse
114 Numeric suffix is invalid value
120 Parameter of type Numeric Value overflowed its storage
130 Wrong units for parameter
140 Wrong type of parameter(s)
150 Wrong number of parameters
160 Unmatched quotation mark (single/double) in parameters
165 Unmatched bracket
170 Command keywords were not recognized
190 Too many dimensions in entry to be returned in parameters
191 Too many char
-200 Execution error [generic]
-221 Settings conflict [check current device state]
-222 Data out of range [e.g., too large for this device]
-223 Too much data [out of memory; block, string, or expression too long]
-224 Illegal parameter value [device-specific]
-225 Out of memory
-270 Macro error
-272 Macro execution error
-273 Illegal macro label
-276 Macro recursion error
-277 Macro redefinition not allowed
-310 System error [generic]
-350 Too many errors [errors beyond 9 lost due to queue overflow]
-400 Query error [generic]
-410 Query INTERRUPTED [query followed by DAB or GET before response complete]
-420 Query UNTERMINATED [addressed to talk, incomplete programming message received]
-430 Query DEADLOCKED [too many queries in command string]
-440 Query UNTERMINATED [after indefinite response]
0 No error
1 Module Initialization Lost
2 Mainframe Initialization Lost
3 Module Calibration Lost
4 Non-volatile RAM STATE section checksum failed
5 Non-volatile RAM RST section checksum failed
10 RAM selftest
11 CVDAC selftest 1
12 CVDAC selftest 2
13 CCDAC selftest 1
14 CCDAC selftest 2
15 CRDAC selftest 1
16 CRDAC selftest 2
20 Input Down
40 Flash write failed
41 Flash erase failed
80 Digital I/O selftest error
213 RS-232 buffer overrun error
216 RS-232 receiver framing error
217 RS-232 receiver parity error
218 RS-232 receiver overrun error
220 Front panel UART overrun
221 Front panel UART framing
222 Front panel UART parity
223 Front panel buffer overrun
224 Front panel timeout
225 Front CRC check error
226 Front cmd Error
401 CAL switch prevents calibration
402 CAL password is incorrect
403 CAL not enabled
404 Computed readback cal constants are incorrect
405 Computed programming cal constants are incorrect
406 Incorrect sequence of calibration commands
407 CV or CC status is incorrect for this command
603 FETCH of data that was not acquired
604 Measurement overrange
如果几乎消除了所有其他原因,则永远不要忽视瞬态连接故障、内存损坏或仪器固件错误可能导致难以复制的问题的可能性。有时这些问题需要"解决",因此编写一些恢复代码,首先重试命令,如果失败,关闭仪器,尝试重新打开并重新配置它,可能是更好的选择。其他仪器可能需要重新启动电源才能重新获得控制,因此投资一些遥控交流插座可能会很方便。无论如何,您需要使用您的乐器一段时间才能了解它的怪癖和特质。
带上大炮
虽然上述方法绝对是详尽且跨平台的,但有时您希望在不修改程序的情况下快速获得答案。如果您的程序在串行连接上工作,也许您可以使用协议嗅探器。如果您的仪器通过以太网连接,数据包嗅探器也可以工作。但这些工具是更通用的工具,不一定是为调试 SCPI 程序而定制的。
输入NI I/O跟踪工具,NI-VISA用户可以使用该工具来诊断与NI-VISA和IVI驱动程序交互的程序。

这类似于网络嗅探工具,只是它嗅探对 NI-VISA 和 IVI 驱动程序的调用。乍一看,它似乎有点过时,用户界面非常简单,但功能非常强大。默认情况下,配置有点限制,所以也许进行一些更改是件好事。


第一个变化可能只是将呼叫历史深度增加到更大的水平------这样,如果您的程序非常频繁地与仪器交互,您可以在屏幕上显示大量有意义的数据。日志记录选项卡可能是最重要的 更改 - 启用日志到文件至关重要,因为这将允许运行呼叫日志,即使它超过呼叫历史深度。这样,您可以在结束捕获后重新加载此文件,并浏览比屏幕上显示的更多的历史记录。将文件类型保留为跟踪文件可为您提供最大的灵活性,但文本和 XML 也可用。


视图选择允许您禁用您不感兴趣的各种 API。此外,它还允许您添加额外的列------如果您同时运行多个 VISA 程序,则拥有 ProcessID 和 ThreadID 列可以帮助您分离每个程序进行的调用。"错误作"选项卡还可以在发生错误时采取自动作来提供帮助。通常,您对何时发生错误感兴趣,因此您可能想要暂停或停止捕获 - 但您不必这样做,尤其是在您记录到文件时。错误通常用红色表示,因此您不会错过它们。
设置完成后,您可以单击绿色箭头按钮以启用捕获、运行程序并观看屏幕充满 VISA 呼叫。不幸的是,不可打印的字符似乎被 '.' 字符取代,所以如果事情看起来有点奇怪,请不要感到惊讶,但记录的参数通常还包括一个字节计数,以指示发送或接收了多少数据。希望这能让您了解您的程序正在发生的事情。
示例跟踪 -- Keithley Kickstart
使用NI I/O Trace的最大好处是可以在任何给定时间检查通过VISA发生的情况,这包括运行供应商提供的软件。这意味着您可以了解供应商的软件如何执行某些作,这可能会非常有启发性,特别是如果供应商的软件有点有限,但可以完成您想要的大部分作,并且您希望编写更适合您需求的东西。
出于方便起见,我决定在 Keithley Kickstart 2 进行 I-V Characterizer 运行时检查它。值得注意的是,这不是 SCPI,因为它使用 TSP 语言,但概念非常相似。

NI I/O跟踪的格式如上所示------软件在运行前在SMU上设置参数,并在每个命令后检查错误。我突出显示的命令使用 smu.source.sweeplinear 命令来设置扫描。

当扫描运行时,软件似乎会检查 SMU 是否有错误、触发模型是否正在运行(即它是否仍在扫描)以及记录的点数方面的缓冲区状态。

该软件在扫描运行时"动态"创建一个绘图------这是如何发生的?好吧,似乎每隔一段时间,当缓冲区编号发生变化时,它就会在一系列 format.data 和 printbuffer 命令中检索缓冲区值。很酷!作为一个更习惯于 SCPI 而不是 TSP 的人,这很有启发性。
结论
让 SCPI 自动化正常工作可能有点挑战,但通过有条不紊的方法和在一些日志记录和错误队列检查中对编码的谨慎,可以使跟踪错误变得更容易一些。
但是,如果您不想遇到所有这些麻烦,使用NI I/O跟踪可能是一种"简单的出路",前提是您调整一些参数以确保您记录到文件,这样您就不会错过所有作。这几乎就像数据包嗅探器,但适用于 VISA/IVI 呼叫,允许您识别错误并浏览它们以发现导致错误的原因。
该工具相当简陋,但作为一个好处,它适用于所有通过NI-VISA或IVI驱动程序进行呼叫的软件,包括供应商软件。这使得检查和学习通常提供的"有限"启动软件成为可能,因此您可以构建更适合您需求的东西,而不必通过阅读编程手册"从头开始"做所有事情。它还可以帮助您识别编程方法的差异------比较方法通常可以帮助您确定某些东西有效或无效的原因!