Перейти к содержанию

Modbus RTU: сборка и разбор кадров

Задайте адрес устройства, функцию и регистры — калькулятор соберёт кадр запроса с CRC-16, разложит его по полям и покажет, каким будет ответ и какие паузы нужны на вашей скорости. Во втором режиме вставьте байты из терминала или сниффера: кадр будет разобран, CRC проверена, а пары регистров показаны как 32-битные числа и float в четырёх порядках байтов.

Исходные данные

Режим

от 1 до 247; 0 — широковещательный запрос на запись

как в кадре, с нуля: 107 или 0x006B; в нотации Modicon это 40001

от 1 до 125 за один запрос

бит/с

для пауз t1,5 и t3,5 и времени передачи; символ RTU — 11 бит

Результат

Кадр запроса с CRC-16

01 03 00 00 00 0A C5 CD

8 байт; CRC-16 = 0xCDC5, в кадре младший байт первым: C5 CD

Ответ устройства
25 байт01 03 14 + 20 байт данных + CRC
Ответ с исключением
5 байт01 83 + код исключения + CRC
Символ, 11 бит
1,146 мс
Пауза внутри кадра, t1,5
не больше 1,719 мс1,5 символа
Тишина между кадрами, t3,5
не меньше 4,01 мс3,5 символа
Передача запроса
9,167 мс8 байт по 11 бит
Передача ответа
28,65 мс25 байт по 11 бит
Цикл запрос — ответ
от 45,83 мсзапрос, t3,5, ответ, t3,5 — без времени обработки в устройстве

Запрос по полям

БайтыПолеЗначение
01Адрес устройства1
03Код функции03 — чтение регистров хранения (Read Holding Registers)
00 00Адрес первого регистра0 (0x0000); в нотации Modicon — 40001 или 400001
00 0AКоличество регистров10
C5 CDCRC-160xCDC5 — по всем предыдущим байтам, младший байт первым

Что ответит устройство

Нормальный ответ — 25 байт
БайтыПолеЗначение
01Адрес устройстватот же, что в запросе
03Код функциитот же, что в запросе
14Счётчик байт20
20 байтЗначения регистров10 × 2 байта, старший байт регистра первым
2 байтаCRC-16младший байт первым
Ответ с исключением — 5 байт
БайтыПолеЗначение
01Адрес устройстватот же, что в запросе
83Код функции + 0x80старший бит установлен — признак исключения
1 байтКод исключениячаще всего 01, 02, 03 или 04
2 байтаCRC-16младший байт первым

Вставьте принятый кадр в режиме «Разобрать кадр» — калькулятор проверит CRC и покажет значения.

Кадр Modbus RTU — это адрес устройства, код функции, данные и CRC-16, переданные подряд без пауз. Запрос «прочитать 10 регистров хранения с адреса 0 у устройства 1» — восемь байт: 01 03 00 00 00 0A C5 CD. Калькулятор собирает такие запросы для функций 01–06, 15 и 16, разбирает по полям запросы и ответы из терминала или сниффера и переводит номера регистров из документации в адреса кадра.

Как устроен сам протокол — физический уровень, функции, исключения, типичные ошибки — в статье «Modbus RTU».

Коротко

  • Кадр: адрес устройства (1 байт), код функции (1 байт), данные (0–252 байта) и CRC-16 (2 байта) — всего не больше 256 байт.
  • Адрес устройства: от 1 до 247; 0 — широковещательный, 248–255 зарезервированы.
  • Порядок байтов: адреса, количества и значения регистров — старшим байтом вперёд, CRC — младшим.
  • Адреса в кадре считаются с нуля: регистр с номером 40001 имеет адрес 0.
  • Исключение: код функции плюс 0x80 и код причины, весь кадр — 5 байт.
  • Паузы: между кадрами — не меньше 3,5 символа по 11 бит, внутри кадра — не больше 1,5 символа; выше 19 200 бит/с — фиксированные 1,75 мс и 750 мкс.

Как пользоваться калькулятором

