Как программно проверить доступность EM100 перед началом работы?

Искать в теме
Автор Сообщение
Как программно проверить доступность EM100 перед началом работы?
Распределённая система сбора данных состоит из единственного ПК (сервер, постоянно рядом с ним никто не находится) и пяти удалённых устройств, подключенных с помощью виртуальных COM-портов (драйвер TIBBO) и стандартных плат с модулем EM100. Питание плат осуществляется от блоков питания контролируемых устройств. Программа ПК помимо сбора данных раз в десять секунд отправляет каждому устройству короткую посылку с целью проверки связи.
Когда все устройства включены – никаких проблем не возникает.
Если хотя бы одно обесточено в момент запуска программы на ПК, то соответствующий ему виртуальный порт открывается нормально, но при первой передаче в этот порт хотя бы одного байта, программа «зависает» секунд на 12-15. Это весьма раздражает пользователей и периодически приводит к потерям информации от остальных устройств.
Приложение для ПК написано в Delphi. С целью исключения подозрений на ошибку программиста или протокола обмена с контролируемыми устройствами и т.д., поставлен эксперимент: короткая программа отправляет в единственный порт единственный байт по нажатию кнопки.
Увы, эффект сохранился. Останавливается таймер, не отжимается кнопка и т.д. Причём, увы, даже не возникает аварийной ситуации, которую можно было бы отследить программно в блоке try … except…
После первой неудачной попытки передачи эффект исчезает и задержек больше не происходит до следующего закрытия и открытия этого порта. Если после этого включить питание обесточенного устройства, то через несколько секунд всё опять начинает работать без проблем.
Процедура передачи в порт (вызывается нажатием кнопки на форме):
procedure TFormMain.Trans2MyCommand;
var btb:byte; ActualSent:dword;
begin
try

if MyOnWorking then
begin
btb:=$31;
WriteFile(RMyComm.MyPortH,btb,1,ActualSent,NIL);
end;

except
ShowMessage('Ошибка передачи!!!')
end;
end;

Процедура приёма вызывается в системном таймере.
Ещё раз подчёркиваю: когда плата с модулем EM100 включена, то никаких проблем не возникает с любым количеством контролируемых устройств.

Мы были бы очень благодарны, если бы нам подсказали пути борьбы с обнаруженным эффектом.
Быть может можно соответственным образом изменить настройки виртуального порта? (Если честно, я сегодня, как мне кажется, уже перебрал все возможные варианты настройки…)
Быть может драйвер позволяет контролировать состояние платы, соответствующей виртуальному порту каким-либо запросом?
Быть может есть возможность производить диагностику плат до открытия виртуального COM-порта?
Re: Как программно проверить доступность EM100 перед началом работы?
Для чистоты эксперимента перенёс процедуру приема из таймера в отдельный поток. К сожалению, это не дало никакого эффекта. Поток со стандартным приоритетом останавливается при "зависании" в момент передачи байта в виртуальный COM-порт, если соответствующая ему плата TIBBO с модулем ЕМ100 в момент передачи обесточена.

Хелп, плеазе!...
Заказчики давят, уже сожалею, что не пошли по пути прокладки отдельной сети телеконтроля и связи по RS-485...
Re: Как программно проверить доступность EM100 перед началом работы?
Доброго времени суток.
К сожалению, я давно не практиковал программирование под ПК, но попробую описать в чем скорее всего ваша проблема.

Итак, если модуль EM100 включен, то работает все отлично. При отключении питания - возникают зависания и задержки. Логично предположить, что из-за отсутствия ответов.
Все это логично и драйвер тут не при чем, так же как и сам модуль.

При посылке данных в ком порт - программа пытается "действительно передать" ваш байт. Это тоже - что принять данные из несуществующего соединения. Таймауты выставлены по умолчанию и они большие, следовательно возникают зависания.

В общем чтобы исправить ситуацию - передавайте данные в отдельном потоке, так же как и принимайте данные в отдельном потоке.
Т.е. один поток - ваша программа, второй поток - слушаем данные. При необходимости отправки - создаем третий поток, который отдельно от основной программы разбирается сам - передаются данные или нет.

Второй вариант. При открытии ком порта была такая структура... TIMEOUTS, кажется, называется. В ней можно задавать таймауты на прием/передачу. Выставьте мизерные значения этих таймаутов (в пределах разумного) и момент "зависания" будет не заметен для пользователя.

Если не получится - пишите, будем разбираться дальше.
Отредактировано: support_tibbo 30.03.2011 15:34
Re: Как программно проверить доступность EM100 перед началом работы?
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
Полное описание приложил.

Мало того, что нужно работу с портом распараллелить (кстати, не обязательно запись/чтение в разных потоках. Если запрос/ответ, то можно и в одном, но отдельном от основного потока), так еще и нужно выделить процессорное время: SetThreadPriority(nProcess, THREAD_PRIORITY_TIME_CRITICAL). Иначе будет обрыв в обмене.
Отредактировано: Олег Плюснин 30.03.2011 15:44
Re: Как программно проверить доступность EM100 перед началом работы?
ага, спасибо!

