PDA

Просмотр полной версии : Как уменьшить таймаут ожидания ответа



Andrey_M
10.09.2012, 12:56
Используем библиотеку ОВЕН для своих систем и все бы ничего, но "убивает" большой таймаут ожидания ответа на запросы мастера. Если все устройства работают нормально, цикл опроса преемлемый (300-500 мс), но стоит какому-либо устройству "отвалиться" - все вешалка, цикл затягивается до 5 сек и более. Можно-ли в вашей библиотеке принудительно ограничить таймаут ожидания ответа до единиц-десятков милисекунд?
И еще, не нашел на вашем сайте саму библиотеку, у меня она от 05.10.2011, обновления были?

Andrey_M
19.09.2012, 19:22
И что, овен-овские спецы на форум вообще не заглядывают? Хоть как-то отреагируйте, типа "нет, нельзя, мучайтесь как есть".

capzap
19.09.2012, 19:24
сами напишите

capzap
22.09.2012, 22:27
http://www.owen.ru/catalog/67395347
на этой странице выложены библиотеки, назовем их, официально поддерживаемые, там нет ни одной за 2011 год, ежели вопрос задаете укажите хотябы, что имеете ввиду, без названия бибки трудно отвечать в ней дело или в Вашей проге.
Если уж совсем так плохо, поставте поверх свой таймаут, если по истечении не пришел ответ, переходите к опросу следующего прибора.

Andrey_M
23.09.2012, 10:33
Речь идет о "owen_io.dll" (http://www.owen.ru/catalog/69481466).

capzap
23.09.2012, 15:49
большой таймаут ожидания ответа на запросы мастера

А как обстоят дела с выполнением этих рекомендаций:
2.8. Каждое пришедшее сообщение должно квитироваться. Квитанция должна быть послана после задержки, большей или равной времени, указанной в параметре rS.dL прибора, но не более максимального тайм-аута в 50 мс. При этом типовая задержка между отправкой последнего байта посылки до приема первого байта квитанции должна быть не менее rS.dL и не более rS.dL + 5мс. При отсутствии квитанции от прибора в течение 50 мс транзакцию приема-передачи считать сбойной.
2.9. При посылке сообщения или квитанции допускается прерывание потока посылаемых байт на время, не превышающее 50 мс.
2.10. После посылки сообщения или квитанции посылающая сторона должна освободить линию передачи и перейти в режим приема не более чем через 1.1 мс после посылки последнего байта.

Для автоматических преобразователей работа с линиями RTS или DTR не требуется. Однако существует время, в течение которого автоматический преобразователь удерживает линию в состоянии передачи и может потерять начало квитанции прибора. Для работы с автоматическими преобразователями в параметре rS.dL приборов необходимо установить задержку, большую, чем время переключения автоматического преобразователяrS.dL в приборах какое значение имеет? Судя по всему если прибор "отваливается" то максимум задержка может быть 50мс к Вашему времени опроса

Andrey_M
23.09.2012, 18:14
Во всех приборах "rS.dL" выставляю 1 мс.
А вот дальше уже у ваших программеров надо спрашивать как они реализовали п.2.8. Потому-что при отсутствии ответа от слейва, мастер делает еще четыре повтора (если не ошибаюсь), причем паузы между ними приличные - порядка 300-500 мс. Отсюда и задержка в 1,5-2 сек на каждую точку.

capzap
23.09.2012, 19:21
Хм, может все же это Ваша программа делает повторы, зачем тогда придуманы сообщения об ошибках, видимо Вы их не отслеживаете, тем более такие периоды пауз,

Andrey_M
23.09.2012, 20:35
Нам нет никакого смысла делать столько повторов, тем более что мы хотим от этого избавиться и если-бы это было в наших силах - давно бы убрали. Повторы делает сама функция owen_io.ReadUInt и ей подобные!

Вот пример кода (RetryCount задается в конфиге программы и обычно равно 0 или 1):


function _ReadUInt(const Address: TAddress; out Value: DWORD): Boolean;
var
I: Integer;
begin
Result := False;
IOSync.Enter;
try
LastError := owen_io.SelectPort(Address.Port);
if LastError <> ERR_OK then
Exit;
LastError := owen_io.ReadUInt(Address.Addr, ADRTYPE_11BIT, @Address.Code, Value, -1);
for I := 1 to RetryCount do
begin
if LastError = ERR_OK then
Break;
LastError := owen_io.ReadUInt(Address.Addr, ADRTYPE_11BIT, @Address.Code, Value, -1);
end;
if LastError <> ERR_OK then
Exit;
finally
IOSync.Leave;
end;
Result := True;
end;

capzap
23.09.2012, 21:04
я как бы далек от паскаля, поэтому хотел бы прояснить, вот пару раз проверка усовия на наличие ошибок ладно, Result будет фальш, а что происходит когда появляется исключение, Result то будет истина, может причина в этом, что правильное завершение функции ведет к тормозам где полученный мусор присваивается какой нибудь переменной

Andrey_M
23.09.2012, 21:47
Исключение подразумевает случайный сбой, я же говорю о прямой связи - выключили автомат на каком-то шкафу - прибор отвалился из сетки - пошли тормоза. Автомат включили - все работает. Многократные запросы к отвалившемуся прибору и паузы между ними я вижу своими глазами по светодиоду на преобразователе RS232-RS485. Все полученные данные обрабатываются в управляющих алгоритмах и пишутся в файл. Если бы мы получали мусор, то у нас бы пошло спонтанное включение-выключение узлов и т.п., все данные можно просмотреть на графиках и весь неадекват мы бы давно уже увидели.

capzap
23.09.2012, 22:00
я посмотрел примеры идущие с библиотекой для дельфи, но что то так и не нашел, код подобный Вашему, везде функция ReadUInt запускается один раз, а у Вас перед циклом запущена и в теле цикла насколько я понимаю может прогнаться, это с какой целью сделано, результаты работы изменяются, если закомментировать цикл

Andrey_M
23.09.2012, 22:26
А что в коде то непонятно.
1.Выбираем активный порт, если ОК, то дальше.
2.Пытаемся прочитать ReadUInt.
3.Далее если RetryCount=0 (у нас он или 0 или 1) , то без цикла, и если не было ошибки, то:
4.Result := True и считанное значение в Value.
Если же RetryCount не ноль, то входим в цикл и сразу же проверяем результат предыдущего ReadUInt, если было ОК, то второй раз не считываем, а выходим на п.4. Если же была ошибка, то пытаемся прочитать RetryCount-раз.
От значения переменной RetryCount характер работы совершенно не меняется.

capzap
23.09.2012, 22:37
а как себя ведет такой цикл когда начальное значение равно единице, а считать надо до нуля, тут не может быть выбрашено исключение?

И опять же, если прибор отсутствует то значит будет ошибка и в теле цикла бреак не сработает, а следовательно Вы повторно отправите запрос получив еще раз ошибку, а кто то утверждал
Повторы делает сама функция owen_io.ReadUInt и ей подобные!:)