Собрать запрос. Укажите адрес устройства, функцию и её поля. Адрес регистра вводится так, как он идёт в кадре, — с нуля, десятичным числом или в виде 0x006B; рядом калькулятор показывает тот же регистр в нотации Modicon. Значения для функции 16 перечисляются через пробел или запятую: десятичные, отрицательные (они записываются в дополнительном коде) или шестнадцатеричные. Состояния для функции 15 — единицы и нули по порядку адресов, первый символ относится к начальному адресу. На выходе — кадр с CRC, таблица полей, вид и длина нормального ответа и ответа с исключением, паузы и время передачи на выбранной скорости. Кадр копируется строкой байтов или массивом для программы на C.

Разобрать кадр. Вставьте байты в любом виде: 01 03 00 0A, 0x01,0x03 или 01030A. Калькулятор проверит CRC, назовёт функцию и разложит кадр по полям, а регистры покажет как uint16 и int16 и парами — как uint32, int32 и float32 в четырёх порядках байтов. Если кадр вставлен без CRC, калькулятор допишет её сам и скажет об этом. Переключатель «авто — запрос — ответ» нужен потому, что направление в кадре не записано; когда его удаётся определить по длине, режим «Авто» объясняет, как именно.

Номер → адрес. Введите номер из документации на устройство — 40108, 400108 или 30009 — и получите таблицу данных, код функции и адрес для кадра. Кнопки под результатом сразу подставляют их в запрос.

Состояние калькулятора хранится в адресе страницы: ссылкой на собранный запрос или разобранный кадр можно поделиться.

Структура кадра Modbus RTU

ПолеРазмерЧто содержитВ примере
Адрес устройства1 байт1–247, в ответе устройство ставит свой адрес; 0 — широковещательный запрос01
Код функции1 байтчто нужно сделать; в ответе с исключением — тот же код плюс 0x8003
Данные0–252 байтазависят от функции: адрес, количество, счётчик байт, значения00 00 00 0A
CRC-162 байтаконтрольная сумма всех предыдущих байтов, младший байт первымC5 CD

Код функции вместе с данными — это PDU, часть кадра, одинаковая для Modbus RTU и Modbus TCP; она не длиннее 253 байт. Адрес устройства и CRC добавляет последовательная линия, отсюда предел в 256 байт на весь кадр.

Все 16-битные поля — адреса, количества, значения регистров — передаются старшим байтом вперёд: значение 0x1234 уходит в линию как 12 34. CRC — единственное исключение: её младший байт идёт первым. Считается она по всем байтам от адреса устройства до конца данных с начальным значением FFFF и полиномом A001; в примере из спецификации кадр 02 07 получает CRC 0x1241 и уходит в линию как 02 07 41 12. Посчитать CRC для произвольных данных и получить функцию на C можно в калькуляторе CRC.

Начало и конец кадра ничем не помечены: приёмник находит их по паузам, о которых — ниже.

Функции 01–06, 15 и 16: запрос и ответ

Modbus делит данные устройства на четыре таблицы: дискретные выходы (coils) и дискретные входы — по одному биту, входные регистры и регистры хранения — по 16 бит. Входы и входные регистры можно только читать. Таблицу выбирает код функции, поэтому один и тот же адрес 0 в запросах с функциями 03 и 04 — это два разных регистра.

В скобках — размер поля в байтах; N — число байтов данных.

КодФункцияДанные запросаДанные ответаКоличество за запрос
01чтение дискретных выходов, Read Coilsадрес (2), количество (2)счётчик байт (1), состояния (N)1–2000
02чтение дискретных входов, Read Discrete Inputsадрес (2), количество (2)счётчик байт (1), состояния (N)1–2000
03чтение регистров хранения, Read Holding Registersадрес (2), количество (2)счётчик байт (1), значения (N)1–125
04чтение входных регистров, Read Input Registersадрес (2), количество (2)счётчик байт (1), значения (N)1–125
05запись одного выхода, Write Single Coilадрес (2), значение (2)повторяет запрос1
06запись одного регистра, Write Single Registerадрес (2), значение (2)повторяет запрос1
15 (0x0F)запись нескольких выходов, Write Multiple Coilsадрес (2), количество (2), счётчик байт (1), состояния (N)адрес (2), количество (2)1–1968
16 (0x10)запись нескольких регистров, Write Multiple Registersадрес (2), количество (2), счётчик байт (1), значения (N)адрес (2), количество (2)1–123

