【问题标题】:LabVIEW and Keithley 2635A - Unable to read dataLabVIEW 和 Keithley 2635A - 无法读取数据
【发布时间】:2017-03-06 14:04:36
【问题描述】:

我正在使用 LabVIEW 及其 VISA 功能来控制 Keithley 2635A 源表。每当我尝试识别设备时,它都能正常工作,无论是读写。

viWRITE(*IDN?) /* VISA subVI to send the command to the machine */
viREAD /* VISA subVI to read output */

但是,只要我设置了电压(或电流),它就会这样做。然后我发送命令执行测量,但我无法读取该数据,出现错误

VISA:  (Hex 0xBFFF0015) Timeout expired before operation completed.

在那之后,我也无法再读取*IDN? 的输出了。

源表通过 National Instrument GPIB-USB-HS 适配器连接到 PC。

编辑:我忘了补充,这也发生在 VISA 交互控制程序中。

【问题讨论】:

  • 提示:发送命令或查询时一定要注意前面板,看看是否有错误。另外,您说的是“设置”,然后是“阅读”。 “设置”(命令)不一定会导致响应。检查文档。

标签: timeout labview visa gpib


【解决方案1】:

好的,显然文档不是很清楚。 smua.measure.X()(X 是需要的参数)命令所做的当然是将测量结果写入缓冲区。然而,为了读取该缓冲区,简单的viREAD[] 是不够的。

所以基本上答案是简单地添加一个print 命令:这样我就有了

viWRITE[print(smua.measure.X())];
viREAD[]

而且我不再有错误了。不知道为什么需要这样的命令,但就是这样。谢谢大家花时间回复我。

【讨论】:

  • SMU 确实有一个测量缓冲区,但我不确定smua.measure.X() 会导致写入它。但关键是它不会写入输出(通信)缓冲区,因此 viREAD 什么也得不到并超时。顺便说一句——语言是 Lua,print 是一个标准的 Lua 函数,他们已经连接到输出缓冲区。
  • @TomBlodget 太好了,感谢您的澄清。我认为smua.measure.X() 实际上是在缓冲区上写的,至少文档是这么说的。
  • 感谢您在弄清楚后发布您的答案!您可以编辑答案以包含文档链接吗?
  • 其实我用的是源表附带的PDF手册,不知道在哪里找。
【解决方案2】:

正如@Tom Blodget 在 cmets 中提到的那样,设置电压后机器可能没有任何读取响应。 *IDN? 字符串是命令和查询。也就是说,您将写入命令*IDN? 并读取结果。某些命令对读取没有任何响应。这是一个快速测试,看看您是否应该从仪器上读取数据。以下代码在python中;我编写了GPIB命令来设置电压。

sm = SourceMonitor()
# Prints out IDN    
sm.query('*IDN?')

# Prints out current voltage (change this to your actual command)
sm.query('SOUR:VOLT?')

# Set a new voltage
sm.write('SOUR:VOLT 1V')

# Read the new voltage
sm.query('SOUR:VOLT?')

请注意,带问号的 GPIB 命令和query 在您希望从仪器获得响应时使用。仪器不会响应write 命令。查询是write(...) 和read(...) 的组合。如果您使用的是 LabView,则可能需要分别编写写入和读取。

如果您需要验证机器是否收到了您的指令并采取了行动,大多数仪器都有以下常用命令:

  • *OPC?查询操作是否完成
  • SYST:ERR? 查询是否产生任何错误
  • 在用于设置电压的GPIB命令末尾添加问号?

【讨论】:

  • 我应该更清楚,抱歉。我的意思是,在我发送设置电压的命令后,我发送另一个write 命令来请求测量,然后使用read 检索该测量结果。至于*IDN?命令,当我发送到机器没有反馈时,我还是要发送read信号。我也会在帖子中编辑它。
  • 我明白了...如果您的数据集很大,从仪器中读取可能需要很长时间。对于我的一些 GPIB 连接,我需要在读取测试结果时指定更长的超时值。你能发布一组最小的命令(带有电压和*IDN?),给你超时错误吗?
  • 命令集本身实际上非常基本。分别调用viWRITE和viREAD来读写VISA子VI,将输入的字符串放在方括号中,我的VI是viWRITE[*IDN?]; viREAD[]; viWRITE[smua.output.levelv = 0.1]; viWRITE[smua.measure.v()]; viREAD[]。超时发生在最后一个读取命令处。读取命令都被提供了足够大的缓冲区
  • 是的,你的命令对我来说也很好。您知道读取命令的超时长度是多少吗?即使缓冲区很大,如果没有足够的时间通过 GPIB 总线读取数据,读取也会失败。
  • 发现问题。显然,它只是缺少print 命令。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多