EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Последовательный интерфейс. Отключение входного транспорта.


Author Message
Written on: 22. 10. 2012 [14:52]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
Всем добрый день!

При написании драйвера для одного из устройств с нестандартным протоколом столкнулся со следующей проблемой.
Есть контроллер, который с определенной периодичностью (1-60 сек.) отправляет по CAN шине сообщения. Контроллер с компьютером связан при помощи адаптера CAN-USB. Адаптер преобразует CAN посылку в ASCII сообщение и отправляет его в виртуальный COM порт. При настройке пользовательского протокола и входного транспорта Open Scada отлично обрабатывает информацию, расшифровывается протокол и получаются требуемые данные. Обработка протокола происходит в контроллере LogicLev.
Для получения некоторых параметров необходимо отправить запрос устройству и получить ответ. Отправку 5 запросов через исходящий транспорт произвожу через вычислитель на Java, с периодичностью раз в 10 секунд.
Соответственно одновременно работает входной и выходной транспорт одного и того же виртуального COM порта.
Чуть меньше суток программа обрабытывает входящие сообщения и отправляет запросы. Потом, непонятно по какой причине, во входящем транспорте отключается виртуальный порт, т.е. исчезает галочка "Выполняется", и при повторном подключении программа выдает ошибку: "Задача 'sub_Transport.mod_Serial.in_CAN2' уже присутствует!". При этом запросы в COM порт через исходящий транспорт идут и контроллер через адаптер отвечает на эти запросы. После перезапуска Open Scada программа опять начинает работать нормально.

Я пытался менять временные интервалы входного и исходящего транспорта, не помогло. Менял частоту опроса, то же не помогло. Поставил опрос устройства через скрипт на windows, работает стабильно.
Еще по-моему где-то на форуме читал, что нельзя одновременно использовать входящий и исходящий транспорт.

В чем может быть причина отключения входного транспорта?
Written on: 22. 10. 2012 [15:08]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
Прикрепляю параметры транспортов.
Attachment

transport_in.jpeg (File type: image/jpeg, Size: 49.35 kilobytes) — 2218 downloads
transport_out.jpeg (File type: image/jpeg, Size: 48.77 kilobytes) — 2298 downloads
Written on: 22. 10. 2012 [15:59]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"legend" wrote:

Есть контроллер, который с определенной периодичностью (1-60 сек.) отправляет по CAN шине сообщения. Контроллер с компьютером связан при помощи адаптера CAN-USB. Адаптер преобразует CAN посылку в ASCII сообщение и отправляет его в виртуальный COM порт. При настройке пользовательского протокола и входного транспорта Open Scada отлично обрабатывает информацию, расшифровывается протокол и получаются требуемые данные. Обработка протокола происходит в контроллере LogicLev.

Что-то тут запутано. У Вас есть контроллер на шине CAN, которому Вы шлёте запросы? Если так, то зачем входящее соединение? Нужно как обычно по таймауту ждать ответа или пулить ответы отправкой пустых запросов, но ни в коем случае не вешать входящий и исходящий транспорты на одно устройство. Это в принципе не допустимо поскольку там нет ресурса (http://wiki.oscada.org/Doc/Serial#h835-2), кроме работы с модемом.

"legend" wrote:

Для получения некоторых параметров необходимо отправить запрос устройству и получить ответ. Отправку 5 запросов через исходящий транспорт произвожу через вычислитель на Java, с периодичностью раз в 10 секунд.
Соответственно одновременно работает входной и выходной транспорт одного и того же виртуального COM порта.

И это неправильно!

"legend" wrote:

Чуть меньше суток программа обрабытывает входящие сообщения и отправляет запросы. Потом, непонятно по какой причине, во входящем транспорте отключается виртуальный порт, т.е. исчезает галочка "Выполняется", и при повторном подключении программа выдает ошибку: "Задача 'sub_Transport.mod_Serial.in_CAN2' уже присутствует!".

Исключение происходит наверно из-за одновременного доступа к устройству.

"legend" wrote:

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

Именно в этом.

Learn, learn and learn better than work, work and work.
Written on: 22. 10. 2012 [16:18]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
Понятно. Спасибо за ответ.
Объясню почему решил задействовать одновременно входящий и исходящий транспорт.
1. Опрашиваемый контроллер в случае аварии посылает в сеть CAN соответствующее сообщение, которое я могу отследить только через входящий транспорт. Поэтому требуется постоянный мониторинг входного транспорта.
2. Иногда получается так, что при запросе какого-либо параметра, в ответ приходит посылка с другой информацией, т.е. требуется фильтрация. Поэтому проще одной подпрограммой посылать несколько сообщений, другой анализировать входящий поток с ответами на запросы и общей информацией, которая ходит по шине.
Written on: 22. 10. 2012 [16:25]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"legend" wrote:

1. Опрашиваемый контроллер в случае аварии посылает в сеть CAN соответствующее сообщение, которое я могу отследить только через входящий транспорт. Поэтому требуется постоянный мониторинг входного транспорта.

Не только

"legend" wrote:

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

Это всё можно объединить не прибегая к входящему транспорту.

Learn, learn and learn better than work, work and work.
Written on: 22. 10. 2012 [16:39]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
"roman" wrote:

Это всё можно объединить не прибегая к входящему транспорту.

Я так понимаю это можно сделать при помощи отправки пустых сообщений в порт и анализа входящих сообщений?
Written on: 22. 10. 2012 [16:48]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"legend" wrote:

Я так понимаю это можно сделать при помощи отправки пустых сообщений в порт и анализа входящих сообщений?

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

Learn, learn and learn better than work, work and work.
Written on: 22. 10. 2012 [16:51]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
"roman" wrote:

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

Огромное спасибо. Буду пробовать, принцип понял.



8577