Одновременные сессии по telnet
-
- interested
- Сообщения: 6
- Зарегистрирован: 04 июл 2015, 15:39
- Версия LabVIEW: 10
- Контактная информация:
Одновременные сессии по telnet
Приветствую участников форума. Помогите решить следующую проблему.
Имеется два устройства, подключенные к компу по локальной сети. В качестве протокола передачи был выбран telnet.
С каждого устройства приходят данные приблизительно 50 раз в секунду. Каждое устройство естественно имеет свой ip, но передача данных осуществляется по одному порту (23-ему).
В labview создаю два параллельных цикла, в которых открываю соединение telnet для каждого устройства с дальнейшем чтением информации.
Проблема заключается в том, что с одного устройства данные поступают в реальном времени, а с другого с большой задержкой. Чем дольше работает программа, тем больше накапливается задержка (от 30 секунд до 5 минут). Как это можно исправить или с чем это может быть связано?
p.s.
1) По отдельности оба устройства работают нормально.
2) С помощью синхронизации удалось добиться последовательного сбора информации и данные с обоих устройств приходили практически в реальном времени (я имею ввиду, что для человека разница не заметна - доля секунды). Однако необходимо организовать именно одновременную, параллельную передачу данных, так как устройств необходимо подключать большое количество.
3) Мне кажется, что проблема связана с использованием одного порта. Что данные со второго устройства передаются только тогда, когда порт становится открытым (т.е. не занятым первым устройством). Так ли это?
Имеется два устройства, подключенные к компу по локальной сети. В качестве протокола передачи был выбран telnet.
С каждого устройства приходят данные приблизительно 50 раз в секунду. Каждое устройство естественно имеет свой ip, но передача данных осуществляется по одному порту (23-ему).
В labview создаю два параллельных цикла, в которых открываю соединение telnet для каждого устройства с дальнейшем чтением информации.
Проблема заключается в том, что с одного устройства данные поступают в реальном времени, а с другого с большой задержкой. Чем дольше работает программа, тем больше накапливается задержка (от 30 секунд до 5 минут). Как это можно исправить или с чем это может быть связано?
p.s.
1) По отдельности оба устройства работают нормально.
2) С помощью синхронизации удалось добиться последовательного сбора информации и данные с обоих устройств приходили практически в реальном времени (я имею ввиду, что для человека разница не заметна - доля секунды). Однако необходимо организовать именно одновременную, параллельную передачу данных, так как устройств необходимо подключать большое количество.
3) Мне кажется, что проблема связана с использованием одного порта. Что данные со второго устройства передаются только тогда, когда порт становится открытым (т.е. не занятым первым устройством). Так ли это?
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Одновременные сессии по telnet
Кто и как открывает соединение?
Порт одинаковый на какой стороне?
Покажите код, может там банальная ошибка, которая и приводит к таким результатам.
Порт одинаковый на какой стороне?
Покажите код, может там банальная ошибка, которая и приводит к таким результатам.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Одновременные сессии по telnet
Может быть использована , которая участвует в обоих процессах, но в которой происходит ожидание чего-либо. Без объявления такой "реентрантной", она будет последовательно выполняться в каждом процессе, другой процесс будет ждать окончания ее выполнения. Точно также, даже если ожидания не происходит, могут быть проблемы с локальными переменными внутри - оба процесса пользуются одной копией данных. Такую также надо объявлять реентрантной.
-
- interested
- Сообщения: 6
- Зарегистрирован: 04 июл 2015, 15:39
- Версия LabVIEW: 10
- Контактная информация:
Re: Одновременные сессии по telnet
Artem.spb, Спасибо за оперативный отклик. Даже не думал, что кто-то так быстро ответит.
Соединение открывается в labview. Порт используется телнетовский 23-ий, т.е. получается он одинаковый и для приема и для передачи. Комп считывает два потока данных: с 192.168.0.101:23 и с 192.168.0.102:23
Прикрепляю часть программы, отвечающую за telnet.
Соединение открывается в labview. Порт используется телнетовский 23-ий, т.е. получается он одинаковый и для приема и для передачи. Комп считывает два потока данных: с 192.168.0.101:23 и с 192.168.0.102:23
Прикрепляю часть программы, отвечающую за telnet.
- Вложения
-
- Подключение двух устройств.rar
- (28.05 КБ) 192 скачивания
-
- interested
- Сообщения: 6
- Зарегистрирован: 04 июл 2015, 15:39
- Версия LabVIEW: 10
- Контактная информация:
Re: Одновременные сессии по telnet
Borjomy_1, Спасибо. Как раз все выходные просидел на форумах и узнал про реентерабельность. Сегодня обязательно попробую.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Одновременные сессии по telnet
Всех функций просто напросто нет, так что что-то определённое сказать сложно, но вот тут
По поводу одинаковых портов: если он 23 на стороне прибора, то никаких проблем. Если LV открывает соединение, то система сама разберётся, какой порт выделить.
таймаут аж 10 сек, это и может быть причиной задержек, если функция как раз не реентрантная.По поводу одинаковых портов: если он 23 на стороне прибора, то никаких проблем. Если LV открывает соединение, то система сама разберётся, какой порт выделить.
-
- interested
- Сообщения: 6
- Зарегистрирован: 04 июл 2015, 15:39
- Версия LabVIEW: 10
- Контактная информация:
Re: Одновременные сессии по telnet
Artem.spb, хорошо, попробую. Позже отпишусь о результатах.
Насчет функций: я просто скачивал дополнительно internet toolkit. Вот так выглядит.
Насчет функций: я просто скачивал дополнительно internet toolkit. Вот так выглядит.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Одновременные сессии по telnet
По основной проблеме пока ничего не могу сказать, но есть кое какие "косяки" в программе.
1) Зачем нужна вот эта задержка? По правилам хорошего тона в программировании задержка должна помещаться в цикл, в данном случае у вас есть основной цикл While и внутренний цикл While. В каждый из них нужно вставить задержку по 50-100 мс. А задержка между записью данных и закрытием сессии... вряд ли нужна вообще.
2) Избавьтесь от локальных переменных, вместо них используйте notifier. Пример использования нотифаера (уведомителя):
1) Зачем нужна вот эта задержка? По правилам хорошего тона в программировании задержка должна помещаться в цикл, в данном случае у вас есть основной цикл While и внутренний цикл While. В каждый из них нужно вставить задержку по 50-100 мс. А задержка между записью данных и закрытием сессии... вряд ли нужна вообще.
2) Избавьтесь от локальных переменных, вместо них используйте notifier. Пример использования нотифаера (уведомителя):
- Вложения
-
- Untitled 1.vi
- lv2010
- (7.27 КБ) 179 скачиваний
-
- interested
- Сообщения: 6
- Зарегистрирован: 04 июл 2015, 15:39
- Версия LabVIEW: 10
- Контактная информация:
Re: Одновременные сессии по telnet
dadreamer, Задержка между отправкой команды и закрытием сессии вызвана необходимостью. Без этой задержки устройство не успевало принимать команду и соединение закрывалось некорректно и устройство зависало. А с задержкой, устройство сначало принимает команду "стоп", успевает за эти 500 мс обработать команду и затем нормально закрывается соединение.
Насчет notifier, попробую потестировать. Спасибо за помощь.
Насчет notifier, попробую потестировать. Спасибо за помощь.
-
- interested
- Сообщения: 6
- Зарегистрирован: 04 июл 2015, 15:39
- Версия LabVIEW: 10
- Контактная информация:
Re: Одновременные сессии по telnet
Artem.spb, Borjomy_1, попробовал потестить прогу с реентрантными vi. Сначало всё отлично, но опять же, чем дольше работает программа, тем больше накапливаются задержки (хотя и не с такой скоростью как раньше).
К сожалению не могу нормально поэкспериментировать. На работе навернули одно из устройств ( проблема с микросхемами), коллеги третий день пытаются починить. А я пока в ожидании.
К сожалению не могу нормально поэкспериментировать. На работе навернули одно из устройств ( проблема с микросхемами), коллеги третий день пытаются починить. А я пока в ожидании.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Одновременные сессии по telnet
А после получения команды "стоп" прибор ничего не выдаёт в ответ? Если он может отправлять флаг завершения работы, то вместо задержки корректнее считывать его. Ну, или в принципе можно оставить как есть. Только замените Wait Until Next ms Multiple на Wait (ms). А что касается остального, то лучше всего было бы оформить программу в виде архитектуры State Machine, тогда получился бы всего 1 цикл вместо 3-х. Telnet сессию можно было бы пробросить через сдвиговый регистр для корректного закрытия/повторного открытия девайса.Александр Красочкин писал(а):А с задержкой, устройство сначало принимает команду "стоп", успевает за эти 500 мс обработать команду и затем нормально закрывается соединение.