LINUX.ORG.RU

[Modbus]Адрес, Input Register и Holding Register, почему у них такие номера?


0

1

Не могу понять модель данных Modbus'а. У нас есть 4 таблицы данных, адрес в такой таблице — 16-байтовое число. А как понять последний абзац?

Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.

Я не понял. Таки если я запишу 00ff в Holding Register с адресом 40108 это же число будет в Input Register 30108? Таки у нас 4 отдельных таблицы, или они на самом деле обязательно пересекаются? Могу я записать что-то в Holding Register с адресом 20, читать и Input Register'а с адресом 65000?

★★★★★

Нет, таблицы не пересекаются. В общем случае значения в соответствующих ячейках, но в разных таблицах никак не связаны. Эти значения определяются логикой работы контроллера.

Первое число в адресе скорее определяет тип регистра, к которому обращаешься:
0 - coil
1 - input status
3 - input register
4 - holding register
Соответственно, при обращении к input status регистру, например, по адресу 10 надо поставить адрес 10010, а к holding регистру - 40010

Записать по адресу 65xxx? ХЗ, вроде бы, мне такие адреса не попадались. В некоторых инструментах можно выставить длину поля адреса в 6 или 7 символов, но обычно отведено 5 и адрес выше 9999 просто не влезает.

anonymous
()
Ответ на: комментарий от anonymous

Непонятно.

Записать по адресу 65xxx? ХЗ, вроде бы, мне такие адреса не попадались. В некоторых инструментах можно выставить длину поля адреса в 6 или 7 символов, но обычно отведено 5 и адрес выше 9999 просто не влезает.

Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы, В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.

Таки должно быть по 65536 адресов в каждой таблице?

Camel ★★★★★
() автор топика
Ответ на: Непонятно. от Camel

Необязательно должно быть 65536 адресов в каждой таблице. Также необязательно, чтобы в каждой таблице адреса занимали непрерывную область адресного пространства. Могут быть только чётные, или только нечётные, или вообще чёрти как расположены - определяется разработчиком устройства.
Сами таблицы независимы друг от друга. И данные с одинаковыми адресами, но в разных таблицах, вообще говоря, не связаны друг с другом. Другое дело, что разработчик устройства может решить, что доступ к одним и тем же данным (например, дискретным входам) будет осуществляться через разные таблицы, причём адреса не обязаны совпадать. Встречал разные модули ввода-вывода, у которых состояние дискретных входов можно было прочитать как из input status таблицы, так и с input register. Причём, состояние конкретного входа находилось как в отдельном input регистре, так и в одном регистре лежали состояния всех входов. Но так делать совсем необязательно. Можно было просто оставить доступ через таблицу input status, а на все остальные положить болт.

anonymous
()
Ответ на: комментарий от anonymous

Что за Input Status?

Что за Input Status такой? Wikipedia такого не знает.

Будем считать, что я разработчик устройства. Мне нужны все адреса во всех таблицах. У меня будет 4 таблицы, две с однобитными ячейками, 2 с 16-битными, и между собой они никак не связаны. Так? Делаю что хочу? Пишу в любой Holding Register, читаю из любого Holding Register'а, равно читаю из любого Input Register'а. В Holding Register записываю, скажем, координаты целевой точки в которую надо прийти, из Input Register'ов читаю текущие координаты устройства. Похоже на правду?

Camel ★★★★★
() автор топика
Ответ на: Что за Input Status? от Camel

Input status - наложилось название функции для чтения дискретного входа. Я имел ввиду дискретный вход.

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

anonymous
()
Ответ на: Что за Input Status? от Camel

Будем считать, что я разработчик устройства. Мне нужны все адреса во всех таблицах. У меня будет 4 таблицы, две с однобитными ячейками, 2 с 16-битными, и между собой они никак не связаны. Так? Делаю что хочу? Пишу в любой Holding Register, читаю из любого Holding Register'а, равно читаю из любого Input Register'а. В Holding Register записываю, скажем, координаты целевой точки в которую надо прийти, из Input Register'ов читаю текущие координаты устройства.

В большинстве устройств, встречавшихся мне, реализована только область Holding Registers.

Структуру данных лучше продумать сразу. Лучше, когда данные расположены непрерывно, меньше запросов. В большие адреса лучше не уходить. У некоторых промышленных железок, которые Modbus Master реализуют, встречаются ограничения на максимальный адрес.

qaqa ★★
()
Ответ на: комментарий от qaqa

Воспользуюсь рекомендациями.

В большинстве устройств, встречавшихся мне, реализована только область Holding Registers.

Структуру данных лучше продумать сразу. Лучше, когда данные расположены непрерывно, меньше запросов. В большие адреса лучше не уходить. У некоторых промышленных железок, которые Modbus Master реализуют, встречаются ограничения на максимальный адрес.

Воспользуюсь рекомендациями. Спасибо.

Camel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.