попробую для начала уменьшит таймаут
действительно логично, должен сократиться период зависания
распараллелить опрос и обмен байтами - также логично, если не поможет первый вариант - согласен, выход
вот тока я уже пробовал с TThread
WriteFile в порт с обесточенным модулем подвешивает все потоки приложения, даже не связанные портом, если тока не задать им сумасшедший приоритет
а сумасшедший приоритет потоков приведёт к конфликту с другими приложениями сервера

а разве у TIBBO нет какой-нибудь dll c функцией, позволяющей контролировать наличие-отсутсвие удалённых клиентов? чтобы даже не открывать тот вирутальный порт, модуль которого обесточен
это, мне кажется, было бы как-то грамотней и красивей, чем обходить проблему огородами...
и в этом случае можно было бы отличить потерю связи с контролируемым объектом (аварию сети) от аварии самого объекта
DS Manager это делает моментом...
Отредактировано: fiatik fiatik 31.03.2011 10:35
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 30.03.2011 15:39
___
Цитата:


спасибо, скачал статью
полезная и интересная: разобраться с каждым нюансом работы драйвера порта самому вечно недосуг)
Отредактировано: fiatik fiatik 31.03.2011 10:38
Re: Как программно проверить доступность EM100 перед началом работы?
Я конечно слаб в Тиббо, но... почему бы просто не пингануть Ведь у любого устройства есть IP. Хуже с динамическим, но тоже придумать можно. Хотя реализация самого пинга не так проста как кажется, с программной точки зрения, но в сети полно бесплатных компонент для пинга. Качаем, вставляем, пользуемся.
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 31.03.2011 10:38
Я конечно слаб в Тиббо, но... почему бы просто не пингануть Ведь у любого устройства есть IP. Хуже с динамическим, но тоже придумать можно. Хотя реализация самого пинга не так проста как кажется, с программной точки зрения, но в сети полно бесплатных компонент для пинга. Качаем, вставляем, пользуемся.


да уже пробую по сокету) собсна работает...
у TIBBO EM100 статический айпи, всё намана

но сие - последний вариант
проблемную прогу писал не я сам, писала девочка, которая у нас уже не работает
убедить её на серьёзные переработки дорогого стоит)
и с сокеты она никогда не юзала: придётся учить

другое дело - в общем цикле опроса, скажем, проверять порт перед открытием
ну делает же это DS Manager
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: support_tibbo 30.03.2011 15:32
Логично предположить, что из-за отсутствия ответов.
Все это логично и драйвер тут не при чем, так же как и сам модуль.


увы, позволю себе усомниться
зависание происходит при выполнении единственной стандартной API функции WriteFile
даже в упрощённой программе, которая не требует никакого ответа, просто передаёт в порт один единственный байт

скажем, при работе с виртуальным портом, подключенным по USB такого не происходит, даже если его нагло выдернуть в процессе работы из ПК (можете сами убедиться, я сейчас специально перепроверил это со стандартным пролификом)

вообще, мне вот представляется логичным предположение, что программисты TIBBO заложили в своих библиотеках все функции контроля удалённых модулей, включая чтение конфигурации
только я на сайте TIBBO их описания, к сожалению, не нашёл, а ответа от TIBBO не дождался
видимо мой английский оставляет желать лучшего)))
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: fiatik 31.03.2011 10:45

другое дело - в общем цикле опроса, скажем, проверять порт перед открытием
ну делает же это DS Manager

Спешу Вас огорчить. Поиск модуля делается широковещательным опросом. А проверка наличия - его пингом. Перехватите трафик и убедитесь. Через открытие СОМ-порта, посылом туда чего-то, ожиданием ответа и последующим закрытием несколько кхм... геморройно.

Цитата: fiatik 31.03.2011 11:14

увы, позволю себе усомниться
зависание происходит при выполнении единственной стандартной API функции WriteFile
даже в упрощённой программе, которая не требует никакого ответа, просто передаёт в порт один единственный байт

скажем, при работе с виртуальным портом, подключенным по USB такого не происходит, даже если его нагло выдернуть в процессе работы из ПК (можете сами убедиться, я сейчас специально перепроверил это со стандартным пролификом)

Тут уж вопросы к Мелкомягким. Эта АПИ функция хоть и делает все для всех устройств и файлов, однако очень по-разному. Точнее 3 функции CreateFile(), WriteFile(), ReadFile().

Цитата: fiatik 31.03.2011 11:14

вообще, мне вот представляется логичным предположение, что программисты TIBBO заложили в своих библиотеках все функции контроля удалённых модулей, включая чтение конфигурации
только я на сайте TIBBO их описания, к сожалению, не нашёл, а ответа от TIBBO не дождался
видимо мой английский оставляет желать лучшего)))

