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

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

Activity Bronze Автор
VIP
VIP
Сообщения: 414
Зарегистрирован: 26 янв 2011, 17:56
Награды: 3
Версия LabVIEW: 10.0

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

Сообщение Kvanto »

а как их из этой библиотеки вытащить, SubVI делать?

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

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6

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

Сообщение Jakob Brontfeyn »

Kvanto писал(а):а как их из этой библиотеки вытащить, SubVI делать?

вот тебе пара VI примеров к этой библиотеке:


Вообще такую методику работы с компортом,
успешно применяю, смотри, например, здесь:
http://www.labviewportal.org/viewtopic. ... 964#p23964
Вложения
Sersnoop.vi
(45.59 КБ) 640 скачиваний
Loopback.vi
(34.84 КБ) 615 скачиваний

Колега
advanced
advanced
Сообщения: 195
Зарегистрирован: 21 фев 2011, 10:31
Версия LabVIEW: 2009

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

Сообщение Колега »

Jakob Brontfeyn писал(а):Я с VISA никогда не работаю,
вот есть альтернативные VI

А чем лучше эти альтернативы?

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

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

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

Сообщение mzu2006 »

Вкратце:

Альтернативы:
1. Сильно уменьшают размер инсталлятора
2. Могут работать чуть лучше с некоторыми проблемными устройствами (встречался ровно 1 раз)

Но:
1. Почти все они работают только на Windows (не Linux, не MAC OS и тем более не Wndows Mobile)
2. Некоторые из них плохо распараллеливаются (.NET решение)
3. Нулевая масштабируемость (нужно подключить тот же прибор через ethernet, а не через COM порт - переписывай прогу).
4. Отсутствие поддержки от NI
5. VISA - это больше чем работа с последовательным портом.

Pavel

Activity
developer
developer
Сообщения: 271
Зарегистрирован: 31 июл 2009, 08:07
Награды: 1
Версия LabVIEW: 8.5

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

Сообщение Pavel »

Пожалуй, я соглашусь с mzu2006, за исключением п.3. С 8 версии ЛВ к визе практически не было нареканий, и во всех проектах мы ее использовали весьма плотно. Соглашусь, были глюки, но они возникли в довольна-таки экстремальных ситуациях. Но так как последовательный порт использовался частенько, то была библиотека которая реализовывала обмен данными как через визу так через winapi.

Аватара пользователя
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 »

Господа, поделитесь опытом.....

Не секрет, что есть люди, которые работают под Linux, а программировать на :labview: приходится из Windows.

Но не всегда есть желание и возможности перегружать систему, а иногда ооочень хочется работать с устройством используя последовательный или параллельный порт. VISA нормально работает лишь под ограниченным списком Linux систем, так что приходится крутиться.

Я поступаю следующим образом. Есть "прослойка" написанная на Python, которая считывает данные с COM порта, а потом пересылает их на localhost по TCP. Откуда их :labview: уже успешно читает.

Может есть нормально работающие альтернативы VISA для Linux, более конкретно Ubuntu?

gogo
beginner
beginner
Сообщения: 17
Зарегистрирован: 07 июн 2010, 19:58
Версия LabVIEW: 9

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

Сообщение gogo »

Sersnoop.vi не смог открыть в 11 labview
В Loopback.vi не понял почему это называют альтернативой виза, если все подвп содержат блоки визы.

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

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

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

Сообщение dadreamer »

Скажу сразу, меня VISA устраивает более чем полностью. Из чистого любопытства копался в старых релизах :labview: и нашёл кое что интересное. До внедрения Визы (версии :labview: 2.5 — 6.1) работа с низкоуровневыми устройствами (COM/LPT, GPIB, DAQ) выполнялась через специальные инструменты, так называемые Device Manager :vi: , которые вызывали соответствующий "драйвер" (CIN особого типа) - serpdrv для COM/LPT, gpibdrv - для GPIB и т.д. (чуть подробнее здесь). Начиная с 7-й версии с целью унификации и стандартизации эти "драйвера" выпилили из :labview: и заменили Визой. О жизненном цикле "драйвера" serpdrv и о том, почему ему на смену пришла VISA, можно узнать из статьи одного из участников R&D - La Mort du Serpdrv. Ради интереса я взял serpdrv из LV 6.1 и проверил на двух системах: Win XP x32 + LV 2011 x32 и Win 7 x64 + LV 2013 x32. Удивительно, но он до сих пор работает, по крайней мере при нуль-модемной передаче по RS-232 никаких ошибок не возникало. Если так подумать, то он и должен был работать, т.к. за 50 с лишним лет стандарт RS-232 не только стал традиционным, но и морально устарел (это касается и железа, и программной части). В связи с этим фактом я решил выдернуть из LV 6.1 все :vi: и сам serpdrv и положить сюда - может, кому-то окажется полезным. Сам я, скорее всего, никогда этим не воспользуюсь. Что внутри "драйвера", я детально не смотрел, обратил лишь внимание, что на Windows по сути это обёртка над Communications Functions из kernel32.