Несколько правил, на которых чаще всего спотыкаются:

  • Регистры занимают по два байта, старший первым; счётчик байт равен удвоенному количеству регистров.
  • Биты упаковываются по восемь в байт. Первый запрошенный выход или вход — младший бит первого байта, следующие идут к старшему биту и дальше в следующий байт. Счётчик байт — количество, делённое на 8, с округлением вверх; лишние старшие биты последнего байта заполняются нулями. Десять выходов с состояниями 1 0 1 1 0 0 1 1 1 0 — это байты CD 01.
  • Функция 05 принимает только два значения: FF00 — включить, 0000 — выключить. Любое другое недопустимо и выход не меняет.
  • Ответ на запись короткий: функции 05 и 06 возвращают запрос целиком, функции 15 и 16 — только адрес и количество, без данных.
  • Широковещательный запрос с адресом 0 выполняют все устройства, и никто на него не отвечает. Поэтому он имеет смысл только для функций записи. После него ведущий выдерживает паузу, обычно 100–200 мс, прежде чем отправить следующий запрос.

Длина кадра вместе с адресом устройства и CRC:

ФункцииЗапросНормальный ответ
01, 028 байт5 байт + количество / 8 с округлением вверх
03, 048 байт5 байт + 2 × количество
05, 068 байт8 байт
159 байт + количество / 8 с округлением вверх8 байт
169 байт + 2 × количество8 байт

По этим длинам режим «Авто» и отличает запрос от ответа. У функций 03 и 04 запрос занимает 8 байт, а ответ — всегда нечётное число. У функций 15 и 16 ровно 8 байт занимает ответ, а запрос длиннее. У функций 05 и 06 запрос и ответ совпадают байт в байт. Неоднозначность остаётся только у функций 01 и 02: восемь байт — это и запрос, и ответ с тремя байтами данных. Если третий байт равен 03, а два байта перед CRC складываются в допустимое количество от 1 до 2000, кадр подходит под оба варианта. Калькулятор об этом предупреждает и просит выбрать направление вручную.

Ответ с исключением и коды исключений

Если запрос принят без ошибок связи, но выполнить его нельзя, устройство отвечает кадром из пяти байт: свой адрес, код функции с установленным старшим битом, код исключения и CRC. На запрос 01 03 00 00 00 0A C5 CD устройство, у которого нет таких регистров, ответит 01 83 02 C0 F1.

КодНазвание в спецификацииЧто означает
01ILLEGAL FUNCTIONустройство не поддерживает эту функцию или не может выполнить её в нынешнем состоянии
02ILLEGAL DATA ADDRESSв устройстве нет такого адреса, или диапазон «адрес + количество» выходит за его границы
03ILLEGAL DATA VALUEнедопустимое значение в поле запроса: количество вне пределов функции, счётчик байт не соответствует количеству
04SERVER DEVICE FAILUREнеустранимая ошибка при выполнении запроса
05ACKNOWLEDGEзапрос принят, но выполнение займёт много времени; используется с командами программирования
06SERVER DEVICE BUSYустройство занято длительной командой, запрос нужно повторить позже
08MEMORY PARITY ERRORошибка в памяти при чтении файла записей, функции 20 и 21
0AGATEWAY PATH UNAVAILABLEшлюз не смог выделить путь к устройству: он неверно настроен или перегружен
0BGATEWAY TARGET DEVICE FAILED TO RESPONDшлюз не получил ответа от устройства за ним

Проверки идут по порядку: сначала код функции (исключение 01), затем количество (03), затем адреса (02), и только потом запрос выполняется (04 при сбое). Поэтому запрос на 126 регистров вернёт исключение 03, даже если самих адресов в устройстве нет. По спецификации код 03 говорит об ошибке в структуре запроса, а не о том, что записываемое значение не подходит регистру по смыслу.

Исключение приходит только на запрос, принятый без ошибок. Если не сошлись CRC или чётность, устройство молчит, и ведущий узнаёт об ошибке по таймауту. То же происходит, когда устройства с таким адресом на шине нет.

