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

[BugFixed] Нестабильность ModBus


Автор Сообщение
Сообщение создано: 29. 01. 2010 [17:30]
petr
Petro Litkovets
Contributor
Создатель темы
Зарегистрирован(а) с: 12.01.2010
Сообщения: 27
На ALT Linux 5.0 обновил Open SCADA до версии 0.6.4.1 , локальная сборка с помощью svn update.
1. Не правильно отображаются атрибуты параметров для ModBus RTU.
В подсистеме "Транспорты" для последовательного интерфейса создал выходной транспорт который работает с USB-RS485 адаптером.После настройки временных интервалов ошибки исчезли, "EVAL" перестало появляться вообще.
В подсистеме "Сбор данных" в модуле "ModBus" создал контроллер с параметрами и атрибутами. Ошибка =0,т.е. ошибки нету, но атрибуты отображаются циклически нестабильно,
несколько секунд правильно, а потом значения атрибутов отображаются не на своих местах, как будто данные для атрибутов присваиваются не по адресу, т.е. сами данные правильные, но присваиваются хаотически к разным переменным.
у меня на машине две локальных сборки Open SCADA. На старой которую скачал 07.01.2010 через "svn co" этой ошибки нету.

http://s45.radikal.ru/i110/1001/70/46c7c72b14a8.png
Рис. 1 Несколько секунд отображается правильно.

http://s005.radikal.ru/i211/1001/f2/e36810ca4b44.png
Рис.2 Данные для атрибутов отображаются не по адресу

http://s58.radikal.ru/i160/1001/50/11325565f785.png
Рис.3 Еще по другому

2. На графиках не отображается "Панель группы графиков".
Для виджета "Группа графиков" в атрибуте "обработка событий" установлено значение "ws_FocusIn:/trnd1: open:/pg_control/pg_grph_panel_mod".
После установки "ws_FocusIn:/trnd1: open:/pg_control/pg_grph_panel" панель начала отображаться.

3.Перечитал документацию и не нашёл,каким образом, в ModBus RTU, можно считывать два регистра одновременно с одного адреса. Если можно, то как это сделать?
Есть задачи когда надо с помощью функциональных кодов операции 03, 04, 10 считать два регистра которые находятся под одним адресом.


[Сообщение редактировалось 1 раз(а), в последний раз 29.01.2010 в 18:07.]
Сообщение создано: 29. 01. 2010 [19:09]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
petr wrote:

несколько секунд правильно, а потом значения атрибутов отображаются не на своих местах, как будто данные для атрибутов присваиваются не по адресу, т.е. сами данные правильные, но присваиваются хаотически к разным переменным.
у меня на машине две локальных сборки Open SCADA. На старой которую скачал 07.01.2010 через "svn co" этой ошибки нету.

Конфигурация транспорта какая? Там было переделано и таймауты были исправлены. Таймаут подключения был завышен, а время символа подпёрто сверху 1мс. В любом случае у меня корректно работает и ничего не перескакивает.

petr wrote:

2. На графиках не отображается "Панель группы графиков".
Для виджета "Группа графиков" в атрибуте "обработка событий" установлено значение "ws_FocusIn:/trnd1: open:/pg_control/pg_grph_panel_mod".
После установки "ws_FocusIn:/trnd1: open:/pg_control/pg_grph_panel" панель начала отображаться.

Поправил. Завтра обновлю пакет релиза с рядом дополнительных изменений.

petr wrote:

3.Перечитал документацию и не нашёл,каким образом, в ModBus RTU, можно считывать два регистра одновременно с одного адреса. Если можно, то как это сделать?
Есть задачи когда надо с помощью функциональных кодов операции 03, 04, 10 считать два регистра которые находятся под одним адресом.

