将 IEEE read/write 从 C 语言转换为 LabVIEW
Convert IEEE read/write from C to 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 在设定的积分时间 Dvmtime
内读取 volt
。
我尝试了以下 LabVIEW 代码,其中一部分来自控制 Solartron 7061 万用表的 .vi。在此代码中,我发送 D3F1MOR3
,它来自 C 代码第一块中的 ieeewt
函数。但是,我在 LabVIEW 中找不到等同于 ieeescnf
的函数。
我第一次 运行 .vi 它 returns 正确的电压读数,然后它 returns 0
在第二个 运行 和第三个很大运行。此外,每个 运行 所需的时间差异很大。
任何帮助将不胜感激,因为我不确定这段 C 代码在每个阶段都在做什么。
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/
在戳动尚未正确处理的设备时,响应时间不定是完全正常的。不要忘记在使用测试命令探测电压表之间重置电压表,因为错误可能会被遗留。
您正在与之通信的仪器似乎支持 SCPI(纯英语命令),这对事情有很大帮助。
首先要尝试进入 NI MAX(Measumrement and Automation Explorer)并简单地键入您希望发送到交互式通信控件中的命令。比在软件中调试容易得多,而且您可以弄清楚要使用的终止字符以及仪器如何响应您的查询等事情。另一种深入了解的方法是使用 NI I/O Trace 嗅探出原始程序发出的 GPIB 调用,并以这种方式完全破译协议。
其次,如果您找不到设备的文档,请根据您的调试编写您自己的通信规范 - 列出您打算发送的所有命令、您期望返回的所有响应以及所需的时间。
第三,在LabVIEW中实现通信。我强烈建议使用 NI-VISA 而不是低级 GPIB 调用 - NI-VISA 抽象出物理接口,对于 IEEE 仪器来说它非常简单。基本流程:VISA Open(初始化)-> VISA Read/VISA 按需写入(主程序循环)-> VISA Close(关闭时清理)。
我认为您在没有完全理解实现的情况下直接钻研编码有点本末倒置。
我正在尝试通过 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 在设定的积分时间 Dvmtime
内读取 volt
。
我尝试了以下 LabVIEW 代码,其中一部分来自控制 Solartron 7061 万用表的 .vi。在此代码中,我发送 D3F1MOR3
,它来自 C 代码第一块中的 ieeewt
函数。但是,我在 LabVIEW 中找不到等同于 ieeescnf
的函数。
我第一次 运行 .vi 它 returns 正确的电压读数,然后它 returns 0
在第二个 运行 和第三个很大运行。此外,每个 运行 所需的时间差异很大。
任何帮助将不胜感激,因为我不确定这段 C 代码在每个阶段都在做什么。
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/
在戳动尚未正确处理的设备时,响应时间不定是完全正常的。不要忘记在使用测试命令探测电压表之间重置电压表,因为错误可能会被遗留。
您正在与之通信的仪器似乎支持 SCPI(纯英语命令),这对事情有很大帮助。
首先要尝试进入 NI MAX(Measumrement and Automation Explorer)并简单地键入您希望发送到交互式通信控件中的命令。比在软件中调试容易得多,而且您可以弄清楚要使用的终止字符以及仪器如何响应您的查询等事情。另一种深入了解的方法是使用 NI I/O Trace 嗅探出原始程序发出的 GPIB 调用,并以这种方式完全破译协议。
其次,如果您找不到设备的文档,请根据您的调试编写您自己的通信规范 - 列出您打算发送的所有命令、您期望返回的所有响应以及所需的时间。
第三,在LabVIEW中实现通信。我强烈建议使用 NI-VISA 而不是低级 GPIB 调用 - NI-VISA 抽象出物理接口,对于 IEEE 仪器来说它非常简单。基本流程:VISA Open(初始化)-> VISA Read/VISA 按需写入(主程序循环)-> VISA Close(关闭时清理)。
我认为您在没有完全理解实现的情况下直接钻研编码有点本末倒置。