Паузы t1,5 и t3,5 и время передачи

Символ в режиме RTU занимает 11 бит: старт-бит, 8 бит данных младшим битом вперёд, бит чётности и стоп-бит. По умолчанию чётность even — формат 8E1; без чётности спецификация требует два стоп-бита, 8N2, чтобы символ остался 11-битным. О самих кадрах последовательного порта — в статье про UART.

Длительность символа, паузы и время передачи кадра из NN байт на скорости BB бит/с:

tсимв=11B,t1,5=1,5⋅tсимв,t3,5=3,5⋅tсимв,tкадра=N⋅tсимв.t_\text{симв} = \frac{11}{B}, \qquad t_{1{,}5} = 1{,}5 \cdot t_\text{симв}, \qquad t_{3{,}5} = 3{,}5 \cdot t_\text{симв}, \qquad t_\text{кадра} = N \cdot t_\text{симв}.
  • t3,5 — тишина между кадрами: не меньше 3,5 символа. По ней приёмник находит конец одного кадра и начало следующего.
  • t1,5 — наибольшая пауза между соседними символами одного кадра. Если она длиннее 1,5 символа, кадр считается оборванным и отбрасывается. Кадр нужно передавать сплошным потоком.

На скоростях выше 19 200 бит/с спецификация рекомендует не считать паузы в символах, а взять фиксированные 750 мкс для t1,5 и 1,75 мс для t3,5: иначе таймеры срабатывают слишком часто и нагружают процессор.

Скорость, бит/сСимволt1,5t3,5Запрос, 8 байтОтвет, 25 байт
12009,167 мс13,75 мс32,08 мс73,33 мс229,2 мс
24004,583 мс6,875 мс16,04 мс36,67 мс114,6 мс
48002,292 мс3,438 мс8,021 мс18,33 мс57,29 мс
96001,146 мс1,719 мс4,010 мс9,167 мс28,65 мс
19 2000,573 мс0,859 мс2,005 мс4,583 мс14,32 мс
38 4000,286 мс0,75 мс1,75 мс2,292 мс7,161 мс
57 6000,191 мс0,75 мс1,75 мс1,528 мс4,774 мс
115 2000,095 мс0,75 мс1,75 мс0,764 мс2,387 мс
Обмен Modbus RTU во времени: запрос, пауза, ответ, паузаСкорость 9600 бит/с. После тишины не короче t3,5 = 4,01 мс ведущий передаёт запрос из 8 байт за 9,17 мс. Устройство отвечает не раньше чем через t3,5: ответ из 25 байт занимает 28,65 мс. Следующий запрос ведущий начинает после ещё одной паузы t3,5. Весь цикл от начала запроса — не короче 45,83 мс.цикл обмена — не короче 45,83 мсведущийустройствозапрос, 8 байт9,17 мсответ, 25 байт: 01 03 14 + 20 байт данных + CRC28,65 мс≥ t3,5≥ t3,5≥ t3,59600 бит/с, символ 11 бит: t3,5 = 4,01 мс. Внутри кадра паузы между символами — не больше t1,5 = 1,72 мс.t
Обмен на скорости 9600 бит/с в масштабе: запрос 01 03 00 00 00 0A C5 CD и ответ с десятью регистрами. Между кадрами — тишина не короче t3,5; к паузе перед ответом добавляется время обработки запроса в устройстве.

Калькулятор складывает из этих величин нижнюю границу цикла обмена: запрос, пауза t3,5, ответ и ещё одна пауза t3,5 перед следующим запросом. Реальный цикл длиннее на время, за которое устройство обрабатывает запрос; его даёт документация на устройство или осциллограф. Таймаут ожидания ответа спецификация оставляет приложению и приводит ориентир: от одной до нескольких секунд при 9600 бит/с.

Обязательные скорости — 9600 и 19 200 бит/с, вторая — по умолчанию. Передатчик должен выдерживать скорость точнее 1 %, приёмник — допускать расхождение 2 %; получится ли это на вашем кварце, покажет калькулятор скорости UART.