Как это "два регистра находится под одним адресом"?
Реализованы стандартные механизмы ModBus c применением команд: 0x03, 0x06, 0x01, 0x05, 0x02 и 0x04.
Если нужны нестандартности то это руками посредством функции API ( http://wiki.oscada.org/Doc/OpisanieProgrammy?v=14os#h920-1 ):

int messIO( XMLNodeObj req, string prt ); - отправка запроса <req> к протоколу <prt> для осуществления сеанса связи через транспорт посредством протокола.


Learn, learn and learn better than work, work and work.
Сообщение создано: 29. 01. 2010 [23:30]
petr
Petro Litkovets
Contributor
Создатель темы
Зарегистрирован(а) с: 12.01.2010
Сообщения: 27
Конфигурация транспорта
http://s42.radikal.ru/i096/1001/74/ea12bb747c1b.png

Временные интервалы пробовал увеличивать (586:2 минимальный при котором не возникает ошибка <EVAL> ) но атрибуты параметров всё равно перескакивают и главное нет индикации ошибок ни в транспортах ни в атрибутах
Опять проверил старую версию 0.6.4, там временные интервалы 800:4:400 и при этом работает без ошибок и никаких перескакиваний нету. Должна же быть где то ошибка.

А на счёт передачи нескольких регистров по протоколу ModBus RTU, есть специализировнные контроллеры в которых например под адресом 1586 есть вещественная переменная т.е 4байта или 2 регистра, а под адресом 1587 вторая, под 1588 третья и т.д, Производители пишут, что это у них стандартный протокол.
Прочитал в Wiki: http://ru.wikipedia.org/wiki/Modbus
Стандартные функции протокола Modbus
# 3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers)
# 4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Regist)
# 16 (0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)
Конечно того что уже есть в Open SCADA достаточно для большинства реализаций, тогда буду пробовать функцию int messIO( XMLNodeObj req, string prt ) ,
Только где искать информацию по формированию запроса XMLNodeObj req, есть где то в документации или может смотреть в исходниках?
Linux только начал изучать с начала этого года благодаря Open SCADA , теперь возвращаться к Винде желание полность отпало.
Сообщение создано: 30. 01. 2010 [16:04]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
petr wrote:

Временные интервалы пробовал увеличивать (586:2 минимальный при котором не возникает ошибка <EVAL> ) но атрибуты параметров всё равно перескакивают и главное нет индикации ошибок ни в транспортах ни в атрибутах
Опять проверил старую версию 0.6.4, там временные интервалы 800:4:400 и при этом работает без ошибок и никаких перескакиваний нету. Должна же быть где то ошибка.

На скорости 19200 у меня устойчиво работает при таймингах: 586:8. В данном случае вторая цифра сильно влияет на связь поскольку заложена в вычислении таймаута тишины и дожидания. А ошибку он может не показывать если это не ошибка соединения, а сразу за ошибкой большого пакета нормально опрашивается короткий пакет. Что касается перемещения атрибутов то такого я никогда не видел. В любом случае для отлова подобнного есть лог протокола ModBus и возможность отправки запросов в ручную.

petr wrote:

А на счёт передачи нескольких регистров по протоколу ModBus RTU, есть специализировнные контроллеры в которых например под адресом 1586 есть вещественная переменная т.е 4байта или 2 регистра, а под адресом 1587 вторая, под 1588 третья и т.д, Производители пишут, что это у них стандартный протокол.

И причём тут два регистра под одним адресом? Это два разных регистра с двумя отдельными адресами, которые после опроса просто нужно объединить. Форум внимательнее читайте. Здесь про это уже неоднократно было.

Learn, learn and learn better than work, work and work.
Сообщение создано: 01. 02. 2010 [00:16]
petr
Petro Litkovets
Contributor
Создатель темы
Зарегистрирован(а) с: 12.01.2010
Сообщения: 27
Роман как всегда оказался прав. Спасибо за подсказку.
Оказывается ввело в заблуждение изменение поведения протокола после нововведений в транспорте.
Если вторая цифра временных интервалов транспорта, которая отвечает за таймаут тишины и дожидания была меньше 2, то индицировало ошибку <EVAL> ,
от 2 до 10 никих ошибок не было, но атрибуты параметров перескакивали с места на место и складывалось впечатление как будто там ошибка в адрессации,
если от 11 и выше работает отлично. Работало пол дня, смотрел графики, ошибки отсутствуют.



7396