:vi: с "драйверами" под Windows, Linux и Classic Mac:
serpdrv.zip
lv2010
(184.34 КБ) 323 скачивания
Пример простейшего сеанса приёма-передачи:
Snippet.png
!!! Чтобы эти :vi: заработали, нужно положить serpdrv рядом с labview.exe (режим разработки / IDE). В режиме скомпилированного приложения / RTE serpdrv нужно поместить рядом с lvrt.dll, то есть в папку C:\Program Files (x86)\National Instruments\Shared\LabVIEW Run-Time\[Ваша_версия_LV]\ (версии :labview: начиная с 6.0 и выше), либо рядом с экзешником (версия :labview: 5.0).

Плюсы и минусы этих инструментов:
[+] Работают без инсталляции, в отличие от VISA, нужен лишь "драйвер" рядом с программой;
[+] Очень маленький размер "драйвера" (не более 25 КБ);

[-] Работают только в 32-битных версиях :labview: ;
[-] Нет поддержки терминального символа (termination char);
[-] Нет поддержки тайм-аута операций чтения/записи;
[-] Нет возможности перечисления портов для получения списка всех портов в системе;
[-] На выходе :vi: не error cluster, а числовой код ошибки (немного усложняет построение dataflow на БД).

При наличии некоторого количества свободного времени поддержку терминатора, тайм-аута чтения/записи и кластера error in/out можно довольно легко реализовать в самом :labview: с помощью дополнительных SubVI (см. исходники LVSerial).