Номера регистров 4xxxx и адреса в кадре

В документации на устройства регистры часто обозначены номерами вида 40001, 30009 или 10197. Это нотация контроллеров Modicon: первая цифра — таблица данных, остальные — номер элемента в таблице, и счёт идёт с единицы. В кадре нет ни первой цифры, ни счёта с единицы: таблицу задаёт код функции, а адрес на единицу меньше номера.

Первая цифраТаблицаПять цифрШесть цифрЧтениеЗапись
0дискретные выходы (coils)00001–09999000001–0655360105, 15
1дискретные входы10001–19999100001–16553602—
3входные регистры30001–39999300001–36553604—
4регистры хранения40001–49999400001–4655360306, 16

Примеры из руководства Modicon: регистр 40001 — функция 03 и адрес 0000; регистр 40108 — адрес 107, или 0x006B; входной регистр 30009 — функция 04 и адрес 8; входы 10197–10218 — функция 02, адрес 196 (0x00C4) и количество 22.

Пять цифр оставляют на номер четыре разряда, то есть 9999 элементов, а адрес в кадре занимает 16 бит и вмещает 65 536. Поэтому появилась запись из шести цифр: 400001 — тот же регистр, что и 40001, а 410000 в пять цифр уже не записать.

В самой спецификации Modbus этой нотации нет. Там сказано только, что элементы каждой таблицы нумеруются с единицы, а в кадре элемент с номером X имеет адрес X − 1. Отсюда и главная путаница: в одних документах указаны номера, в других — адреса с нуля, часто шестнадцатеричные. Признак адреса — запись вида 0x006B или нулевой адрес в начале таблицы. Если значения приходят сдвинутыми на один регистр или устройство отвечает исключением 02 на первый или последний регистр карты, попробуйте адрес на единицу меньше или больше.

32-битные значения и порядок байтов

Спецификация определяет только 16-битный регистр и порядок байтов в нём — старший первым. Как уложить в два регистра 32-битное целое или float, она не говорит, и производители делают это по-разному. Вариантов четыре: два порядка байтов внутри регистра и два порядка самих регистров.

Обозначим байты значения буквами от старшего A до младшего D. Число 123,456 в формате float — это 0x42F6E979: A = 42, B = F6, C = E9, D = 79.

ПорядокПервый регистрВторой регистрЧто переставлено
ABCD42F6E979ничего: старший байт первым (big-endian)
CDABE97942F6регистры: первым идёт младшее слово
BADCF64279E9байты внутри каждого регистра
DCBA79E9F642и то и другое: младший байт первым (little-endian)
Четыре порядка байтов 32-битного значения в двух регистрах ModbusЧисло 123,456 в формате float — это 0x42F6E979, байты от старшего к младшему: A = 42, B = F6, C = E9, D = 79. Порядок ABCD: регистры 42F6 и E979. Порядок CDAB: E979 и 42F6. Порядок BADC: F642 и 79E9. Порядок DCBA: 79E9 и F642.float 123,456 = 0x42F6E979: A = 42, B = F6, C = E9, D = 79первый регистр в кадревторой регистррегистры, HEXABCDстарший байт первымA42BF6CE9D7942F6 E979CDABпервым идёт младшее словоCE9D79A42BF6E979 42F6BADCбайты в регистрах переставленыBF6A42D79CE9F642 79E9DCBAмладший байт первымD79CE9BF6A4279E9 F642
Одно и то же значение 123,456 (0x42F6E979) в двух регистрах при четырёх порядках байтов. Синим отмечены байты старшего слова, оранжевым — младшего.

Порядок ABCD продолжает правило спецификации на два регистра. Порядок CDAB тоже распространён: в справке к драйверу Kepware вариант «первым идёт младшее слово» включён по умолчанию и назван соглашением пакета программирования Modicon Modsoft. В настройках драйверов и SCADA эти два выбора обычно разнесены на два переключателя — порядок байтов в регистре и порядок слов.

