Автор |
Повідомлення |
Повідомлення створено: 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
|
Прикрепляю параметры транспортов.
Вкладений файл
transport_in.jpeg (Тип файлу: image/jpeg, Розмір: 49.35 кілобайтів) — 2218 завантажень
|
Повідомлення створено: 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:
Да, в случае отправки пустого сообщения он просто читает из порта и если туда что-то пришло без запроса то возвращает данные в ответе, что и является пулингом, который можно чередовать с типовыми запросами.
Огромное спасибо. Буду пробовать, принцип понял.
|