我目前正在尝试与仅使用打包 BCD 数字的旧仪器进行通信(如果有人熟悉,它是 Varian FR41 控制器高斯计)。我正在使用 LabVIEW 来复制一些输出 BCD 代码的旧 C 代码。下面是 C 脚本。它所做的是一些简单的算法来生成整数,这些整数通过 IEEE 端口使用%c
.
#include "ieeeio.h"
#include <math.h>
#include <stdio.h>
main()
{
long temp;
int z1,z2,z3,z4,b1,b2,b3;
float b;
double gauss,hv=5000.,magconst=.069,Mass=87.;
if (ieeeinit()==-1)
{
printf("Cannot initialize IEEE system.\n");
exit(1);
}
gauss=sqrt(Mass*hv/magconst);
temp=10*gauss;
b=temp/10.;
z1=b/1000;
z2=b/100;
z3=b/10;
z4=b;
printf("\n\r %f %f %d %d %d %d",gauss,b,z1,z2,z3,z4);
b1=z2+z1*6;
b2=z4+6*z3-160*z2;
b3=(b-z4)*160+14;
printf("\n\r %d %d %d %d",7,b1,b2,b3);
ieeewt("output 08;");
ieeeprtf("%c%c%c%c\n",7,b1,b2,b3);
}
我生成了一个.VI,它生成相同的数字b1,b2,b3
并将它们放入一串打包的 BCD 数字中。使用上面的输入变量HV,magconst,mass
,输出应该是2510.8
高斯。和b1,b2,b3
分别是142,37,16
。
现在看看瓦里安高斯计想要什么。这是描述仪器如何接收信息的文本(并非所有这些都是有用的,但为了完整起见,我复制了它)。我还附上了一张显示 BCD 格式的示意图。
数据以三个 8 位字节的序列传输到 FR-41。每个字节分为两个半字节,hi 和 lo,它们可能只包含 BCD 数字。当使用辅助输出端口时,将第四个字节(任何二进制数)添加到序列的开头。发送的最后一个字符在高字节位置包含新高斯设置的最低有效位 (LSD),在低字节中包含加载控制非 BCD 字符 (bin 14),它被解释为用新数据加载所有寄存器。lo 字节的一位控制使用时的 10 kGauss 超量程。在接收到控制字之前不会更改设置。
所以,如果我在C
上面的代码中正确理解了这一点,添加的第一个字节(辅助输出端口的东西)似乎是 7,它应该是0000 0111
BCD。后面的字节,要写入 2510.8,后面应该0010 0101 0001 0000 1000
跟着1110
(对于 bin 14 控制字)。
这就是我所做的。使用附加的 .VI,我可以重现我期望的 32 位 BCD 字符串。我将它发送到 LabVIEW 中的 GPIB Send Message VI(我也尝试过使用 VISA Write,但据我所知,它在所有测试中执行完全相同的操作)。然而,仪器没有记录任何发生的事情。
有趣的是,当我将信息作为%f
浮点数的字符串发送给仪器时7.0000142.00037.00016.000
,仪器会记录正在发生的事情,并且数十位和数百位发生了变化。因此,如果我42
以浮点形式发送,仪器将进入 X4X2.X 高斯设置。如果我把142
它做同样的事情。如果我把17
它转到 X1X7.X 设置。如果我发送它,17
那么25
它只会占用第一个。
我的想法是 GPIB Send 或 VISA Write 中的某些内容正在获取我的 BCD 数字字符串并将它们作为其他内容发送出去,但我无法弄清楚我可能做错了什么。任何帮助或测试将不胜感激;我已经为此苦苦挣扎了几个星期,但无济于事。