Управление и чтение Modbus RTU реле Bestep через USB-RS485 и терминал

Управление и чтение Modbus RTU реле Bestep через USB-RS485 и терминал

Модуль MODBUS RS485 реле

Данное руководство описывает подключение модуля реле к ПК через адаптер USB-RS485 и работу с ним через программу-терминал (например, SSCOM, Hercules, PuTTY).

Шаг 1. Подключение оборудования

  1. Подключите USB-RS485 адаптер к компьютеру.
  2. Соедините провода адаптера с модулем реле:
  3. Подайте питание на модуль реле (VCC: DC 7-24V, GND) в соответствии с описанием интерфейса.

Шаг 2. Настройка программы-терминала

  1. Узнайте номер COM-порта вашего USB-RS485 адаптера в «Диспетчере устройств» Windows.
  2. Откройте программу-терминал и выберите этот COM-порт.
  3. Установите параметры последовательного порта:
  4. Нажмите «Открыть порт» (Open Port).
⚠️ ВАЖНО: Переключите режим отправки данных в программе в HEX (шестнадцатеричный формат). По умолчанию терминалы часто работают в режиме ASCII, при котором команды не сработают.

Шаг 3. Команды управления (Адрес по умолчанию: 255 / FF)

Формат команд для ручного режима (Manual mode). Вводите эти команды в поле отправки и нажимайте «Отправить».

Действие Отправить (HEX) Ожидаемый ответ (HEX)
Включить реле 1 FF 05 00 00 FF 00 99 E4 FF 05 00 00 FF 00 99 E4
Выключить реле 1 FF 05 00 00 00 00 D8 14 FF 05 00 00 00 00 D8 14
Включить реле 2 FF 05 00 01 FF 00 C8 24 FF 05 00 01 FF 00 C8 24
Выключить реле 2 FF 05 00 01 00 00 89 D4 FF 05 00 01 00 00 89 D4
Включить все реле FF 0F 00 00 00 08 01 FF 30 1D FF 0F 00 00 00 08 01 FF 30 1D
Выключить все реле FF 0F 00 00 00 08 01 00 70 5D FF 0F 00 00 00 08 01 00 70 5D

Примечание: при управлении через функцию 0x05 и 0x0F модуль возвращает точно такой же набор байт (эхо-ответ).

Шаг 4. Команды чтения данных

Модуль поддерживает чтение текущего состояния, адреса и настроек. Команды также отправляются в HEX-режиме.

Действие Отправить (HEX) Пример ответа (HEX) Расшифровка ответа
Чтение адреса устройства 00 03 00 00 00 01 85 DB 00 03 02 00 FF C5 C4 5-й байт (FF) в ответе — это текущий адрес устройства.
Чтение состояния реле FF 01 00 00 00 08 28 12 FF 01 01 01 A1 A0 4-й байт (01) содержит состояние реле. Бит 0 отвечает за реле 1, бит 7 — за реле 8.
0 = реле замкнуто (включено), 1 = реле разомкнуто (выключено).
Чтение состояния входов оптопары FF 02 00 00 00 08 6C 12 FF 02 01 01 51 A0 4-й байт (01) показывает состояние входов IN1-IN8.
0 = низкий уровень (low), 1 = высокий уровень (high).
Чтение скорости передачи (Baud rate) FF 03 03 E8 00 01 11 A4 FF 03 02 00 04 90 53 5-й байт в ответе указывает на текущую скорость.
0x02 = 4800, 0x03 = 9600, 0x04 = 19200.
💡 Совет: Если вы хотите проверить состояние конкретного реле, используйте команду чтения состояния реле. В ответе вы получите байт, где каждый бит соответствует определённому реле. Например, если 4-й байт равен 0x01 (двоичное 0000 0001), это означает, что реле 1 разомкнуто, а остальные (если есть) замкнуты.

Шаг 5. Импульсный режим (Flash Mode) — только для реле №1

❗ Ограничение: импульсный режим доступен только для реле №1. Для реле №2, №3 и №4 импульсное управление не предусмотрено — используйте обычные команды включения/выключения (0x05).

Импульсный режим позволяет включить реле на заданное время, после чего оно автоматически вернётся в исходное состояние. Время задаётся в 10-м и 11-м байтах команды (с дискретностью 0.1 секунды). Внутри модуля импульс хранится в регистре с адресом 0x0003 (два регистра: действие и время).

Формат команды (функция 0x10)

Байт Значение Описание
1FFАдрес модуля (по умолчанию 0xFF = 255)
210Код функции: запись нескольких регистров
3-400 03Адрес первого регистра (для реле 1 — всегда 0x0003)
5-600 02Количество регистров = 2
704Количество байт данных = 4
8-900 04 (вкл) / 00 02 (выкл)Действие
10-1100 XXВремя импульса: XX = секунды × 10
12-13CRC_L CRC_HCRC-16/MODBUS, младший байт первый

Примеры команд и ответов

Пример 1. Включить реле 1 на 1.0 секунду.

Отправка: FF 10 00 03 00 02 04 00 04 00 0A 45 97
Ответ: FF 10 00 03 00 02 A4 16

Расчёт времени: 0x000A = 10; 10 × 0.1 = 1.0 сек. Через 1 секунду после включения реле автоматически вернётся в исходное состояние.

Пример 2. Включить реле 1 на 2.0 секунды.

Отправка: FF 10 00 03 00 02 04 00 04 00 14 C5 9F
Ответ: FF 10 00 03 00 02 A4 16

