В настоящее время я пытаюсь связаться со старым прибором, который использует только упакованные числа BCD (это гауссметр контроллера Varian FR41, если кто-то знаком). Я использую LabVIEW для репликации некоторого старого кода C, который выводит код BCD. Ниже приведен сценарий 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
gauss. и b1,b2,b3
равны 142,37,16
соответственно.
Теперь о том, чего хочет Varian Gaussmeter. Это текст, описывающий, как прибор получает информацию (не все это полезно, но для полноты картины копирую). Я также прилагаю изображение схемы, которая показывает формат BCD.
Данные передаются на FR-41 в виде последовательности из трех 8-битных байтов. Каждый байт делится на два полубайта, hi и lo, которые могут содержать только двоично-десятичные числа. Когда используется вспомогательный порт вывода, к началу последовательности добавляется четвертый байт (любое двоичное число). Последний отправленный символ содержит младшую значащую цифру (LSD) новой настройки Гаусса в старшем байте и недвоично-десятичный символ управления загрузкой (ячейка 14) в младшем байте, который интерпретируется как загружающий все регистры новыми данными. Один бит младшего байта при использовании управляет превышением диапазона 10 кГаусс. никакое изменение настройки не происходит до тех пор, пока не будет получено управляющее слово.
Итак, если я правильно понимаю это в приведенном выше коде C
, первый добавленный байт (вещь с вспомогательным выходным портом), кажется, равен 7, что должно быть 0000 0111
в BCD. Следующие байты для записи 2510.8 должны быть 0010 0101 0001 0000 1000
, за которыми следует 1110
(для контрольного слова ячейки 14).
Вот что я сделал. Используя прилагаемый .VI, я могу воспроизвести 32-битную строку BCD, которая, как я ожидаю, должна быть. Я отправляю это в ВП GPIB Send Message в LabVIEW (я также пытался использовать VISA Write, но, насколько я вижу, он делает то же самое во всех тестах). Однако прибор ничего не регистрирует.
Интересно то, что когда я отправляю прибору информацию в виде строки %f
с плавающей запятой, то есть 7.0000142.00037.00016.000
, прибор регистрирует что-то происходящее и меняются десятки и сотни разрядов. Итак, если я отправлю 42
в виде числа с плавающей запятой, прибор перейдет к настройке гаусса X4X2.X. Если я поставлю 142
, будет то же самое. Если я поставлю 17
, он перейдет к настройке X1X7.X. Если я отправлю 17
, то 25
будет принят только первый.
Я думаю, что что-то в GPIB Send или VISA Write берет мою строку чисел BCD и отправляет их как что-то еще, но я не могу понять, что я мог делать неправильно. Любая помощь или тесты будут высоко оценены; Я боролся с этим уже несколько недель, но безрезультатно.