Часть 2/3. Регистры и функциональные коды
В первой части мы разобрали принцип обмена Modbus.
Теперь перейдём к самому важному — данным.
━━━━━━━━━━━━━━━━━━
🔹 Четыре области данных
В модели Modbus предусмотрены четыре типа объектов.
1️⃣ Coils
Дискретные значения, доступные для чтения и записи.
Размер одного значения — 1 бит.
Например:
0 = Выключено
1 = Включено
Могут использоваться для команд и дискретных состояний.
2️⃣ Discrete Inputs
Дискретные значения только для чтения через соответствующие функции Modbus.
Например:
• состояние датчика;
• концевой выключатель;
• сигнал готовности.
3️⃣ Input Registers
16-битные регистры для чтения.
Например:
• измеренная температура;
• давление;
• ток двигателя.
4️⃣ Holding Registers
16-битные регистры, которые поддерживают чтение и запись средствами Modbus.
Например:
• уставка частоты;
• параметры устройства;
• команды;
• технологические значения.
Фактические права доступа зависят от реализации устройства.
━━━━━━━━━━━━━━━━━━
🔢 Что означают 0xxxx, 1xxxx, 3xxxx, 4xxxx?
В документации часто встречается традиционная нотация:
0xxxx — Coils
1xxxx — Discrete Inputs
3xxxx — Input Registers
4xxxx — Holding Registers
Например:
00001
10001
30001
40001
Это обозначения областей данных.
Но цифра 4 в обозначении 40001 не передаётся как часть адреса регистра.
Тип области определяется функциональным кодом.
━━━━━━━━━━━━━━━━━━
⚠️ Почему 40001 может означать адрес 0?
Это один из самых частых вопросов начинающих.
В традиционной нотации:
40001 — первый Holding Register
40002 — второй
40003 — третий
Но в запросе Modbus используется адрес внутри области.
При нулевой адресации:
40001 → 0
40002 → 1
40003 → 2
Некоторые программы отображают адреса начиная с единицы.
Поэтому всегда проверяйте, какую адресацию использует программа настройки и документация устройства.
━━━━━━━━━━━━━━━━━━
🔧 Функциональные коды
Функциональный код сообщает серверу, какую операцию необходимо выполнить.
Основные функции:
FC01 — Read Coils
FC02 — Read Discrete Inputs
FC03 — Read Holding Registers
FC04 — Read Input Registers
FC05 — Write Single Coil
FC06 — Write Single Register
FC15 — Write Multiple Coils
FC16 — Write Multiple Registers
Например:
FC03 — чтение Holding Registers.FC06 — запись одного Holding Register.FC16 — запись нескольких Holding Registers.━━━━━━━━━━━━━━━━━━
🧠 Практический пример
Допустим, в документации частотного преобразователя указано:
Register: 40010
Description: Frequency
Type: UINT16
Scale: 0.01
Для чтения используем:
Function: FC03
Address: 9
Quantity: 1
Адрес 9 соответствует регистру 40010 при нулевой адресации.
Получили:
RAW = 2500
Переводим в физическую величину:
2500 × 0.01 = 25.00 Hz
Таким образом, регистр содержит целое число, а масштабирование выполняется в программе.
━━━━━━━━━━━━━━━━━━
💡 Главное
Чтобы правильно прочитать значение по Modbus, необходимо знать:
• тип области данных;
• функциональный код;
• адрес регистра;
• количество регистров;
• формат значения;
• коэффициент масштабирования.
➡️ В следующей части: разберём устройство запросов Modbus RTU и TCP, а также типичные ошибки связи.
#Modbus #CODESYS #ОВЕН #ПЛК #АСУТП