PDA

Просмотр полной версии : Modbus(Master)



uvwxyz
06.08.2007, 17:32
Уважаемые разработчики проясните пожалуйста следующую ситуацию.
При работе ПЛК150 с ModbusSlave устройствами возникла следующая проблема. В PLC Configuration создан Modbus(Master). Внутри него создан Universal Modbus Device, внутри которого выбраны несколько(например, 3) Register Input Modul. Опрос Modbus-slave устройства идёт периодически 1 раз в секунду.
Если ответ на запрос приходит позже чем Max timeout,то сообщение об ошибке почему-то отсутствует, но информация из Modbus-slave устройства оказывается не в тех Register Input Modul'ях, из которых она была запрошена. Ответы как бы сдвигаются циклически на одну позицию. Например, информация, запрошенная Register Input Modul 1, оказывается в Register Input Modul 2. Информация, запрошенная Register Input Modul 2, оказывается в Register Input Modul 3. А информация, запрошенная Register Input Modul 3, оказывается в Register Input Modul 1.
При обмене используется интерфейс RS485 и протокол Modbus RTU

uvwxyz
07.08.2007, 13:28
Уважаемые разработчики!
Сделал новую прошивку и установил новый таргет как Вы советовали.
Но ситуация не улучшилась. Теперь сдвиг информации происходит в другом направлении.
Например, информация, запрошенная из Register Input Modul 1, оказывается в Register Input Modul 3. Информация, запрошенная из Register Input Modul 2, оказывается в Register Input Modul 1. А информация, запрошенная из Register Input Modul 3, оказывается в Register Input Modul 2.
Второй мой вопрос.
Не должно ли запаздывание с откликом от Modbus-slave устройства формировать сообщение об ошибке?

Филоненко Владислав
07.08.2007, 15:02
Уважаемые разработчики проясните пожалуйста следующую ситуацию.
При работе ПЛК150 с ModbusSlave устройствами возникла следующая проблема. В PLC Configuration создан Modbus(Master). Внутри него создан Universal Modbus Device, внутри которого выбраны несколько(например, 3) Register Input Modul. Опрос Modbus-slave устройства идёт периодически 1 раз в секунду.
Если ответ на запрос приходит позже чем Max timeout,то сообщение об ошибке почему-то отсутствует, но информация из Modbus-slave устройства оказывается не в тех Register Input Modul'ях, из которых она была запрошена. Ответы как бы сдвигаются циклически на одну позицию. Например, информация, запрошенная Register Input Modul 1, оказывается в Register Input Modul 2. Информация, запрошенная Register Input Modul 2, оказывается в Register Input Modul 3. А информация, запрошенная Register Input Modul 3, оказывается в Register Input Modul 1.
При обмене используется интерфейс RS485 и протокол Modbus RTU

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

1. При старте мастер опросил регистр 1.
2. Устройство стормозило и ответило на запрос после таймаута - мастер высветил ошибку (только один раз, ее легко не заметить).
3. Мастер посылает запрос ко сл. регистру и тут устройство наконец возвращает ответ на предидущий запрос.
4.Мастер радостно кладет значение 1-го регистра в ячейку для 2-го. Цикл 3-4 повторяется.

Решения два.
1. Если устройство постоянно долго думает - выставите таймаут побольше.
2. Если же это единичные случаи, то попробуйте чередовать команды чтения регистров, например 1-й читать командой 0х03, второй 0х04, третий 0х03 и т.д.
В этом случае мастер сможет идентифицировать запаздавшую посылку по номеру команды.

uvwxyz
10.08.2007, 18:21
Уважаемый Филоненко Владислав!
Вопрос №1.
Modbus-slave устройство возврашает запрос хотя и с задержкой, но эта задержка явно меньше 1 секунды. Поэтому, когда Modbus-master формирует новый запрос, ответ на предыдущий запрос уже имеется в его буфере. Складывается впечатление, что Modbus-master не чистит свой буфер перед отправкой запроса. Поэтому, отправив новый запрос, он ответ на предыдущий запрос считает ответом на новый запрос. Так ли это?
Вопрос №2
Если Modbus-master формирует запросы в режиме By poll time,то при нажатии на кнопку "Стоп" выполнение программы, как и следовало ожидать, прекращается, а запросы на линии RS485 от ОВЕНА продолжают поступать. Это видно и по осциллографу и с помощью программ, слушающих линию.
Почему Modbus-master в режиме By poll time при нажатии на кнопку "Стоп" не прекращает выдавать запросы на линию RS485?

незарегистрированный
11.08.2007, 09:22
1) Проверить можно используя by command
2) Обновление области ввода вывода идет независимо от выполнения программы. Т.е. Вы же можете пощелкать релюшками не запапустив программу

Филоненко Владислав
12.08.2007, 20:39
Уважаемый Филоненко Владислав!
Вопрос №1.
Modbus-slave устройство возврашает запрос хотя и с задержкой, но эта задержка явно меньше 1 секунды. Поэтому, когда Modbus-master формирует новый запрос, ответ на предыдущий запрос уже имеется в его буфере. Складывается впечатление, что Modbus-master не чистит свой буфер перед отправкой запроса. Поэтому, отправив новый запрос, он ответ на предыдущий запрос считает ответом на новый запрос. Так ли это?
Вопрос №2
Если Modbus-master формирует запросы в режиме By poll time,то при нажатии на кнопку "Стоп" выполнение программы, как и следовало ожидать, прекращается, а запросы на линии RS485 от ОВЕНА продолжают поступать. Это видно и по осциллографу и с помощью программ, слушающих линию.
Почему Modbus-master в режиме By poll time при нажатии на кнопку "Стоп" не прекращает выдавать запросы на линию RS485?

1. То, что я описал происходит именно так. Экспериментально подтверждено. Сам долго мучился пока не обнаружил такую "фичу" протокола МодБас.


Кнопка ПУск/стоп выключает программу ПЛК, а не мастера. Для остановки мастеров надо записать 254 в каналы их статуса.