УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

Пользователький протокол


Автор Сообщение
Сообщение создано: 12. 12. 2019 [09:26]
ShuraF
Aleksandr Fenogentov
Создатель темы
Зарегистрирован(а) с: 08.08.2019
Сообщения: 50
Создал Пользовательский протокол. Все работает кроме того что в логах постоянно "Время чтения истекло".

JAVASCRIPT
req2 = SYS.XMLNode().setAttr("ProtIt","m230_eth").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x06,0x03,addr_H,addr_L,0x1E));
SYS.Transport["Sockets"]["out_"+transport].messIO(req2,"UserProtocol");


Т.е. req2 прекрасно получает данные из Протокола, но позже в логах появляется ошибка

В чем причина?


[2019-12-12T10:03:51.949627] Время чтения истекло.

[2019-12-12T10:03:49.948415] Получено
00: 09 09 20 06 09 0B 0A 0B A3 38 .. ......8

[2019-12-12T10:03:49.861860] Передано
00: 09 08 00 A6 02 .....

[2019-12-12T10:03:49.860699] Время чтения истекло.

[2019-12-12T10:03:47.858535] Получено
00: 09 69 00 56 22 FF FF FF FF 28 00 96 A0 FF FF FF .i.V"....(......
10: FF ED 28 ..(

[2019-12-12T10:03:47.746750] Передано
00: 09 05 00 00 13 B9 ......

[2019-12-12T10:03:47.745465] Время чтения истекло.

[2019-12-12T10:03:45.743438] Получено
00: 09 A6 30 19 10 00 12 12 19 1E D4 2F ..0......../

[2019-12-12T10:03:45.646647] Передано
00: 09 08 13 E7 CF .....

[2019-12-12T10:03:45.645648] Время чтения истекло.

[2019-12-12T10:03:43.643466] Получено
00: 09 00 07 E0 ....

[2019-12-12T10:03:43.550551] Передано
00: 09 01 01 01 01 01 01 01 01 1D D1 ...........

[2019-12-12T10:03:43.550129] Запущен

[2019-12-12T10:03:43.549321] Подключение к '10.150.9.17'

[2019-12-12T10:03:43.549263] Разрешение '10.150.9.17'
Сообщение создано: 18. 12. 2019 [09:33]
ShuraF
Aleksandr Fenogentov
Создатель темы
Зарегистрирован(а) с: 08.08.2019
Сообщения: 50
Что же все-таки происходит?

Откуда берутся " Время чтения истекло.", если все работает и все из пользовательского протокола передается в логику.

По какому критерию это оценивается, если данные из функции возвращаются?
Сообщение создано: 18. 12. 2019 [10:34]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"ShuraF" wrote:

Что же все-таки происходит?

http://oscada.org/wiki/Special:MyLanguage/Modules/Serial#Notes

Learn, learn and learn better than work, work and work.
Сообщение создано: 18. 12. 2019 [13:13]
ShuraF
Aleksandr Fenogentov
Создатель темы
Зарегистрирован(а) с: 08.08.2019
Сообщения: 50
Но это не последовательный интерфейс, это TCP.

Получается, что Транспорт не распознает окончание приема (конец пакета) и даже когда мы "выкинули" данные вызвавшей подзадаче, транспорт все равно сидит и слушает (как это указано для последовательных интерфейсов). И нет смысла ждать пропадания в логах этих сообщений и главное подобрать таймаут?
Сообщение создано: 18. 12. 2019 [13:43]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"ShuraF" wrote:

Но это не последовательный интерфейс, это TCP.

Получается, что Транспорт не распознает окончание приема (конец пакета) и даже когда мы "выкинули" данные вызвавшей подзадаче, транспорт все равно сидит и слушает (как это указано для последовательных интерфейсов). И нет смысла ждать пропадания в логах этих сообщений и главное подобрать таймаут?

Читать нужно учитывая размер (критерий окончания) посылки протокола, а не слепо читать из канала до нулевого сообщения — прерывания по таймауту!

Примеры смотрим!

Learn, learn and learn better than work, work and work.
Сообщение создано: 20. 12. 2019 [12:48]
ShuraF
Aleksandr Fenogentov
Создатель темы
Зарегистрирован(а) с: 08.08.2019
Сообщения: 50
Так ничего и не понял: Что является критерием окончания. Чего оно ждет если я "все прочитал и уже отправил наверх"...
Но оно само как то прошло, перестали появляться записи

Тестирую на двух приборах Меркурий.
Если один опрашивать то цикл чтения 10 атрибутов, даже со считыванием архива порядка 1 секунды. Если включать опрос второго, то появляются Записи о превышении таймаута, период опроса поднимается до 50 секунд. Короче Меркурий+Uport5100+TCP_опрос меркурии плохо переносят.

Есть ли возможность блокировать работу Транспорта для Контроллера пока с ним работает другой Контроллер, Т.е. установка своеобразного Симофора?
Сообщение создано: 23. 12. 2019 [14:54]
ShuraF
Aleksandr Fenogentov
Создатель темы
Зарегистрирован(а) с: 08.08.2019
Сообщения: 50
Т.к. контроллеры "мешают" друг другу.
То присвоил им разные Приоритет задачи получения данных (101 и 102) и задал период опроса 10 секунд,

Сообщение создано: 21. 01. 2020 [22:04]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
http://oscada.org/wiki/Special:MyLanguage/Documents/DAQ#LogicLev
Прямая работа с выходным транспортом функции string messIO( string mess, real timeOut = 0 ); не предусматривает блокирования транспорта поза вызовом этой функции, а соответственно, для сложных протоколов с посылками ответа более чем в одном пакете, что предусматривает процесс "дожидания", не можно использовать общий транспорт, по которому возможна отправка пакетов различных протоколов или даже один, но в различных задачах (объектах контроллеров). Соответственно, если есть необходимость использования совместного транспорта, то размещайте параметры опроса по протоколу в одном объекте контроллера (задаче) или используйте модуль пользовательского протокола, к которому это замечание не имеет отношения, поскольку он осуществляет такое блокирование на время вызова процедуры обработки, как и остальные модульные протоколы OpenSCADA.


Learn, learn and learn better than work, work and work.



2474