Если документация молчит, порядок подбирают по смыслу. Прочитайте пару регистров с величиной, значение которой известно хотя бы примерно, — напряжение сети, температуру в помещении — и посмотрите на четыре варианта в калькуляторе. Правдоподобное число получается только в одном. Если пары выглядят бессмысленно во всех порядках, возможно, значение начинается с соседнего регистра: переключите начало пар. Как float устроен побитно, показывает конвертер систем счисления.

Пример: запрос десяти регистров и разбор ответа

Запрос. Нужно прочитать 10 регистров хранения, начиная с адреса 0, у устройства с адресом 1 на скорости 9600 бит/с — это состояние калькулятора по умолчанию.

  1. Адрес устройства — 01, код функции — 03.
  2. Адрес первого регистра 0 — байты 00 00, количество 10 — байты 00 0A.
  3. CRC-16 по шести байтам 01 03 00 00 00 0A равна 0xCDC5, в кадр она идёт младшим байтом вперёд: C5 CD.
  4. Кадр целиком: 01 03 00 00 00 0A C5 CD — 8 байт, на передачу уходит 8 × 11 / 9600 = 9,17 мс.

Нормальный ответ начнётся с 01 03 14: счётчик байт 0x14 — это 20 байт данных, по два на регистр. Вместе с адресом, кодом функции, счётчиком и CRC получается 25 байт и 28,65 мс. Цикл обмена — не короче 9,167 + 4,010 + 28,646 + 4,010 = 45,83 мс, то есть при 9600 бит/с такой опрос удаётся повторять не чаще 21 раза в секунду. Если регистров с такими адресами нет, придёт 01 83 02 C0 F1.

Ответ. В режиме «Разобрать кадр» по умолчанию стоит ответ на запрос двух регистров: 01 03 04 41 CC 00 00 2E 30.

  1. 01 — адрес устройства, 03 — функция, 04 — счётчик байт: два регистра.
  2. Регистры: 41CC — это 16 844, и 0000 — это 0.
  3. CRC: в кадре 2E 30, то есть 0x302E; расчёт по первым семи байтам даёт то же значение.
  4. Как 32-битное значение пара 41CC 0000 в порядке ABCD — это float 25,5. Остальные порядки дают 2,36·10⁻⁴¹, −5,06·10⁷ и 7,33·10⁻⁴¹ — очевидно не температура и не напряжение. Значит, устройство передаёт float в порядке ABCD.

Типичные ошибки

  • Адрес сдвинут на единицу. Номер 40001 введён как адрес 1 или 40001. В кадре должен быть 0.
  • Функция не от той таблицы. Регистры 3xxxx читаются функцией 04, а не 03; выходы — функцией 01, входы — 02. Устройство ответит исключением 01 или 02 либо вернёт значения совсем других регистров.
  • Байты CRC переставлены или CRC посчитана другим алгоритмом. Нужна CRC-16/MODBUS: начальное значение FFFF, полином A001, младший байт первым. На такой кадр устройство не отвечает.
  • Слишком большое количество. Больше 125 регистров или 2000 битов за одно чтение, больше 123 регистров или 1968 выходов за одну запись — исключение 03. Длинную карту читают несколькими запросами.
  • Паузы внутри кадра. Байты отправляются по одному с задержками больше t1,5, и приёмник видит несколько оборванных кадров. Кадр нужно отдавать в порт целиком.
  • Запрос сразу после ответа. Между концом ответа и следующим запросом нужна тишина не короче t3,5.
  • Разный формат символа. У ведущего 8E1, у устройства 8N2 или 8N1 — символы принимаются с ошибками чётности и кадра, и ответа нет. Скорость, чётность и число стоп-битов должны совпадать у всех устройств на линии.
  • Перепутан порядок байтов 32-битного значения: вместо 25,5 получается число порядка 10⁻⁴¹ или 10⁷.
  • Ожидание ответа на широковещательный запрос. На адрес 0 устройства не отвечают, а читать по нему бессмысленно.
  • Передатчик RS-485 выключен раньше конца кадра. Последний байт — старший байт CRC — обрезается, и кадр отбрасывается. Когда снимать сигнал DE, разобрано в статье про RS-485.

Частые вопросы

Как собрать запрос Modbus RTU на чтение регистров?