Также сам serpdrv из LV 6.1 можно скачать здесь, более ранние версии лежат тут. Версия из LV 6.1 под Linux лежит здесь. Для классического Macintosh'а serpdrv не нужен.
[b][color=#008000]IvanLis[/color][/b] писал(а):Может есть нормально работающие альтернативы VISA для Linux, более конкретно Ubuntu?
Если всё ещё актуально, как вариант, попробуйте этот serpdrv и :vi: из архива, у меня есть уверенность на 85%, что заработает, и всё-таки это лучше, чем городить огород из врапперов.

Собираюсь взглянуть более детально на функции девайс менеджера, если хватит времени и сил.
Последний раз редактировалось dadreamer 21 июл 2016, 22:43, всего редактировалось 5 раз.

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

Activity Gold Silver Black
expert
expert
Сообщения: 1704
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6

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

Сообщение Jakob Brontfeyn »

Для приема произвольных посылок, рекомендую применить этот алгоритм:
http://www.labviewportal.org/viewtopic. ... 850#p65830

Borjomy_1

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

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

Сообщение Borjomy_1 »

Для приема произвольных посылок, рекомендую применить этот алгоритм:
viewtopic.php?f=21&t=8250&p=65850#p65830
Категорически не советую. Тем более, что произвольных посылок у производителей автоматизации НЕ БЫВАЕТ. Каждая посылка сопровождается кодом начала, кодом завершения, а также содержит идентификатор типа посылке, на основании которых производится прием. В случае с посылкой в формате ASCII присутствует код начала посылки и ЕДИНЫЙ код конца посылки (т.н. терминальный символ). Этот принцип БАЗОВО поддержан в :labview: и в любом низкоуровневом драйвере для ЛЮБОЙ платформы. Будь то Windows, будь то ассемблер. Эта реализация начинается на уровне микросхемы драйвера последовательного порта. Для приема устанавливается код терминального символа. Последующее чтение производится вызовом функции "VISA Read" с указанием максимально возможного размера посылки. При чтении АВТОМАТИЧЕСКИ будет считана вся посылка до терминального символа. Никаких дополнительных операций производить НЕ НАДО. Требуется проверить результат на таймаут (в случае таймаута нет конца посылки - устройство выключено) и на присутствие кода начала посылки (в противном случае посылка принята не с начала, обычно бывает при первом чтении, при постоянной работе быть не должно). Этого достаточно для надежного приема.
В случае с бинарной посылкой формат используется следующий:
голова - код начала посылки, код тела посылки и/или длина посылки + другие данные, которые имеют одинаковое значение для всех посылок данного устройства. Размер головы посылки также фиксирован для устройства
тело посылки - содержит изменяемые по формату данные. Формат непротиворечиво соответствует коду посылки
хвост - контрольная сумма (если надо) тела посылки+головы и код конца посылки
Для приема бинарной посылки терминальный символ отключается. Производится чтение головы посылки, ее разбор. На основании разбора головы посылки вычисляется длина тела посылки. После чего вычитывается тело посылки известной длины и хвост. Проверяется соответствие кодов начала и конца посылки.

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

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

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

Сообщение dadreamer »

Borjomy_1 писал(а):Этот принцип БАЗОВО поддержан в :labview: и в любом низкоуровневом драйвере для ЛЮБОЙ платформы. Будь то Windows, будь то ассемблер. Эта реализация начинается на уровне микросхемы драйвера последовательного порта.
В функционале Windows API нет ничего для указания терминального символа:
https://msdn.microsoft.com/ru-ru/library/ff802693.aspx
http://stackoverflow.com/questions/4803 ... dows-via-c
http://www.codeproject.com/Articles/306 ... ion-on-Win
http://z-oleg.com/delphi/hardw5.htm
и особенно http://stackoverflow.com/questions/2308 ... e-eof-char
Так что обработка терминального символа - целиком задача драйвера VISA, т.е. на низком уровне выполняется либо непрерывный сбор, либо работа по событиям, и последующий парсинг строки по терминатору. По той же причине в serpdrv нет поддержки терминального символа - это просто не реализовано.

Borjomy_1

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

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

Сообщение Borjomy_1 »

Значит, наврал. Однако могу точно сказать, что драйвера, которыми пользовался 10-15 лет назад под DOS (в данном случае говорю про MOXA) уже тогда использовали в функционале терминальный символ. И везде, где речь идет о промышленной автоматизации, обработка терминального символа присутствует.

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

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

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

Сообщение dadreamer »

В доказательство своих слов сделал даже картинку:
2015-09-16_13-18-56.jpg
Это кусок кода, вызываемый функцией viRead из visa32.dll. Как видим, visa32.dll внутри себя использует NiViAsrl.dll, где размещены служебные функции для работы с последовательным протоколом. Эта маленькая функция на картинке как раз выполняет побайтовое сравнение считанной из порта строки с терминатором. Возвращаемое значение - это индекс терминатора в строке. В конкретном случае в порт была записана строка "a [\r = 0xD = Enter] b", т.е. три символа, и собственно [\r = 0xD = Enter] - это терминатор. :vi: VISA Read указано считать 3 символа. Согласно алгоритму, функция вернёт значение 1. Полученный индекс инкрементируется и выполняется копирование памяти из буфера со считанной строкой в пустой буфер. Так что очевидно, что обработка терминатора целиком возложена на API для работы с портом. И кстати, NiViAsrl также использует везде ReadFile/WriteFile из kernel32 для чтения из порта/записи в порт, т.е. ничего принципиально нового тут не изобретено.

Borjomy_1

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

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

Сообщение Borjomy_1 »

В какой момент происходит сравнение? Дело в том, что, как правило, терминатор - то последним идет. И если вы заказали 10 байт, а пришло 3, из них терминатор последний, то функция не будет ждать, когда придет еще 7 (т.е наступления таймаута). Иначе смысла никакого нет работать с терминатором.

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

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

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

Сообщение dadreamer »

Borjomy_1, заказал для VISA Read 3 символа. Приходит 1, потому что 2-й - это терминатор, он обрезается. Всё работает так, как и должно. Заодно проверил вчерашний вопрос, соответствует тому, что вы написали. Если сделать второй заход VISA Read, то придёт остаток строки и сработает тайм-аут.
Borjomy_1 писал(а):В какой момент происходит сравнение?
Если вы о парсинге строки, то он выполняется при вызове VISA Read. Цепочка вызовов такова: VISA Read -> visa32.dll -> NiViAsrl -> ReadFile -> парсинг строки и обрезка по терминатору -> выдача готовой строки наверх

Ответить

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