TCP Listen и интервал портов

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

TCP Listen и интервал портов

Сообщение Di3el »

Прошу помощи в сложившейся ситуации!
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.

Наиболее полезные ответы:
http://www.labviewportal.eu/viewtopic.p ... 533#p45960
http://www.labviewportal.eu/viewtopic.p ... 533#p46074
Вложения
Random port.vi
Случайно выбирает порт из указанного интервала.
(19.72 КБ) 140 скачиваний
Последний раз редактировалось Di3el 07 янв 2013, 18:26, всего редактировалось 2 раза.
Аватара пользователя
IvanLis

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

Re: TCP Listen и интервал портов.

Сообщение IvanLis »

Di3el писал(а):Прошу помощи в сложившейся ситуации!
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.
А не пробовали создать реентерабельную SubVI - Слушатель. И запустить несколько.
По идее должно работать нормально, только не знаю сколько экземпляров можно запустить одновременно и как будет работать при большом их количестве.
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов.

Сообщение Di3el »

К сожалению не совсем, а точнее совсем не понятно что вы предлагаете делать. Почитал что такое SubVI, как его создать, а каковы мои дальнейшие действия? Спасибо! :labview:
Аватара пользователя
IvanLis

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

Re: TCP Listen и интервал портов.

Сообщение IvanLis »

Di3el писал(а):К сожалению не совсем, а точнее совсем не понятно что вы предлагаете делать. Почитал что такое SubVI, как его создать, а каковы мои дальнейшие действия? Спасибо! :labview:
http://www.labview.webhost.ru/?%CF%F0%E ... 5%EC_SubVI
Здесь как раз рассматривается Ваш вариант с TCP: http://labviewwiki.org/Reentrant_VI
http://www.labview.ru/forum/viewtopic.php?f=1&t=11433
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов.

Сообщение Di3el »

Спасибо, проштудирую :super:
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов.

Сообщение Di3el »

IvanLis писал(а):А не пробовали создать реентерабельную SubVI - Слушатель. И запустить несколько. По идее должно работать нормально, только не знаю сколько экземпляров можно запустить одновременно и как будет работать при большом их количестве.
Создал я все как надо, сделал слушателя в виде подпрограммы SubVI и поставил галочку Reentrant execution. Но то что хотел не получилось, столкнулся с тем. что у меня все же эти подпрограммы не прослушивают одновременно каждый порт, а в какой то последовательности по одному. В приложение картинка при отладки. Не чего пока не могу понять :cantbe: не получается параллельная работа каждой SubVI.
Вложения
Безымянный.png
Безымянный.png (9.68 КБ) 8129 просмотров
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: TCP Listen и интервал портов.

Сообщение Andrew Lunev »

Галочка в Reentrant execution всего лишь разрешает параллельную работу, но не гарантирует ее. Чтобы процессы реально были параллельными необходимо чтобы и все функции, входящие в SubVI так же поддерживали Reentrant execution. Скорее всего какая-то функция внутри обращается к не разделяемым ресурсам компьютера, поэтому LabView выполняет ваши SubVI последовательно.
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов.

Сообщение Di3el »

Andrew Lunev писал(а):Галочка в Reentrant execution всего лишь разрешает параллельную работу, но не гарантирует ее. Чтобы процессы реально были параллельными необходимо чтобы и все функции, входящие в SubVI так же поддерживали Reentrant execution. Скорее всего какая-то функция внутри обращается к не разделяемым ресурсам компьютера, поэтому LabView выполняет ваши SubVI последовательно.
Весьма плачевная весть :buuh: может удастся еще что нибудь найти :think:
Аватара пользователя
IvanLis

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

Re: TCP Listen и интервал портов.

Сообщение IvanLis »

Di3el писал(а):Весьма плачевная весть :buuh: может удастся еще что нибудь найти :think:
а не пробовали запускать SubVI через Open VI Reference
посмотрите: http://www.labviewportal.org/viewtopic. ... 443#p29958

Выложите свои потуги, что бы не изобретать все заново.
А там посмотрим, в чем проблемы.
Аватара пользователя
IvanLis

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

Re: TCP Listen и интервал портов.

Сообщение IvanLis »

IvanLis писал(а):Выложите свои потуги, что бы не изобретать все заново.
А там посмотрим, в чем проблемы.
Самое интересное, что у меня все получилось :wink:
1.png
1.png (2.32 КБ) 8087 просмотров
List-Iv.vi
lv2010
(15.12 КБ) 139 скачиваний
MultiList-Iv.vi
lv2010
(8.76 КБ) 152 скачивания
не знаю, в чем у Вас проблемы?
и к тому-же....
у Вас ТаймАут = -1, это значит он будет ждать пока не получит данные
а как же параллельные процессы? выполнятся и остановятся (в случае если один из них ничего не получит)...
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1334
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 40 раз
Контактная информация:

Re: TCP Listen и интервал портов.

Сообщение AndreyDmitriev »

Di3el писал(а):Прошу помощи в сложившейся ситуации!
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.
Коллега Di3el, мне вот почему-то кажется, что вы так хотите сделать не потому что так надо по техзаданию, а оттого, что вы не знаете, что на одном порту можно открыть несколько соединений. При такой постановке задачи всё равно ведь придётся предусмотреть ситуацию, когда два клиента открывают соединения на один и тот же порт - ведь порт выбирается случайно, а клиенты друг о друге знать не обязаны. Так почему бы не открыть просто 50 соединений на один и тот-же порт? Это во-первых.

