首页 > 解决方案 > 将 IEEE 读/写从 C 转换为 LabVIEW

问题描述

我正在尝试通过 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

标签: clabviewieeegpib

解决方案


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/

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


推荐阅读