docs:modbus_guide


Этот самоучитель построен по принципу «делай как я». После прочтения ты сможешь самостоятельно подключить датчик и прочитать его показания.

Цель: Научиться читать данные (например, температуру) из регистра 40001 датчика с адресом 1.

1. Шаг: Понять структуру сообщения


Любой запрос Master к Slave состоит из 5 частей. Разберем на примере чтения регистра 40001 у устройства №1.

Часть пакета Пример (Hex) Что значит
Адрес Slave 0x01 Обращаемся к устройству №1
Код функции 0x03 Хотим прочитать Holding Register
Старший байт адреса регистра 0x00 Логический адрес 40001 = физический 0
Младший байт адреса регистра 0x00 Физический адрес 0 (старший + младший = 0x0000)
Старший байт кол-ва регистров 0x00 Читаем 1 регистр
Младший байт кол-ва регистров 0x01 (1 регистр = 2 байта данных)
Контрольная сумма CRC16 0x84, 0x0A Рассчитывается автоматически
Итоговый запрос (HEX): `01 03 00 00 00 01 84 0A`

2. Шаг: Адресация (Самое частое заблуждение)


Запомни одну таблицу. Это ключ к пониманию Modbus.

Что написано в паспорте датчика Что реально передавать в запросе
Регистр 40001 Смещение (адрес) = 0
Регистр 40010 Смещение (адрес) = 9
Регистр 40020 Смещение (адрес) = 19
Формула на всю жизнь: Реальный_адрес = (Номер_по_паспорту) - 40001

3. Шаг: Собрать физическую цепь


Типовая схема подключения одного датчика к компьютеру:

  • Компьютер → [USB-to-RS485 конвертер] → Датчик Modbus.

Правила подключения (RS-485):

1. Провод «А» конвертера → к клемме «А» или «D+» датчика.
2. Провод «В» конвертера → к клемме «В» или «D-» датчика.
3. Провод GND (земля) конвертера → к GND датчика (если есть).
4. **Терминатор:** Резистор 120 Ом между A и B **только** если датчик один и кабель длиннее 5 метров.
Важно: Если у тебя нет USB-конвертера, купи его (например, серии UT-890, Waveshare, HW-0519). Без него ты не зажжешь светодиоды TX/RX в программе мониторинга порта.

4. Шаг: Отправка руками (Без программирования)


Чтобы убедиться, что всё работает, не пиши код. Используй готовые утилиты.

Программы для теста:

  • Modbus Poll (Windows) — самый известный симулятор Master.
  • QModMaster (Windows/Linux/Mac) — бесплатная альтернатива.
  • Simple Modbus Master (для Android) — если есть OTG-кабель.

Алгоритм действий в программе:

  1. [ ] Выбери COM-порт твоего конвертера.
  2. [ ] Установи скорость 9600 (самая частая), 8 data bits, 1 stop bit, No parity (8N1).
  3. [ ] Выбери режим «RTU».
  4. [ ] Введи Slave ID = 1.
  5. [ ] Выбери функцию 03: Read Holding Registers.
  6. [ ] Введи Address = 0 (если тебе нужен регистр 40001).
Если увидел числа (не ошибку): Поздравляю! Только что ты успешно отправил сообщение `01 03 00 00 00 01 84 0A` и получил ответ от датчика.

5. Шаг: Разобрать полученный ответ


Допустим, датчик температуры вернул: `01 03 02 01 2A 78 54`

Байт Значение Что это значит
0x01 Адрес Slave (наш датчик №1)
0x03 Код функции (подтверждение чтения)
0x02 Количество байт данных (сейчас будет 2 байта)
0x01 Старший байт значения температуры
0x2A Младший байт значения температуры
0x78, 0x54 Контрольная сумма CRC

Как превратить 0x01 0x2A в температуру?

1. Склеиваем байты: `0x012A` (hex).
2. Переводим в десятичную систему: 0x012A = 298 (dec).
3. Смотрим документацию: «значение умножить на 0.1». Итог = 29.8 °C.

6. Шаг: Типичные ошибки и их решения


Симптом Самая вероятная причина Что делать
В ответе только одни нули Нет соединения с шиной Проверь полярность A/B. Попробуй поменять их местами.
Ответ приходит с кодом 0x83 или 0x90 Ошибка от ведомого Slave получил запрос, но не понял его (неверный адрес регистра или функция).
Иногда приходят данные, но с помарками (CRC error) Нет терминаторов или длина линии слишком большая Поставь резистор 120 Ом между А и В на крайних устройствах. Снизь скорость до 2400.
Нет абсолютно никакого ответа (таймаут) Нет физического контакта или не совпадает скорость порта Проверь, горит ли RX на конвертере. Убедись, что скорость в проге выставлена как в датчике (9600 vs 19200).

7. Чек-лист «Я всё настроил правильно»


Пройдись по пунктам перед первым запуском:

  • [ ] Полярность A (+) и B (-) соблюдена на всех устройствах.
  • [ ] На концах линии стоят резисторы 120 Ом (если устройств > 2).
  • [ ] Скорость, битность, четность, стоп-биты совпадают во всей сети.
  • [ ] Адрес регистра переведен из логического в физический (40001 → 0).
  • [ ] Slave ID (адрес ведомого) не равен 0. 0 — это широковещательный адрес.
  • [ ] Конвертер USB-to-RS485 установлен в систему и виден в диспетчере устройств (COM3, COM5 и т.д.).

Последний совет: Не пытайся собрать сеть из 10 датчиков сразу. Сначала добейся стабильного опроса одного. Соедини два устройства (компьютер + датчик) напрямую проводом длиной 20 см. Убери терминаторы. Как увидишь данные — добавляй длину и терминаторы.

Antistatus 13.05.2026 09:50

  • docs/modbus_guide.txt
  • Последнее изменение: 3 ч. назад
  • admin