Альтернатива VISA для работы с последовательным портом

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1936
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов
Благодарил (а): 3 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение Borjomy_1 »

Если вы о парсинге строки, то он выполняется при вызове VISA Read.
Это понятно, что при вызове. Непонятно, в какой момент строка поступает, при выполнении каких условий.

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

Куда поступает? Может, я не догоняю... ReadFile берёт строку из буфера драйвера порта (serial.sys на Windows), ниже уже просто ничего нет. А после этого строка лежит себе в оперативной памяти. С ней работают, как ни в чём ни бывало.

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1936
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов
Благодарил (а): 3 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение Borjomy_1 »

Объясню на пальцах...
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

Borjomy_1 писал(а):Объясню на пальцах...
В порт идет посылка. До начала посылки или во время передачи посылки вызывается VISA Read с приемом по терминальному байту и заказанным размером заведомо большим, чем посылка. В какой-то момент драйвер передает часть посылки наверх, где производится парсинг на терминальный байт. Он ведь не телепат и не знает, когда посылка закончится. Вопрос в том, как драйвер понимает, что надо строку отдать?
Я выполнял VISA Read, когда строка уже целиком лежала в буфере драйвера Windows. Делал так: взял два компа, соединил нуль-модемным кабелем, на одном запустил терминал, на другом программу в :labview: . В терминале печатал строку, в :labview: нажимал кнопку чтения VISA Read.

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1936
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов
Благодарил (а): 3 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение Borjomy_1 »

Ну это понятно. Когда все известно (в смысле, посылка уже есть), естественно, все просто выглядит. Самое интересное это реализация генерации события - и по принятому числу байт, по терминальному символу и таймауту. Сдается мне, что вычитка из буфера уже принятых данных (пусть даже с парсингом) и прием в реальном времени с контролем на размер буфера, терминальный символ и таймаут - это совершенно разные процедуры.

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

Ну, я думаю, делается так. Замеряется время перед чтением с помощью GetTickCount. Затем вызывается ReadFile в одном из двух режимов (синхронный/асинхронный). Замеряется время после вызова ReadFile или после вызова события. Анализируется разница времён относительно таймаута, в случае превышения пишется ошибка. Терминатор парсится в любом случае, раз это WinAPI. А размер буфера задаётся при инициализации порта (SetupComm).
Я проверял работу в синхронном режиме:
2015-09-16_16-23-14.jpg
2015-09-16_16-23-14.jpg (64.64 КБ) 16361 просмотр
В асинхронном будет вызываться viReadAsync, а не viRead. Документация на функции VISA лежит тут или тут, можете почитать. Если есть желание, ставьте бряк на функцию и смотрите, что там происходит. Мне пока не до этого...

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

Jakob Brontfeyn писал(а):Я с VISA никогда не работаю,
вот есть альтернативные VI
Прошу прощения за археологию, но на какой версии :labview: вы используете эти :vi: ? Если на 7.1 и более поздних, то тогда это никакая не альтернатива Визе, так как все :vi: в \LabVIEW xxxx\vi.lib\Instr\serial.llb и в _sersup.llb содержат стандартные блоки VISA. Если речь о 6.1 и более ранних, то да, некоторый смысл есть, наверное. Сравните сами:
Вложения
Open Serial Driver.vi (LV ≥ 7.1)
Open Serial Driver.vi (LV ≥ 7.1)
Open Serial Driver.vi (LV ≤ 6.1)
Open Serial Driver.vi (LV ≤ 6.1)

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1936
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов
Благодарил (а): 3 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение Borjomy_1 »

Хм.. Вы на дату сообщения смотрели? 4 года уже прошло. Может, технический прогресс его уже догнал.

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

Borjomy_1 писал(а):Вы на дату сообщения смотрели?
dadreamer писал(а):Прошу прощения за археологию
Borjomy_1 писал(а):Может, технический прогресс его уже догнал.
В профиле версия :labview: не указана :dntknw:
Ну, и это навело на мысли: http://labviewportal.org/viewtopic.php?p=65897#p65897

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1936
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов
Благодарил (а): 3 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение Borjomy_1 »

Мдя.. в таком случае, вы правы. С этим следует смириться....

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

Borjomy_1 писал(а):Сдается мне, что вычитка из буфера уже принятых данных (пусть даже с парсингом) и прием в реальном времени с контролем на размер буфера, терминальный символ и таймаут - это совершенно разные процедуры.
Нет, функция одна и та же. Просто чуть разное поведение в синхронном и асинхронном режимах. В обоих случаях используется связка SetCommTimeouts + ReadFile + GetOverlappedResult. В синхронном режиме она вызывается один раз, но в асинхронном выполняется каждую миллисекунду (!). Функция GetOverlappedResult как раз приостанавливает поток, в котором вызывается, на количество времени, указанное в структуре COMMTIMEOUTS. В асинхронном режиме тайм-аут устанавливается в 1 мс:

Код: Выделить всё

lpCommTimeouts:
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=1
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=500
В синхронном режиме тайм-аут соответствует тому, что указан в настройках VISA Configure Serial Port:

Код: Выделить всё

