[uquote="khach",url="/forum/viewtopic.php?p=2957727#p2957727"]Соединить можно, т.к GPIB шина с ОК (открытым коллектором) но работать конечно не будет. На шине будут два контроллера с адресом 0 (ноль). Талкер и листнер- это состояния устройств на шине, кто "говорит" и кто "слушает". А нужен "BUS ANALYZER" - полный захват протокола с софтом для визуализации. Такое умели только оригинальные карты NI с опцией плюс.[/uquote]
Подошло оборудование, обновляю тему.
Прослушал анализатором, что идет по GPIB при работе "родной" системы с Labspec, постарался всё максимально точно воспроизвести средствами C# + USB-GPIB-HS+.
Удалось заставить двигаться только один двигатель из двух, позицию "Спектрографа" выставляет корректно.
При этом позиция "Монохроматора" считывается также корректно, но изменить её не получается.
По командам системы симметрично устроены, не понятно, почему с одним получается, а с другим нет.
Как ни бьюсь, ничего не получается, помогите пожалуйста.
*****************************
Ниже в приложении архив с результатами прослушивания, моей программой и фрагментом исходного кода на С++ библиотеки, в которой описано управление этими двигателями (прислана наследником Dilor'а Хорибой; библиотека для Labspec 4, судя по анализу разных версий Labspec, тогда как мы используем Labspec 2). Констант в коде не было, взяты из дезассемблирования ближайшей dll, проверены по логу общения Labspec 2.
Заставить работать другие версии Labspec не получилось.
Структура команд:
1) Движение 1 оси (foremonochromator): команды "?_+", затем "@" (либо вместе всё слать, без разницы) + данные { 97, <скорость>, 131, <направление> }
<Скорость>: байт от 0x0C до 0x3E (соответствует от 1 до 4000 см-1/мин, как я понимаю).
<Направление>: 0x88 (назад), 0x98 (вперед), 0x88 + 0x28 (стоп при движении назад), 0x98 + 0x28 (стоп при движении вперед).
После этого отсылается команда "?_", значения её не знаю.
Позиция для движения, как и позиция, которая считывается - величина относительных обратных см (relative cm^-1) относительно некой точки, которую определяем как "0". Это значение хранится в файлах Labspec, также оно хранится и выводится на дисплей консоли электроники Dilor. Его нужно вручную "синхронизировать", т.е. вбить в Labspec значение с дисплея Dilor. В общении по шине GPIB участвуют только относительные обратные см. Референсный "0" для оси 1 и 2 в общем случае разный.
2) Движение 2 оси (spectrograph): команды "?_,@" / "?_," + "@". Далее 4 байта данных о параметрах движения (те же).
3) Считывание позиции: для "монохроматора" "_?K ", будут непрерывно отсылаться данные о положении, пока не будет отправлена команда "_?".
Для "спектрографа": "_?L " + "_?".
*****************************
Ссылка на архив:
https://cloud.mail.ru/public/29KP/jbkHyk1d6
Структура:
В папке "caps" лежат результаты прослушивания анализатором, old - от родного Labspec, new - результат работы моей программы. base - краткий лог (Data Transfers, Command Transfers), ext - развернутый (+ Control Line Transitions, Handshake Line Transitions, Parallel Poll Responses).
*cap - файлы логов Анализатора из пакета NI-488.2 18.5.
*txt - результат экспорта логов в текстовый формат.
Папка "С++" - фрагмент исходного кода библиотеки, в которой находится управление движками дифракционных решеток.
Папка "qbasic_code" - основной исходный код версии программы на quick basic'е (скорее всего на нём) для дос, там есть минимум одно несоответствие работе актуальной системы - пересчет байтов в текущие величины относительных обратных сантиметров не корректен, корректен тот, что в файле в папке "С++". На досовской программе мы не работали.
Папка "Dilor Control" - моя программа на C#.
*****************************
Помогите, пожалуйста.
Добавлено after 37 minutes 18 seconds:
Использование метода Board.ClearRemoteEnableLine() приводит к выводу следующей информации на шину:
?_(0x20) ?_(0x21) <...> ?_(0x3e)
? _?(0x21) ? _?(0x22) <...> _?(0x3e) ?
Это при включенном анализаторе, когда на шине много слушателей, иначе их штук 6-~10, я не понял логики, когда сколько.
Группирование байт: ?_X + ? + ?_X ...
Использование метода Board.ConfigureWrite(listener) выводит:
(0x14) (0x14) (0x40) (0x3f) (0x21) (0x22) <...> (0x3e)
байты идут с минимальной задержкой (единым пакетам или как это корректно назвать).
0x20 ÷ 0x3e соответствует количеству слушателей на шине, их такое количество, только если включен анализатор, иначе 6-~10.
Но этого "мусора" нет при работе исходной программы. При старте она считывает положение активной оси (если последний раз было выбрано движение одной оси) или обеих (если последний раз одновременно двигались обе оси).
В методе Init(byte BoardID, byte PrimaryAddress) для конструктора я попробовал ограничиться вызовом только этих функций (теперь этот "мусор" вообще не поступает на шину):
int GPIB_board_index = BoardID; //GPIB0
GPIB0_Board = new NationalInstruments.NI4882.Board(GPIB_board_index);
GPIB0_Board.SendInterfaceClear(); //без него у меня не входит в CIC
GPIB0_Board.BusTiming = BusTimingType.Normal;
При этом я включаю электронику Dilor после вызова Board.SendInterfaceClear() - останавливаю программу на строчке Board.BusTiming = <...>, перезапускаю Dilor. При этом анализатор не выводит весь этот "мусор" ? _?X и прочий.
Но результат тот же, могу только считать позицию оси 1, двигаю и считываю позицию оси 2 без проблем.
Также я пытался использовать Board.ConfigureWrite(listener) и то, что "+" = 0x2b, "," = 0x2c, "K" = 0x4b, "L" = 0x4c, но это пока ни к чему не привело, либо я делал это неправильно.