==== Шпаргалка: Modbus ==== ---- * **Тип:** Ведущий-Ведомый (Master-Slave / Client-Server). * **Назначение:** Промышленная автоматизация, SCADA, управление приводами и сбор данных с датчиков. * **Физический уровень:** RS-485 (чаще всего), RS-232, TCP/IP. * **Топология:** Шина (линия) или звезда (при использовании повторителей). * **Макс. устройств:** до 247 ведомых (Slave) на один Master. ---- === 1. Физический уровень (RS-485) === * **Кабель:** Витая пара с экраном (например, КВВГЭ, Belden). * **Длина линии:** до 1200 м (без повторителя). * **Скорость:** 9600, 19200, 38400, 115200 бит/с (самые частые). * **Соединение:** Две линии A (инвертирующий, -) и B (неинвертирующий, +). > **Критично:** Соблюдай **полярность**! A ко всем A, B ко всем B. Перепутав полярность на одном устройстве, ты завалишь весь сегмент сети. > **Критично:** На концах линии (физически самых дальних устройствах) установи **терминаторы** сопротивлением 120 Ом между A и B. Без них будут ошибки CRC. ---- === 2. Модель данных (4 типа регистров) === ---- | ^ Тип данных ^ Доступ ^ Размер ^ Функции (Hex) ^ Логический адрес | | | Coil (Флаг/Катушка) | Чтение/Запись | 1 бит | 0x01, 0x05, 0x0F | 0xxxx (00001) | | | Discrete Input (Дискр. вход) | Только чтение | 1 бит | 0x02 | 1xxxx (10001) | | | Input Register (Регистр ввода) | Только чтение | 16 бит | 0x04 | 3xxxx (30001) | | | Holding Register (Регистр хранения) | Чтение/Запись | 16 бит | 0x03, 0x06, 0x10 | 4xxxx (40001) | ---- === 3. Адресация (Важнейший нюанс!) === ---- * **Логический адрес** (из документации): 40001. * **Физический адрес** (PDU, то что посылаем в запросе): 0. > **Правило перевода:** Физический адрес = Логический адрес - 40001 (для Holding Register). > * 40001 → отправляй 0. > * 40010 → отправляй 9. > * 40099 → отправляй 98. ----- === 4. Форматы передачи === ---- | ^ Тип ^ Среда ^ Особенность ^ | | **Modbus RTU** | RS-485 / RS-232 | Самый популярный. Компактные двоичные данные. Контрольная сумма CRC-16. | | | **Modbus ASCII** | RS-485 / RS-232 | Данные в текстовом виде. Контрольная сумма LRC. Медленнее RTU. | | | **Modbus TCP/IP** | Ethernet (порт 502) | Обертка RTU в TCP-пакет. Без CRC (проверка на уровне TCP). | ---- === 5. Код функции = Команда === ---- * **0x01 (01)** — Чтение нескольких Coil (битов). * **0x02 (02)** — Чтение Discrete Inputs (битов). * **0x03 (03)** — Чтение Holding Registers (слов). * **0x04 (04)** — Чтение Input Registers (слов). * **0x06 (06)** — Запись одного Holding Register. * **0x10 (16)** — Запись нескольких Holding Register (мультизапись). > **Если получил код ошибки:** Ведомый вернет тот же код функции, но со старшим битом = 1 (например, 0x80 для 0x00). Код ошибки 0x01 = неверная функция, 0x02 = неверный адрес, 0x03 = неверные данные. ---- === 6. Чек-лист «Нет связи» === ---- * [ ] Совпадают ли **скорость (Baud Rate)** и **чётность (Parity)** на всех устройствах? (Частая ошибка: 9600 vs 19200). * [ ] Не перепутана ли полярность A и B? * [ ] Стоят ли терминаторы (120 Ом) на двух концах линии? * [ ] Не превышена ли длина кабеля 1200 м? * [ ] В том ли порту COM сидит конвертер? * [ ] Не занят ли порт COM другой программой? * [ ] Правильно ли переведён адрес? (40001 -> 0?) ----- > //**Совет:** Начинай отладку с опроса всего **одного** ведомого напрямую (без длинных линий). При подключении реального оборудования используй сниффер провода (анализатор трафика USB-to-RS485), чтобы увидеть, уходит ли запрос из компа и приходит ли ответ.// ---- //[[antistatus@mail.ru|Antistatus]] 13.05.2026 09:42//