Альтернатива VISA для работы с последовательным портом
Re: Альтернатива VISA для работы с последовательным портом
а как их из этой библиотеки вытащить, SubVI делать?
-
Jakob Brontfeyn
- expert
- Сообщения: 1729
- Зарегистрирован: 28 фев 2008, 11:01
- Награды: 6
- Благодарил (а): 1 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Kvanto писал(а):а как их из этой библиотеки вытащить, SubVI делать?
вот тебе пара VI примеров к этой библиотеке:
Вообще такую методику работы с компортом,
успешно применяю, смотри, например, здесь:
http://www.labviewportal.org/viewtopic. ... 964#p23964
- Вложения
-
- Sersnoop.vi
- (45.59 КБ) 809 скачиваний
-
- Loopback.vi
- (34.84 КБ) 785 скачиваний
-
- advanced
- Сообщения: 195
- Зарегистрирован: 21 фев 2011, 10:31
- Версия LabVIEW: 2009
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Jakob Brontfeyn писал(а):Я с VISA никогда не работаю,
вот есть альтернативные VI
А чем лучше эти альтернативы?
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Вкратце:
Альтернативы:
1. Сильно уменьшают размер инсталлятора
2. Могут работать чуть лучше с некоторыми проблемными устройствами (встречался ровно 1 раз)
Но:
1. Почти все они работают только на Windows (не Linux, не MAC OS и тем более не Wndows Mobile)
2. Некоторые из них плохо распараллеливаются (.NET решение)
3. Нулевая масштабируемость (нужно подключить тот же прибор через ethernet, а не через COM порт - переписывай прогу).
4. Отсутствие поддержки от NI
5. VISA - это больше чем работа с последовательным портом.
Альтернативы:
1. Сильно уменьшают размер инсталлятора
2. Могут работать чуть лучше с некоторыми проблемными устройствами (встречался ровно 1 раз)
Но:
1. Почти все они работают только на Windows (не Linux, не MAC OS и тем более не Wndows Mobile)
2. Некоторые из них плохо распараллеливаются (.NET решение)
3. Нулевая масштабируемость (нужно подключить тот же прибор через ethernet, а не через COM порт - переписывай прогу).
4. Отсутствие поддержки от NI
5. VISA - это больше чем работа с последовательным портом.
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
Re: Альтернатива VISA для работы с последовательным портом
Пожалуй, я соглашусь с mzu2006, за исключением п.3. С 8 версии ЛВ к визе практически не было нареканий, и во всех проектах мы ее использовали весьма плотно. Соглашусь, были глюки, но они возникли в довольна-таки экстремальных ситуациях. Но так как последовательный порт использовался частенько, то была библиотека которая реализовывала обмен данными как через визу так через winapi.
-
IvanLis
- guru
- Сообщения: 5463
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Альтернатива VISA для работы с последовательным портом
Господа, поделитесь опытом.....
Не секрет, что есть люди, которые работают под Linux, а программировать на приходится из Windows.
Но не всегда есть желание и возможности перегружать систему, а иногда ооочень хочется работать с устройством используя последовательный или параллельный порт. VISA нормально работает лишь под ограниченным списком Linux систем, так что приходится крутиться.
Я поступаю следующим образом. Есть "прослойка" написанная на Python, которая считывает данные с COM порта, а потом пересылает их на localhost по TCP. Откуда их уже успешно читает.
Может есть нормально работающие альтернативы VISA для Linux, более конкретно Ubuntu?
Не секрет, что есть люди, которые работают под Linux, а программировать на приходится из Windows.
Но не всегда есть желание и возможности перегружать систему, а иногда ооочень хочется работать с устройством используя последовательный или параллельный порт. VISA нормально работает лишь под ограниченным списком Linux систем, так что приходится крутиться.
Я поступаю следующим образом. Есть "прослойка" написанная на Python, которая считывает данные с COM порта, а потом пересылает их на localhost по TCP. Откуда их уже успешно читает.
Может есть нормально работающие альтернативы VISA для Linux, более конкретно Ubuntu?
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 17
- Зарегистрирован: 07 июн 2010, 19:58
- Версия LabVIEW: 9
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Sersnoop.vi не смог открыть в 11 labview
В Loopback.vi не понял почему это называют альтернативой виза, если все подвп содержат блоки визы.
В Loopback.vi не понял почему это называют альтернативой виза, если все подвп содержат блоки визы.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Скажу сразу, меня VISA устраивает более чем полностью. Из чистого любопытства копался в старых релизах и нашёл кое что интересное. До внедрения Визы (версии 2.5 — 6.1) работа с низкоуровневыми устройствами (COM/LPT, GPIB, DAQ) выполнялась через специальные инструменты, так называемые Device Manager , которые вызывали соответствующий "драйвер" (CIN особого типа) - serpdrv для COM/LPT, gpibdrv - для GPIB и т.д. (чуть подробнее здесь). Начиная с 7-й версии с целью унификации и стандартизации эти "драйвера" выпилили из и заменили Визой. О жизненном цикле "драйвера" 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 все и сам serpdrv и положить сюда - может, кому-то окажется полезным. Сам я, скорее всего, никогда этим не воспользуюсь. Что внутри "драйвера", я детально не смотрел, обратил лишь внимание, что на Windows по сути это обёртка над Communications Functions из kernel32.
с "драйверами" под Windows, Linux и Classic Mac: Пример простейшего сеанса приёма-передачи: !!! Чтобы эти заработали, нужно положить serpdrv рядом с labview.exe (режим разработки / IDE). В режиме скомпилированного приложения / RTE serpdrv нужно поместить рядом с lvrt.dll, то есть в папку C:\Program Files (x86)\National Instruments\Shared\LabVIEW Run-Time\[Ваша_версия_LV]\ (версии начиная с 6.0 и выше), либо рядом с экзешником (версия 5.0).
Плюсы и минусы этих инструментов:
[+] Работают без инсталляции, в отличие от VISA, нужен лишь "драйвер" рядом с программой;
[+] Очень маленький размер "драйвера" (не более 25 КБ);
[-] Работают только в 32-битных версиях ;
[-] Нет поддержки терминального символа (termination char);
[-] Нет поддержки тайм-аута операций чтения/записи;
[-] Нет возможности перечисления портов для получения списка всех портов в системе;
[-] На выходе не error cluster, а числовой код ошибки (немного усложняет построение dataflow на БД).
При наличии некоторого количества свободного времени поддержку терминатора, тайм-аута чтения/записи и кластера error in/out можно довольно легко реализовать в самом с помощью дополнительных SubVI (см. исходники LVSerial).
Также сам serpdrv из LV 6.1 можно скачать здесь, более ранние версии лежат тут. Версия из LV 6.1 под Linux лежит здесь. Для классического Macintosh'а serpdrv не нужен.
Собираюсь взглянуть более детально на функции девайс менеджера, если хватит времени и сил.
с "драйверами" под Windows, Linux и Classic Mac: Пример простейшего сеанса приёма-передачи: !!! Чтобы эти заработали, нужно положить serpdrv рядом с labview.exe (режим разработки / IDE). В режиме скомпилированного приложения / RTE serpdrv нужно поместить рядом с lvrt.dll, то есть в папку C:\Program Files (x86)\National Instruments\Shared\LabVIEW Run-Time\[Ваша_версия_LV]\ (версии начиная с 6.0 и выше), либо рядом с экзешником (версия 5.0).
Плюсы и минусы этих инструментов:
[+] Работают без инсталляции, в отличие от VISA, нужен лишь "драйвер" рядом с программой;
[+] Очень маленький размер "драйвера" (не более 25 КБ);
[-] Работают только в 32-битных версиях ;
[-] Нет поддержки терминального символа (termination char);
[-] Нет поддержки тайм-аута операций чтения/записи;
[-] Нет возможности перечисления портов для получения списка всех портов в системе;
[-] На выходе не error cluster, а числовой код ошибки (немного усложняет построение dataflow на БД).
При наличии некоторого количества свободного времени поддержку терминатора, тайм-аута чтения/записи и кластера error in/out можно довольно легко реализовать в самом с помощью дополнительных SubVI (см. исходники LVSerial).
Также сам serpdrv из LV 6.1 можно скачать здесь, более ранние версии лежат тут. Версия из LV 6.1 под Linux лежит здесь. Для классического Macintosh'а serpdrv не нужен.
Если всё ещё актуально, как вариант, попробуйте этот serpdrv и из архива, у меня есть уверенность на 85%, что заработает, и всё-таки это лучше, чем городить огород из врапперов.[b][color=#008000]IvanLis[/color][/b] писал(а):Может есть нормально работающие альтернативы VISA для Linux, более конкретно Ubuntu?
Собираюсь взглянуть более детально на функции девайс менеджера, если хватит времени и сил.
Последний раз редактировалось dadreamer 21 июл 2016, 22:43, всего редактировалось 5 раз.
-
Jakob Brontfeyn
- expert
- Сообщения: 1729
- Зарегистрирован: 28 фев 2008, 11:01
- Награды: 6
- Благодарил (а): 1 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Для приема произвольных посылок, рекомендую применить этот алгоритм:
http://www.labviewportal.org/viewtopic. ... 850#p65830
http://www.labviewportal.org/viewtopic. ... 850#p65830
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
Категорически не советую. Тем более, что произвольных посылок у производителей автоматизации НЕ БЫВАЕТ. Каждая посылка сопровождается кодом начала, кодом завершения, а также содержит идентификатор типа посылке, на основании которых производится прием. В случае с посылкой в формате ASCII присутствует код начала посылки и ЕДИНЫЙ код конца посылки (т.н. терминальный символ). Этот принцип БАЗОВО поддержан в и в любом низкоуровневом драйвере для ЛЮБОЙ платформы. Будь то Windows, будь то ассемблер. Эта реализация начинается на уровне микросхемы драйвера последовательного порта. Для приема устанавливается код терминального символа. Последующее чтение производится вызовом функции "VISA Read" с указанием максимально возможного размера посылки. При чтении АВТОМАТИЧЕСКИ будет считана вся посылка до терминального символа. Никаких дополнительных операций производить НЕ НАДО. Требуется проверить результат на таймаут (в случае таймаута нет конца посылки - устройство выключено) и на присутствие кода начала посылки (в противном случае посылка принята не с начала, обычно бывает при первом чтении, при постоянной работе быть не должно). Этого достаточно для надежного приема.Для приема произвольных посылок, рекомендую применить этот алгоритм:
viewtopic.php?f=21&t=8250&p=65850#p65830
В случае с бинарной посылкой формат используется следующий:
голова - код начала посылки, код тела посылки и/или длина посылки + другие данные, которые имеют одинаковое значение для всех посылок данного устройства. Размер головы посылки также фиксирован для устройства
тело посылки - содержит изменяемые по формату данные. Формат непротиворечиво соответствует коду посылки
хвост - контрольная сумма (если надо) тела посылки+головы и код конца посылки
Для приема бинарной посылки терминальный символ отключается. Производится чтение головы посылки, ее разбор. На основании разбора головы посылки вычисляется длина тела посылки. После чего вычитывается тело посылки известной длины и хвост. Проверяется соответствие кодов начала и конца посылки.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
В функционале Windows API нет ничего для указания терминального символа:Borjomy_1 писал(а):Этот принцип БАЗОВО поддержан в и в любом низкоуровневом драйвере для ЛЮБОЙ платформы. Будь то Windows, будь то ассемблер. Эта реализация начинается на уровне микросхемы драйвера последовательного порта.
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 нет поддержки терминального символа - это просто не реализовано.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
Значит, наврал. Однако могу точно сказать, что драйвера, которыми пользовался 10-15 лет назад под DOS (в данном случае говорю про MOXA) уже тогда использовали в функционале терминальный символ. И везде, где речь идет о промышленной автоматизации, обработка терминального символа присутствует.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
В доказательство своих слов сделал даже картинку:
[\r = 0xD = Enter] b", т.е. три символа, и собственно [\r = 0xD = Enter] - это терминатор. VISA Read указано считать 3 символа. Согласно алгоритму, функция вернёт значение 1. Полученный индекс инкрементируется и выполняется копирование памяти из буфера со считанной строкой в пустой буфер. Так что очевидно, что обработка терминатора целиком возложена на API для работы с портом. И кстати, NiViAsrl также использует везде ReadFile/WriteFile из kernel32 для чтения из порта/записи в порт, т.е. ничего принципиально нового тут не изобретено.
Это кусок кода, вызываемый функцией viRead из visa32.dll. Как видим, visa32.dll внутри себя использует NiViAsrl.dll, где размещены служебные функции для работы с последовательным протоколом. Эта маленькая функция на картинке как раз выполняет побайтовое сравнение считанной из порта строки с терминатором. Возвращаемое значение - это индекс терминатора в строке. В конкретном случае в порт была записана строка "a -
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Альтернатива VISA для работы с последовательным портом
В какой момент происходит сравнение? Дело в том, что, как правило, терминатор - то последним идет. И если вы заказали 10 байт, а пришло 3, из них терминатор последний, то функция не будет ждать, когда придет еще 7 (т.е наступления таймаута). Иначе смысла никакого нет работать с терминатором.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Альтернатива VISA для работы с последовательным портом
Borjomy_1, заказал для VISA Read 3 символа. Приходит 1, потому что 2-й - это терминатор, он обрезается. Всё работает так, как и должно. Заодно проверил вчерашний вопрос, соответствует тому, что вы написали. Если сделать второй заход VISA Read, то придёт остаток строки и сработает тайм-аут.
Если вы о парсинге строки, то он выполняется при вызове VISA Read. Цепочка вызовов такова: VISA Read -> visa32.dll -> NiViAsrl -> ReadFile -> парсинг строки и обрезка по терминатору -> выдача готовой строки наверхBorjomy_1 писал(а):В какой момент происходит сравнение?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 7 Ответы
- 297 Просмотры
-
Последнее сообщение dadreamer
-
- 2 Ответы
- 657 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 240 Просмотры
-
Последнее сообщение Embedder74