Andrey_M
23.09.2012, 22:47
Если RetryCount=0, то библиотека делает 5 повторов, если RetryCount=1, то библиотека делает 10 повторов, так понятнее?
Наши программы на этом движке работают не первый год и глюков кроме вышеописанного не наблюдалось.

capzap
23.09.2012, 23:05
Если RetryCount=0, то библиотека делает 5 повторов, если RetryCount=1, то библиотека делает 10 повторов, так понятнее?
Наши программы на этом движке работают не первый год и глюков кроме вышеописанного не наблюдалось.

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

Andrey_M
23.09.2012, 23:23
Ну как вы не поймете. Я вызываю функцию owen_io.ReadUInt и она сама выполняется 2 секунды если нет ответа от прибора! Никакие циклы и проверки тут не причем!
А по любым языкам программирования for I := 1 to 0 do никогда не выполняется тело цикла.

Andrey_M
24.09.2012, 19:11
Сегодня специально накидал тест и проверил еще раз. Раз в 5 сек делаю пять запросов. Если ответа от прибора нет библиотека делает два запроса на каждую функцию ReadUInt, время ее выполнения в среднем 640 мсек. Если прибор отвечает, то время выполнения ReadUInt 16 мсек.
Вот лог программы:



Время : 16:21:33,578
Ошибка чтения : Устройство не отвечает
Время : 16:21:34,217
Ошибка чтения : Устройство не отвечает
Время : 16:21:34,859
Ошибка чтения : Устройство не отвечает
Время : 16:21:35,500
Ошибка чтения : Устройство не отвечает
Время : 16:21:36,140
Ошибка чтения : Устройство не отвечает
Время : 16:21:36,781

Время : 16:21:38,577
Ошибка чтения : Устройство не отвечает
Время : 16:21:39,217
Ошибка чтения : Устройство не отвечает
Время : 16:21:39,859
Ошибка чтения : Устройство не отвечает
Время : 16:21:40,500
Ошибка чтения : Устройство не отвечает
Время : 16:21:41,139
Ошибка чтения : Устройство не отвечает
Время : 16:21:41,780

