c - 将 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
中,它来自ieeewt
C 代码第一块中的函数。但是,我很难找到与ieeescnf
LabVIEW 中等效的函数。
我第一次运行 .vi 时,它会返回正确的电压读数,然后在第二次运行时返回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/
戳尚未正确处理的设备时,响应时间可变是完全正常的。不要忘记在使用测试命令探测电压表之间重置电压表,因为错误可能会遗留下来。
推荐阅读
- javascript - 需要选择一个带有钩子的输入名称
- arrays - Firestore 无法使用 FieldValue.arrayUnion() 将项目数组合并到另一个数组
- r - 使用 xl.get.excel() 获取正在运行的 excel 实例
- angularjs - 填充 Angular 项目的 lib 文件夹
- angular - 根据另一个属性修改可观察对象中每个发出的值的属性
- android - 如何为 Nativescript 捆绑运行 android
- c# - Identity Server 4 扩展身份验证会话
- python - Django的xadmin运行错误
- javascript - Node.js puppeteer mysql - 使用 mysql 在循环内的数据库中插入获取的值
- xslt - 固定数量空格的 XSLT 格式编号