Структура записи адреса Modbus. Присваивание глобальным переменным Modbus-адреса

Для обмена контроллера данными с подчиненными modbus-устройствами, необходимо создать запрос определенного типа к нужным регистрам памяти modbus-устройств и объявить в проекте глобальные переменные, связанные с соответствующими адресами этих регистров. В данном уроке разберем все нюансы присваивания для разных подмодулей Modbus.

Адрес глобальной переменной присваивается внесением записи в поле «Location». Структура записи выглядит следующим образом:

%[Форма] [Размер] [Идентификатор] . [Номер]

Форма регистра

Тип формы

Описание

Q

Глобальная переменная используется для записи Reg/Coil slave–устройства (WriteSingleСoil, WriteSingleRegister, WriteMultipleCoils, WriteMultipleRegisters)

I

Глобальная переменная используется для чтения Reg/Coil slave–устройства (ReadCoils, ReadInputDiscretes, ReadHoldingRegisters, ReadInputRegisters)

M

Глобальная переменная используется для записи и чтения

Размер переменной

Размер

Количество байтов

Тип данных

D

4

DINT, REAL, UDINT, DWORD

L

8

LINT, ULINT, LREAL, LWORD

B

1

BYTE, USINT, SINT

X

1

BOOL

W

2

WORD, INT, UINT

Идентификатор элемента

Структура

Предназначение

X.X.X

Для ModbusRequest

X.X

Для MemoryArea

X

Для остальных, не входящих в модуль расширения

Номер регистра выставляется согласно номеру в выборке ModbusRequest, при этом номер первого регистра равен 0.

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

Допустим, есть slave–устройство, подключенное к порту RS-485_1 и нам необходимо прочитать состояние регистра с типом данных UINT по адресу 6032 и 6015. Modbus-адрес устройства - 5. Скорость передачи данных - 9600, 8-n-1.

Добавим подмодуль ModbusRTUMaster.

Примечание

Более подробно о подмодуле ModbusRTUMaster можно узнать в Подмодуль ModbusRTUMaster. Добавление и конфигурирование ModbusRequest.

../_images/132.png

Выбираем нужный нам порт - RS_485_1, скорость передачи данных и тип 8-n-1. Далее добавляем ModbusRequest для настройки конкретного slave–устройства.

Создадим запрос типа «Read Holding Registers» к нашему modbus-устройству, имеющему modbus-адрес 5 (Slave_Modbus_Adress:5). Начальный адрес пула регистров Start_Address сделаем равным: 6000. Так как регистр с адресом 6032 имеет размер W (используется 2 байта для хранения данных типа UINT, т.е. одна ячейка), то Regs_number запишем как 33. Таким образом, задействуются регистры с 6000 по 6032 включительно.

../_images/141.png

Далее напишем программу на языке FBD. Добавим глобальные переменные read_mdb1 и read_mdb2 с типом данных UINT.

../_images/152.png

Далее переходим во вкладку с глобальными переменными проекта. Пропишем Modbus-адреса для наших переменных.

../_images/gif91.gif

Как видно, мы задали адрес по структуре, указанной выше:

  • Прописываем «%»

  • Прописываем форму регистра для чтения ReadHoldingRegisters - «I»

  • Прописываем размер переменной - «W» в соответствии с типом данных UINT

  • Для ModbusRequest структура имеет вид «X.X.X» - «1.0.0.X»

  • Прописываем номера необходимых регистров 32 и 15.

Совет

Если в проекте несколько ModbusRequest, необходимо прописать нужный субмодуль, проверяя в дереве проекта

Имеется еще один вариант прописывания адреса. Для этого нажимаем на три точки в «Location» и далее выбираем наши нужные регистры.

../_images/gif10.gif

В данном случае мы сами выбираем адрес из нужного подмодуля. Также не забываем указать правильный номер регистра.

Внимание

После ввода Modbus-адреса через три точки в «Location» обычно ИСР Beremiz по умолчанию меняет тип данных на WORD

Рассмотрим другой пример. Допустим, у нас есть несколько переменных, которые необходимо прочитать другому устройству. В данном случае наш контроллер будет выполнять функции slave–устройства.

Итак, пусть переменными у нас будут LocalVar0 - LocalVar3 с типами данных WORD, REAL, LWORD и BOOL. Напишем простую программу, которая будет фиктивной.

../_images/162.png

Остальные переменные добавим в Config variables.

../_images/172.png

Следующим шагом мы добавим подмодуль MemoryArea. Зададим область адресов с 6000 с количеством регистров - 10. Тип MemoryArea выберем 03 - HoldingRegisters.

Примечание

Более подробно о подмодуле ModbusRTUMaster можно узнать в Добавление и конфигурирование подмодуля MemoryArea

../_images/182.png

Остался последний шаг - корректно прописать адреса. С помощью таблицы структуры мы запишем сначала для LocalVar0:

  • Прописываем «%»

  • Прописываем форму регистра - «M»

  • Прописываем размер переменной - «W» в соответствии с типом данных WORD

  • Для MemoryArea структура имеет вид X.X - «1.0»

  • Прописываем номер, пусть LocalVar0 будет первым - «1.0.0»

../_images/192.png

Итоговый вариант глобальных пременных выглядит так:

../_images/202.png

Возникает вопрос: почему LocalVar2 прописан с адресом %ML1.0.3, а не %ML1.0.2? Потому что тип данных REAL имеет количество битов 4, значит занимает 2 ячейки. Аналогично с этим и прописан адрес для LocalVar3 - количество битов для типа данных LWORD - 8.

Готово, компиллируем и загружем программу, и теперь мастер-устройство может опросить, менять данные переменные обратишись к конроллеру по Modbus-адресу - 3(по умолчанию) со скоростью - 115200 к регистрам с адресами от 6000.