lpCommTimeouts:
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=1000
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=500
В данном случае я брал 1 секунду.
Немного непонятно, почему не используется WaitForSingleObject, как в примерах, но видимо он не нужен, т.к. bWait = TRUE для GetOverlappedResult в обоих случаях. ReadFile и там, и там пытается считать 1 байт. Видимо, чтение всё-таки побайтовое. В общем, в словах Якова некоторый смысл есть:
[b][color=#003399]Jakob Brontfeyn[/color][/b] писал(а):как это делает элемент VISA внутри себя в каких циклах я не знаю или, наверное, при приходе каждого нового байта, он тянет при этом компьютерное время
Только вот выражение "тянет" получается неоднозначное :D

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

dadreamer писал(а):Если всё ещё актуально, как вариант, попробуйте этот serpdrv и :vi: из архива, у меня есть уверенность на 85%, что заработает, и всё-таки это лучше, чем городить огород из врапперов.
Проверил работу serpdrv на Линуксе (виртуалка Ubuntu 15.04 64-bit + :labview: 2010). Всё замечательно работает, данные по виртуальному каналу передаются между домашней и гостевой ОС. Файл serpdrv из архива нужно положить рядом с исполняемым файлом labview, у меня это каталог /usr/local/natinst/LabVIEW-2010/. В конфигах самого :labview: (/home/$USER/natinst/.config/LabVIEW-2010/labview.conf) ничего дополнительно прописывать не нужно. Единственный нюанс был с разрешениями юзера на доступ к порту. У меня по дефолту доступа не было, инструмент Serial Port Init.vi выдавал ошибку 37. Сначала я делал так:

Код: Выделить всё

sudo chmod 777 /dev/ttyS0
Однако после перезагрузки ВМ права слетали. Нашёл решение получше - добавить пользователя в группу dialout:

Код: Выделить всё

sudo adduser $USER dialout
После перезагрузки машины юзер будет иметь полный доступ к порту.
Есть и другие решения.

Обращаю внимание, что в папке /serpdrv/serpdrv_vis/ есть несколько инструментов с пометкой (Linux):
Open Serial Driver (Linux).vi
Serial Port Buffer Size (Linux).vi
Serial Port Reset (Linux).vi

Нужно оригинальные файлы заменить на эти (естественно, пометку убрать).

На классическом Маке serpdrv так же работает, проверял ранее.

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4957
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение IvanLis »

Дошли руки и до этого.
Но результата не удалось получить положительного.
Система Ubuntu 16.04 LTS / LabVIEW 2010 - 32 bit

Нашел дома такую железяку 32-Channel Servo Controller Board (https://www.elechouse.com/elechouse/ind ... ts_id=1883)
Подключаем ее и ищем в системе:

Код: Выделить всё

ivan@Ivan-Net:~$ lsusb
Bus 002 Device 004: ID 046d:082b Logitech, Inc. Webcam C170
Bus 002 Device 006: ID 1208:0815
Bus 002 Device 003: ID 09da:9066 A4Tech Co., Ltd. F3 V-Track Gaming Mouse
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Есть контакт, то что нужно ID 1208:0815.
Проверяем:

Код: Выделить всё

ivan@Ivan-Net:~$ dmesg | tail
[  909.389195] usbcore: registered new interface driver cdc_acm
[  909.389199] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[  957.426167] usb 2-1.3: USB disconnect, device number 5
[ 1294.005756] usb 2-1.3: new full-speed USB device number 6 using ehci-pci
[ 1294.100155] usb 2-1.3: New USB device found, idVendor=1208, idProduct=0815
[ 1294.100158] usb 2-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1294.100160] usb 2-1.3: Product: mini USB servo controller
[ 1294.100161] usb 2-1.3: Manufacturer: TOROBOT.com
[ 1294.100162] usb 2-1.3: SerialNumber: 8D8522585549
[ 1294.100566] cdc_acm 2-1.3:1.0: ttyACM0: USB ACM device
Получается, что устройство висит на /dev/ttyACM0
Хотя в Help к LabVIEW 6.1 из которой дергаем serpdrv (https://lost-contact.mit.edu/afs/rhic.b ... _Init.html) про эти порты не написано, попытался прогнать все порты до 100 (LabVIEW запускал на всякий случай из под root, но предварительно добавился еще и в группу dialout).
Результат плачевный, без Error 37 отработал только порт 0.
При попытке записать в него информацию, ничего не получается, настройки брал с ранее отработанного варианта в Windows, причем при передаче/приеме данных на железке моргает светодиод, у меня он тоже не моргал.
Так что пока "не вышел каменный цветок". Будет время покопаю еще.

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3534
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 2 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Альтернатива VISA для работы с последовательным портом

Сообщение dadreamer »

IvanLis писал(а):Получается, что устройство висит на /dev/ttyACM0
По дефолту serpdrv заточен на работу с устройствами ttySN, где N - номер порта, начиная с 0. Возможно, что в конфиге :labview: нужно прописать другое наименование порта перед тем, как работать с ним. На Винде перечисление портов выглядит так: http://digital.ni.com/public.nsf/allkb/ ... 33005AC9A5
Полагаю, на Линуксе должно быть как-то так:

Код: Выделить всё

labview.serialDevices:/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2
Если не поможет, то есть вариант сделать свой ttySN-файл, правда, я не разбирался, как именно это делается.
http://forums.ni.com/t5/Instrument-Cont ... d-p/102618
The Linux Serial HOWTO: What Are The Names Of The Serial Ports?
Последний раз редактировалось dadreamer 06 ноя 2016, 21:28, всего редактировалось 1 раз.

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4957
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Альтернатива VISA для работы с последовательным портом

Сообщение IvanLis »

dadreamer писал(а):По дефолту serpdrv заточен на работу с устройствами ttySN, где N - номер порта, начиная с 0. Возможно, что в конфиге :labview: нужно прописать другое наименование порта перед тем, как работать с ним.
:dntknw:
dadreamer писал(а):В конфигах самого :labview: (/home/$USER/natinst/.config/LabVIEW-2010/labview.conf) ничего дополнительно прописывать не нужно.
Это врятли, конфиг я так понимаю необходим для сопоставления реального порта и его названия в VISA.
У меня например в конфиге вообще о портах информации нет.

Ответить

Вернуться в «Коммуникация с приборами»