Кадр состоит из адреса устройства, кода функции, данных и CRC-16. Чтобы прочитать 10 регистров хранения с адреса 0 у устройства 1, нужны байты 01 03 00 00 00 0A и контрольная сумма C5 CD: 01 — адрес устройства, 03 — функция чтения регистров хранения, 00 00 — адрес первого регистра, 00 0A — количество. Адрес и количество передаются старшим байтом вперёд, CRC — младшим.

Почему регистр 40001 читается по адресу 0?

40001 — не адрес, а номер в нотации Modicon: первая цифра 4 означает таблицу регистров хранения, остальные — порядковый номер с единицы. В кадре передаётся адрес с нуля, на единицу меньше номера, а таблицу выбирает код функции. Поэтому 40001 — это функция 03 и адрес 0, а 40108 — адрес 107, или 0x006B. Если устройство отвечает исключением 02 или значения сдвинуты на один регистр, проверьте именно это.

В каком порядке идут байты CRC в Modbus RTU?

Младший байт первым — в отличие от адресов и значений регистров, которые передаются старшим байтом вперёд. Для кадра 01 03 00 00 00 0A значение CRC-16 равно 0xCDC5, и в линию уходят байты C5 CD. Кадр с переставленными байтами CRC устройство молча отбрасывает: ответа не будет, ведущий дождётся таймаута.

Что означает ответ с кодом функции 83?

Это исключение: устройство приняло запрос без ошибок связи, но выполнить его не может. Код функции в таком ответе — код из запроса плюс 0x80: 83 для функции 03, 90 для функции 16. Следующий байт — код причины: 01 — функция не поддерживается, 02 — такого адреса нет, 03 — недопустимое количество или значение в запросе, 04 — отказ устройства. Весь кадр занимает 5 байт.

Как прочитать float из двух регистров Modbus?

Спецификация описывает только 16-битные регистры, поэтому порядок двух половин 32-битного числа выбирает производитель устройства. Вставьте ответ в режиме «Разобрать кадр» — калькулятор покажет каждую пару регистров как float в четырёх порядках байтов: ABCD, CDAB, BADC и DCBA. Регистры 41CC и 0000 в порядке ABCD дают 25,5, а в остальных — бессмысленные числа вроде 2,4·10⁻⁴¹. По этому признаку и выбирают верный порядок.

Какую паузу выдерживать между кадрами Modbus RTU?

Не меньше 3,5 символа тишины, а символ в режиме RTU занимает 11 бит. При 9600 бит/с это 4,01 мс, при 19 200 бит/с — 2,005 мс. На скоростях выше 19 200 бит/с спецификация рекомендует фиксированные 1,75 мс. Внутри кадра пауза между соседними символами не должна превышать 1,5 символа — 1,72 мс при 9600 бит/с, иначе приёмник сочтёт кадр оборванным и отбросит его.

Источники

  1. Modbus Organization. MODBUS Application Protocol Specification V1.1b3, 2012 — порядок байтов (разд. 4.2), адресация с нуля (4.4), форматы запросов и ответов, пределы количества и примеры (6.1–6.6, 6.11, 6.12), ответы с исключением и коды исключений (7)
  2. Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02, 2006 — широковещательные запросы и таймауты (разд. 2.1, 2.4.1), адреса устройств (2.2), кадр RTU и символ из 11 бит (2.5.1), паузы t1,5 и t3,5 (2.5.1.1), CRC (2.5.1.2 и приложение B), поведение при ошибке (2.6), скорости (3.2)
  3. Modicon. Modbus Protocol Reference Guide PI-MBUS-300 Rev. J, 1996 — ссылки 0X, 1X, 3X и 4X; примеры: регистр 40001 — адрес 0000, регистр 40108 — адрес 006B
  4. Kepware Technologies. Modbus TCP/IP Ethernet Driver Help, 2014 — пяти- и шестизначная запись номеров (400001–465536), настройки порядка байтов и слов для 32-битных типов
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/modbus-rtu/" title="Modbus RTU: сборка и разбор кадров" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/modbus-rtu/">Modbus RTU: сборка и разбор кадров</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено . Нашли ошибку в расчёте? Напишите нам.