Автор |
Сообщение |
Сообщение создано: 22. 10. 2012 [14:52]
|
legend
Oleg N
Создатель темы
Зарегистрирован(а) с: 13.04.2012
Сообщения: 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, работает стабильно.
Еще по-моему где-то на форуме читал, что нельзя одновременно использовать входящий и исходящий транспорт.
В чем может быть причина отключения входного транспорта?
|
Сообщение создано: 22. 10. 2012 [15:08]
|
legend
Oleg N
Создатель темы
Зарегистрирован(а) с: 13.04.2012
Сообщения: 63
|
Прикрепляю параметры транспортов.
Вложенный файл
|
Сообщение создано: 22. 10. 2012 [15:59]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
|
Сообщение создано: 22. 10. 2012 [16:18]
|
legend
Oleg N
Создатель темы
Зарегистрирован(а) с: 13.04.2012
Сообщения: 63
|
Понятно. Спасибо за ответ.
Объясню почему решил задействовать одновременно входящий и исходящий транспорт.
1. Опрашиваемый контроллер в случае аварии посылает в сеть CAN соответствующее сообщение, которое я могу отследить только через входящий транспорт. Поэтому требуется постоянный мониторинг входного транспорта.
2. Иногда получается так, что при запросе какого-либо параметра, в ответ приходит посылка с другой информацией, т.е. требуется фильтрация. Поэтому проще одной подпрограммой посылать несколько сообщений, другой анализировать входящий поток с ответами на запросы и общей информацией, которая ходит по шине.
|
Сообщение создано: 22. 10. 2012 [16:25]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"legend" wrote:
1. Опрашиваемый контроллер в случае аварии посылает в сеть CAN соответствующее сообщение, которое я могу отследить только через входящий транспорт. Поэтому требуется постоянный мониторинг входного транспорта.
Не только
"legend" wrote:
2. Иногда получается так, что при запросе какого-либо параметра, в ответ приходит посылка с другой информацией, т.е. требуется фильтрация. Поэтому проще одной подпрограммой посылать несколько сообщений, другой анализировать входящий поток с ответами на запросы и общей информацией, которая ходит по шине.
Это всё можно объединить не прибегая к входящему транспорту.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 22. 10. 2012 [16:39]
|
legend
Oleg N
Создатель темы
Зарегистрирован(а) с: 13.04.2012
Сообщения: 63
|
"roman" wrote:
Это всё можно объединить не прибегая к входящему транспорту.
Я так понимаю это можно сделать при помощи отправки пустых сообщений в порт и анализа входящих сообщений?
|
Сообщение создано: 22. 10. 2012 [16:48]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"legend" wrote:
Я так понимаю это можно сделать при помощи отправки пустых сообщений в порт и анализа входящих сообщений?
Да, в случае отправки пустого сообщения он просто читает из порта и если туда что-то пришло без запроса то возвращает данные в ответе, что и является пулингом, который можно чередовать с типовыми запросами.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 22. 10. 2012 [16:51]
|
legend
Oleg N
Создатель темы
Зарегистрирован(а) с: 13.04.2012
Сообщения: 63
|
"roman" wrote:
Да, в случае отправки пустого сообщения он просто читает из порта и если туда что-то пришло без запроса то возвращает данные в ответе, что и является пулингом, который можно чередовать с типовыми запросами.
Огромное спасибо. Буду пробовать, принцип понял.
|