Кроме того, если уж слушать диапазон портов, то без динамического запуска VI задачку решить элегантно не получится - ведь придётся положить на блок-диаграмму 50 слушателей, что мягко говоря некрасиво - их надо запускать в цикле, а иначе решение будет негибким - если количество портов будет меняться, вам придётся ручками изменять код. Это во-вторых.

Но тем не менее. В LabVIEW 2011 появилась замечательная примочка - асинхронный вызов VI, с помощью этой штуки задачка решается довольно просто. Давайте решим задачу в общем случае - множественные клиенты соединяются с пулом портов (при этом два и более клиента могут подключиться к одному порту). В принципе всего-то надо чуть допилить примеры, прилагаемые к LabVIEW.

Приготовим для упражнения простенький сервер, который раз в секунду будет слать клиенту текущее время:

Изображение

Этот пример я стащил у NI. Теоретически можно отдавать время по запросу, но усложнить-то вы всегда успеете. Заметьте, что этот VI - реентрантный, он будет запускаться на каждое входящее соединение. Назовём его DateServer - Handler.vi. После запуска цикл будет крутиться до тех пор, пока активен клиент. Как только клиент отвалится - цикл остановится.

Теперь надо открыть ссылку для запуска этого VI. Это делается вот так:

Изображение

Тут две хитрости. Первая - флаги для открытия ссылки 0x40 и 0x80. Что они означают - читайте в хелпе - Open VI Reference Function. Вкратце - один флаг готовит реентрантный VI для асинхронного запуска, а второй - что мы будем запускать его в режиме "запустить и забыть". Вторая хитрость - установка размера пула асинхронного вызова. Почитать об этом можно вот тут - Populate Asynchronous Call Pool Method. NI рекомендует установить значение таким, сколько копий ожидается запустить (в данном случае это максимальное число клиентов, которое могут подсоединиться к серверу). В принципе если число клиентов превысит размер пула, то ничего страшного не должно произойти, просто время отклика может возрасти.

Теперь самое интересное. Сервер (читай DateServer - Handler.vi) мы будем динамически запускать для каждого клиента. Соответственно нам понадобится слушатель порта. Делается это вот так:

Изображение

Тут в цикле While слушатель ждёт входящее соединение (таймаут по умолчанию -1 - ждать вечно). Как только клиент открывает порт, динамически запускается DateServer - Handler.vi. Несмотря на то, что внутри самого DateServer - Handler.vi есть цикл, мы не остановимся в точке запуска Start Asynchronous Call Node - итерация while завершится, DateServer - Handler.vi останется в запущенном состоянии, а слушатель будет продолжать слушать порт (тот же самый!). Если теперь второй клиент подсоединится на этот же самый порт, то и для него запустится вторая копия DateServer - Handler.vi.

Но это ещё не всё - ведь слушателя-то тоже надо запускать динамически (их понадобится 50 штук по условиям задачки). Делаем точно также как и выше - создаём ссылку:

Изображение

Ну и теперь можно собрать всё вместе:

Изображение

В этом примере открывается 50 портов - для них запускается полсотни слушателей, а клиенты могут открывать соединения на любой порт из диапазона 6341-6390, при этом два клиента могут открыть один и тот же порт (я предположил, что общее число клиентов будет 100). При нажатии кнопки stop закрываются все 50 tcp ссылок слушателей и это приводит к их останову. По идее, конечно имеет смысл проверять, что слушатель не возвращает ошибку и т.п., но для учебных целей такого примера более чем достаточно.

Клиент тривиален:

Изображение

Вот вроде и всё. Открываете и запускаете сначала сервер, а потом клиентов. Я там три клиента приложил - первый и второй для порта 6341, а третий для 6342. Запустите их одновременно - все они будут получать время с сервера, если я не ошибся нигде.

Проект я сохранил для 2011, но у меня 2012. В прошлой версии были какие-то траблы с асинхронным вызовом - надеюсь вы на них не наткнётесь (проверить не могу, у меня 2011 не установлена).

Меня правда, немного напрягает вот это ваше замечание
Di3el писал(а):Почитал что такое SubVI, как его создать, а каковы мои дальнейшие действия?
потому что между "Почитал что такое SubVI, как его создать" и тем, что я изложил выше, скажем так - довольно приличное расстояние (тем паче что отладка динамически вызываемых реентрантных VI - то ещё удовольствие), но если вы детально разберётесь как оно работает, то реально продвинетесь в LabVIEW.

Успехов!
Вложения
TCPMultiple.zip
(58.63 КБ) 164 скачивания
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов.

Сообщение Di3el »

Всем спасибо за ответы! пища для ума получена, буду ее переваривать!=)
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов

Сообщение Di3el »

Вот такой вопрос возник! При реализации программы по примеру указанному выше появились некоторые вопросы. Возможно при такой реализации сделать очередь клиентов? Так как сервер подключен к прибору по протоколу RS232, и если большое количество запросов придет о получении данных, то каждая :vi: будет пытаться подключится и считать данные с прибора но у нее не получается и она присылает клиенту не правильные данные либо вообще ничего не присылает. Что можете посоветовать? Спасибо!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: TCP Listen и интервал портов

Сообщение Borjomy_1 »

Заведите семафор. Один на всех.
Аватара пользователя
Di3el
beginner
beginner
Сообщения: 45
Зарегистрирован: 18 дек 2012, 17:28
Версия LabVIEW: 11
Откуда: Российская Федерация
Контактная информация:

Re: TCP Listen и интервал портов

Сообщение Di3el »

Ммм... по примеру посмотрел весьма просто, но так как у меня создается динамически соединение возможно ли реализовать его? :think:
И кстати этот алгоритм не эффективен для меня, так как из десяти клиентов слать запросы будут только трое на получение информации, а время будет разграничено на все десять. Или я не прав?
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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