1

我正在尝试通过 LabVIEW 中的 IEEE 与 Solartron 7060 电压表进行通信。我必须转换一些最初用于通信的旧 C 代码,但无法找到从 Solartron 获取主要数据的方法。

这是C代码:

#include "ieeeio.h"
#include <stdio.h>

double DATDVM(int dvmtime,int lasttime)
{
  float value;
  double Volt,volt;
  int j,response=0;

    if (lasttime!=dvmtime)
    {
      if (dvmtime<1)
      {
    if (ieeewt("clear 16\n")==-1) IEEEERR();
    if (ieeewt("abort\n")==-1) IEEEERR();
    if (ieeewt("output 16;D2F1M0R3\n")==-1) IEEEERR();
      }
      else
      {
    if (ieeewt("clear 16\n")==-1) IEEEERR();
    if (ieeewt("abort\n")==-1)  IEEEERR();
    if (ieeewt("output 16;D3F1M0R3\n")==-1)  IEEEERR();
      }
    }
    if (dvmtime<1)
    {
      if (ieeewt("abort\n")==-1)  IEEEERR();
      if (ieeewt("output 16;G\n")==-1)  IEEEERR();
      while (response != 24)
      {
    delay(50);
    if (ieeewt("spoll 16\n")==-1)  IEEEERR();
    if (ieeescnf("%d",&response)==-1) IEEEERR();
      }
      response=0;
      if (ieeewt("enter 16\n")==-1) IEEEERR();
      if (ieeescnf("%*5s%e",&value)==-1) IEEEERR();
      Volt=value;
    }
    else
    {
      volt=0;
      for (j=0; j<dvmtime; j++)
      {
    if (ieeewt("abort\n")==-1) IEEEERR();
    if (ieeewt("output 16;G\n")==-1) IEEEERR();
    while (response != 24)
    {
       delay(50);
       if (ieeewt("spoll 16\n")==-1) IEEEERR();
       if (ieeescnf("%d",&response)==-1) IEEEERR();
    }
    response=0;
    if (ieeewt("enter 16\n")==-1) IEEEERR();
    if (ieeescnf("%*5s%e",&value)==-1) IEEEERR();
    volt+=value;
      }
      Volt=volt/dvmtime;
    }
    return(Volt);
}

dvmtime此代码在以秒为单位的某个积分时间内对直流电压(来自静电计检测到的旧质谱仪上的法拉第检测器)进行采样。以便告诉 7060 DVM 在volt设定的积分时间内读取读数Dvmtime

我尝试了以下 LabVIEW 代码,其中一部分来自控制 Solartron 7061 万用表的 .vi。在我发送的这段代码D3F1MOR3中,它来自ieeewtC 代码第一块中的函数。但是,我很难找到与ieeescnfLabVIEW 中等效的函数。

我第一次运行 .vi 时,它会返回正确的电压读数,然后在第二次运行时返回0,在第三次运行时返回大量数据。此外,每次运行所需的时间也有很大差异。

任何帮助将不胜感激,因为我不确定这个 C 代码在每个阶段都在做什么。

到目前为止我尝试过的LabVIEW .vi

4

2 回答 2

1

ieeescnf() 似乎是一个读取 GPIB + scAnf() 函数,GPIB 读取应该可以完成这项工作。

您可能想看看 ScanFromString 和 FormatIntoString 函数 - LabVIEW 格式字符串不同于 C:

https://zone.ni.com/reference/en-XX/help/371361R-01/glang/scan_from_string/

https://zone.ni.com/reference/en-XX/help/371361R-01/glang/format_into_string/

查看 LabVIEW GPIB 文档,您似乎没有使用正确的终端模式。ieeewt 中的 '\n' 终止符应对应于写入模式 2 或 5,假设您的 C 库不附加其他字符:

http://zone.ni.com/reference/en-XX/help/371361R-01/lvinstio/gpib_write/

戳尚未正确处理的设备时,响应时间可变是完全正常的。不要忘记在使用测试命令探测电压表之间重置电压表,因为错误可能会遗留下来。

于 2019-12-01T23:36:21.830 回答
0

您正在与之通信的仪器似乎支持 SCPI(纯英语命令),这对事情有很大帮助。

首先要尝试的是进入 NI MAX(测量和自动化资源管理器)并简单地键入您希望发送到交互式通信控件的命令。比在软件中调试要容易得多,而且您可以弄清楚要使用哪些终止字符以及仪器如何响应您的查询。另一种获得洞察力的方法是使用 NI I/O Trace 来嗅探原始程序发出的 GPIB 调用,并以这种方式完全破译协议。

其次,如果您找不到该设备的文档,请根据您的调试编写您自己的通信规范 - 列出您打算发送的所有命令、您期望返回的所有响应以及所需的时间。

第三,在LabVIEW中实现通信。我强烈建议使用 NI-VISA 而不是低级 GPIB 调用——NI-VISA 抽象出物理接口,对于 IEEE 仪器来说它非常简单。基本流程:VISA Open(初始化)-> VISA Read/VISA Write as required(主程序循环)-> VISA Close(关闭时清理)。

我认为您在不完全理解实现的情况下直接潜入编码中,有点本末倒置。

于 2019-12-06T15:59:13.253 回答