Время : 16:21:43,592
Ошибка чтения : Устройство не отвечает
Время : 16:21:44,233
Ошибка чтения : Устройство не отвечает
Время : 16:21:44,874
Ошибка чтения : Устройство не отвечает
Время : 16:21:45,514
Ошибка чтения : Устройство не отвечает
Время : 16:21:46,155
Ошибка чтения : Устройство не отвечает
Время : 16:21:46,795

Время : 16:21:48,593
Ошибка чтения : Устройство не отвечает
Время : 16:21:49,234
Ошибка чтения : Устройство не отвечает
Время : 16:21:49,874
Ошибка чтения : Устройство не отвечает
Время : 16:21:50,514
Ошибка чтения : Устройство не отвечает
Время : 16:21:51,155
Ошибка чтения : Устройство не отвечает
Время : 16:21:51,796

Время : 16:21:53,593
Ошибка чтения : Устройство не отвечает
Время : 16:21:54,234
Ошибка чтения : Устройство не отвечает
Время : 16:21:54,874
Ошибка чтения : Устройство не отвечает
Время : 16:21:55,514
Ошибка чтения : Устройство не отвечает
Время : 16:21:56,156
Ошибка чтения : Устройство не отвечает
Время : 16:21:56,796

Время : 16:21:58,592
Ошибка чтения : Устройство не отвечает
Время : 16:21:59,233
Ошибка чтения : Устройство не отвечает
Время : 16:21:59,874
Ошибка чтения : Устройство не отвечает
Время : 16:22:00,514
Ошибка чтения : Устройство не отвечает
Время : 16:22:01,156
Ошибка чтения : Устройство не отвечает
Время : 16:22:01,795

Время : 16:22:03,593
Ошибка чтения : Устройство не отвечает
Время : 16:22:04,233
Ошибка чтения : Устройство не отвечает
Время : 16:22:04,874
Ошибка чтения : Устройство не отвечает
Время : 16:22:05,515
Ошибка чтения : Ошибочный ответ от прибора
Время : 16:22:06,125
Прочитано : 0
Время : 16:22:06,436

Время : 16:22:08,592
Прочитано : 0
Время : 16:22:08,592
Прочитано : 0
Время : 16:22:08,609
Прочитано : 0
Время : 16:22:08,624
Прочитано : 0
Время : 16:22:08,640
Прочитано : 0
Время : 16:22:08,656

Время : 16:22:13,592
Прочитано : 0
Время : 16:22:13,592
Прочитано : 0
Время : 16:22:13,609
Прочитано : 0
Время : 16:22:13,624
Прочитано : 0
Время : 16:22:13,640
Прочитано : 0
Время : 16:22:13,655

Время : 16:22:18,592
Прочитано : 0
Время : 16:22:18,592
Прочитано : 0
Время : 16:22:18,608
Прочитано : 0
Время : 16:22:18,625
Прочитано : 0
Время : 16:22:18,640
Прочитано : 0
Время : 16:22:18,655

Время : 16:22:23,592
Прочитано : 0
Время : 16:22:23,592
Прочитано : 0
Время : 16:22:23,608
Прочитано : 0
Время : 16:22:23,625
Прочитано : 0
Время : 16:22:23,640
Прочитано : 0
Время : 16:22:23,656

Время : 16:22:28,592
Прочитано : 0
Время : 16:22:28,592
Прочитано : 0
Время : 16:22:28,609
Прочитано : 0
Время : 16:22:28,625
Прочитано : 0
Время : 16:22:28,639
Прочитано : 0
Время : 16:22:28,655

Время : 16:22:33,593
Прочитано : 0
Время : 16:22:33,593
Прочитано : 0
Время : 16:22:33,608
Прочитано : 0
Время : 16:22:33,625
Прочитано : 0
Время : 16:22:33,640
Прочитано : 0
Время : 16:22:33,655

Время : 16:22:38,593
Прочитано : 0
Время : 16:22:38,593
Прочитано : 0
Время : 16:22:38,608
Прочитано : 0
Время : 16:22:38,625
Прочитано : 0
Время : 16:22:38,639
Прочитано : 0
Время : 16:22:38,655

Andrey_M
29.09.2012, 13:15
Похоже на этом форуме не только спецов, но даже и модераторов нет.

capzap
29.09.2012, 14:50
ну почему же спецов нет, в поиске если набрать хотя бы имя библиотеки, то найдутся целые темы, где есть вопросы по работе с ней и ответы тех кто с ней работает