А зачем? Ведь модули идут в большинстве своем как некий конструктор. Вы сами собираете, программируете и настраиваете как нужно. Конечное устройство идет уже со своим ПО. Какое-то даже платное. Получается, что написав что-то для ПК в одном случае использовать не нужно, т.к. программа управления Тиббо будет написана пользователем, а в другом случае уже есть под конкретную реализацию. Для управления и первоначальной настройки ПО есть.
Отредактировано: Олег Плюснин 31.03.2011 11:51
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 31.03.2011 11:51
Спешу Вас огорчить. Поиск модуля делается широковещательным опросом. А проверка наличия - его пингом.

ага, спасип
ясно, это собсна и неплохо
а протокол опроса известен?

хотя, собсна при обращении по сокету так и так ничего не зависает, ошибки 10053 или 10060 легко отслеживаются
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 31.03.2011 11:51

А зачем? Ведь модули идут в большинстве своем как некий конструктор. Вы сами собираете, программируете и настраиваете как нужно. Конечное устройство идет уже со своим ПО. Какое-то даже платное. Получается, что написав что-то для ПК в одном случае использовать не нужно, т.к. программа управления Тиббо будет написана пользователем, а в другом случае уже есть под конкретную реализацию. Для управления и первоначальной настройки ПО есть.


ахм
ну, тут позволю себе согласиться не полностью
собсна то, что я сейчас, судя по всему, буду вынужден реализовывать под сокет, уже, скорее всего, реализовано разработчиками в DLL, которой комплектуется стандартное ПО для настройки TIBBO
и тот же широкополосный опрос, и тот же пинг, и запрос конфигурации
както далёк от мысли, что программисты TIBBO всё это реализуют в самих экзешниках DS Manager и т.д.
эти DLL свободны для скачивания и распространиения и, так или иначе, устанавливаются вместе с драйвером
вот мне какта и надеялось избежать лишней дурной работы) ну и потом, это дало бы дополнительные возможности системе для самоконтроля
а если бы была возможность избежать программирования сокетов - было бы вообще замечательно
я вот сейчас чешу затылок: сколько времени пройдёт, пока программистка освоит непривычные концепции и переделает прежнюю программу...
и скока сил и времени уйдёт на проверки и отладки...

впрочем, не настаиваю: голимое имхо
на нет - суда нет)
так или иначе спасибо
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 31.03.2011 11:51
Перехватите трафик и убедитесь.

вау, а этого я не умею, честно говоря

но - смотрите - это опять метод научного тыка вместо чтения документации)
Re: Как программно проверить доступность EM100 перед началом работы?
Если разработчик закрыл протокол и не публикует его, значит для чего-то это сделал. Мы тут не в силах повлиять.
С нуля написать пинг займет день-два. Лучше использовать компоненту. Тогда 2-3 часа. Ну а то, что программист не знает сокеты... я промолчу. Году в 2000 это было бы простительно. А вот избежать сокетов при программировании сетевого устройства тяжко и как показала практика - неэффективно.
Отредактировано: Олег Плюснин 31.03.2011 13:50
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 31.03.2011 13:48
Ну а то, что программист не знает сокеты... я промолчу.

хе))
а как тогда программисты, не знающие, что целочисленные типы данных таки имеют отличия от чисел с плавающей точкой? или ваще не отличающие процедуру от функции?
люди сидят всю жизнь в своей галактике, 1С или фоксе, на проблемы заявляют - это мы не проходили) зато прекрасно умеют намекать на оплату сверхурочных по устранению собственных хомутов)
а как они любят тестировать продукты сторонних производителей (то бишь нас, этаких гадких) на предмет отысканий поводов недоплатить за работу)!

да могу научить...
и так я её два года мона сказать учил по мере необходимости, ещё студенткой
что
Re: Как программно проверить доступность EM100 перед началом работы?
Цитата: Олег 31.03.2011 13:48
С нуля написать пинг займет день-два. Лучше использовать компоненту. Тогда 2-3 часа.


ахм.. лана, хоть меня тута и упрекнули в склонности к ужасному флуду..

с использованием стандартного Indy 15 минут:

procedure TFormMain.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
if AReplyStatus.FromIpAddress'0.0.0.0'
then Memo1.Lines.Add('Есть ответ от '+AReplyStatus.FromIpAddress
+' '+IntToStr(AReplyStatus.MsRoundTripTime))
else Memo1.Lines.Add('Истёк таймаут ожидания ответа '+IntToStr(AReplyStatus.MsRoundTripTime));

end;

procedure TFormMain.SBPingClick(Sender: TObject);
begin
IdIcmpClient1.Host:='192.168.0.145';
IdIcmpClient1.ReceiveTimeout:=1000;//таймаут ожидания ответа - секунда
IdIcmpClient1.Port:=1001;
IdIcmpClient1.Ping();
end;

с использованием API - полчаса-час
----------
но - это всё неграмотный и некорректный подход, имхо
правильней использовать функции DLL разработчика
никто и никогда их не держит в тайне специально
отсутствие информации об оборудовании - однозначная недоработка службы поддержки
Отредактировано: Олег Плюснин 19.04.2011 09:57
 
SCANCODE Москва, 123423, ул. Народного Ополчения, д. 34, офис 301 ELDORADO.CMS 3.9.3