Расчёт времени: 0x0014 = 20; 20 × 0.1 = 2.0 сек.

Пример 3. Выключить реле 1 на 3.0 секунды (затем автоматически включится).

Отправка: FF 10 00 03 00 02 04 00 02 00 1E A5 99
Ответ: FF 10 00 03 00 02 A4 16

Расчёт времени: 0x001E = 30; 30 × 0.1 = 3.0 сек.

💡 ВАЖНО про ответ модуля: На функцию 0x10 модуль отвечает не эхом команды, а стандартным 8-байтовым ответом Modbus RTU:
FF 10 00 03 00 02 A4 16
Это те же самые первые 6 байт команды (адрес, функция, адрес регистра, количество регистров), к которым добавлены 2 байта CRC. Все байты данных (значение действия и время) в ответе не передаются. Это нормальное поведение — не путайте его с ошибкой.

Структура ответа (разбор примера)

Байт Значение Описание
1FFАдрес модуля
210Код функции (эхо)
3-400 03Адрес первого регистра (эхо)
5-600 02Количество регистров (эхо)
7-8A4 16CRC-16/MODBUS

Формирование ожидаемого ответа в Python

Если вы пишете свою программу, ожидаемый ответ можно сформировать так:

def expected_write_multiple_response(address: int, start: int, count: int) -> bytes:
    """Стандартный ответ Modbus RTU на функцию 0x10 (8 байт)."""
    data = bytes([
        address, 0x10,
        (start >> 8) & 0xFF, start & 0xFF,
        (count >> 8) & 0xFF, count & 0xFF,
    ])
    return data + crc16_modbus(data)

# Для включения реле 1 на 1 секунду с адресом FF:
print(expected_write_multiple_response(0xFF, 0x0003, 2).hex(' ').upper())
# Выведет: FF 10 00 03 00 02 A4 16
⚠️ Практический совет: при работе через терминал сравнивать ответ с отправленной командой нельзя — они разные. Ориентируйтесь на длину ответа (8 байт) и совпадение первых 6 байт с первыми 6 байтами команды.

Шаг 6. Дополнительные настройки (смена адреса)

Если вы хотите изменить адрес модуля, используйте команду на базе функции 0x10:

Как и у импульсной команды, ответ на смену адреса — стандартные 8 байт:

Отправка: 00 10 00 00 00 01 02 00 01 6A 00
Ответ: 00 10 00 00 00 01 <CRC_L> <CRC_H>

То есть в ответе вы увидите: адрес, 0x10, 00 00 (начальный регистр), 00 01 (количество регистров) и 2 байта CRC.

Частые проблемы и их решение


Как рассчитывается CRC (на примере включения 1 реле)

Расчёт CRC (Cyclic Redundancy Check) в протоколе Modbus RTU — это стандартная процедура. Разберём её на примере команды включения 1-го реле.

1. Разбор команды

Команда, которую мы отправляем:

FF 05 00 00 FF 00 99 E4

⚠️ Важно: Для расчёта CRC используются только первые 6 байт: FF 05 00 00 FF 00. Последние два байта (99 E4) — это результат, который мы должны получить.

2. Алгоритм расчёта (CRC-16/MODBUS)

В Modbus используется алгоритм CRC-16 с полиномом 0xA001 и начальным значением 0xFFFF.

Пошаговый процесс (упрощённо):

  1. Берём начальное значение 0xFFFF.
  2. Для каждого байта данных (их 6 штук) выполняем следующие действия:
  3. После обработки всех байтов получаем 16-битное число.
  4. Меняем местами старший и младший байты (Little Endian). То есть, если получилось 0xE499, мы отправляем 99 E4.

3. Пример на языке Python (самый наглядный способ)

Вот готовая функция, которая рассчитывает CRC для Modbus RTU:

def crc16_modbus(data: bytes) -> bytes:
    crc = 0xFFFF
    for byte in data:
        crc ^= byte
        for _ in range(8):
            if crc & 0x0001:
                crc = (crc >> 1) ^ 0xA001
            else:
                crc >>= 1
    # Возвращаем младший байт, затем старший
    return bytes([crc & 0xFF, (crc >> 8) & 0xFF])

# Наши данные (без CRC)
command = bytes.fromhex('FF 05 00 00 FF 00')
crc = crc16_modbus(command)
print(f"CRC: {crc.hex().upper()}")  # Выведет: 99E4

4. Как проверить вручную (через онлайн-калькулятор)

В документации к модулю указана ссылка на калькулятор: http://www.ip33.com/crc.html.

Как им пользоваться:

  1. Откройте сайт.
  2. В поле «Input Data» введите: FF 05 00 00 FF 00.
  3. Выберите тип CRC: CRC-16/MODBUS (или CRC-16, полином 0xA001, init 0xFFFF).
  4. Нажмите «Calculate».
  5. В поле «Result» вы увидите E499 или 99E4. В протоколе Modbus правильным считается порядок Low Byte First (младший байт вперёд), поэтому в команду мы пишем 99 E4.
💡 Почему в команде именно 99 E4?
Потому что производитель уже посчитал это значение для вас. Вам не нужно считать CRC вручную каждый раз, если вы пользуетесь готовыми командами из документации. Но если вы захотите изменить адрес реле или добавить задержку, вам придётся пересчитать CRC с помощью программы или онлайн-калькулятора.
📌 Главное правило: В Modbus RTU CRC всегда идёт после данных, и первым передаётся младший байт (Low), затем старший (High).