Самоучитель по Modbus: от нуля до первого запроса
Этот самоучитель построен по принципу «делай как я». После прочтения ты сможешь самостоятельно подключить датчик и прочитать его показания.
Цель: Научиться читать данные (например, температуру) из регистра 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-кабель.
Алгоритм действий в программе:
- [ ] Выбери COM-порт твоего конвертера.
- [ ] Установи скорость 9600 (самая частая), 8 data bits, 1 stop bit, No parity (8N1).
- [ ] Выбери режим «RTU».
- [ ] Введи Slave ID = 1.
- [ ] Выбери функцию 03: Read Holding Registers.
- [ ] Введи 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