Страница 2 из 6

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

Добавлено: 07 мар 2011, 21:06
Kvanto
а как их из этой библиотеки вытащить, SubVI делать?

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

Добавлено: 08 мар 2011, 11:08
Jakob Brontfeyn
Kvanto писал(а):а как их из этой библиотеки вытащить, SubVI делать?

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


Вообще такую методику работы с компортом,
успешно применяю, смотри, например, здесь:
http://www.labviewportal.org/viewtopic. ... 964#p23964

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

Добавлено: 13 май 2011, 04:37
Колега
Jakob Brontfeyn писал(а):Я с VISA никогда не работаю,
вот есть альтернативные VI

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

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

Добавлено: 14 май 2011, 06:04
mzu2006
Вкратце:

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

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

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

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

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

Добавлено: 05 дек 2011, 16:48
IvanLis
Господа, поделитесь опытом.....

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

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

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

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

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

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

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

Добавлено: 15 сен 2015, 12:30
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 КБ) 501 скачивание
Пример простейшего сеанса приёма-передачи:
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%, что заработает, и всё-таки это лучше, чем городить огород из врапперов.

Собираюсь взглянуть более детально на функции девайс менеджера, если хватит времени и сил.

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

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

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

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

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

Добавлено: 15 сен 2015, 15:38
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 нет поддержки терминального символа - это просто не реализовано.

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

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

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

Добавлено: 16 сен 2015, 12:12
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 для чтения из порта/записи в порт, т.е. ничего принципиально нового тут не изобретено.

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

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

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

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