Показать страницуСсылки сюдаНаверх Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно. ==== Самоучитель по 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@mail.ru|Antistatus]] 13.05.2026 09:50// docs/modbus_guide.txt Последнее изменение: 3 ч. назад — admin