Кадр 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 байт | что нужно сделать; в ответе с исключением — тот же код плюс 0x80 | 03 |
| Данные | 0–252 байта | зависят от функции: адрес, количество, счётчик байт, значения | 00 00 00 0A |
| CRC-16 | 2 байта | контрольная сумма всех предыдущих байтов, младший байт первым | 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, 02 | 8 байт | 5 байт + количество / 8 с округлением вверх |
| 03, 04 | 8 байт | 5 байт + 2 × количество |
| 05, 06 | 8 байт | 8 байт |
| 15 | 9 байт + количество / 8 с округлением вверх | 8 байт |
| 16 | 9 байт + 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.
| Код | Название в спецификации | Что означает |
|---|---|---|
| 01 | ILLEGAL FUNCTION | устройство не поддерживает эту функцию или не может выполнить её в нынешнем состоянии |
| 02 | ILLEGAL DATA ADDRESS | в устройстве нет такого адреса, или диапазон «адрес + количество» выходит за его границы |
| 03 | ILLEGAL DATA VALUE | недопустимое значение в поле запроса: количество вне пределов функции, счётчик байт не соответствует количеству |
| 04 | SERVER DEVICE FAILURE | неустранимая ошибка при выполнении запроса |
| 05 | ACKNOWLEDGE | запрос принят, но выполнение займёт много времени; используется с командами программирования |
| 06 | SERVER DEVICE BUSY | устройство занято длительной командой, запрос нужно повторить позже |
| 08 | MEMORY PARITY ERROR | ошибка в памяти при чтении файла записей, функции 20 и 21 |
| 0A | GATEWAY PATH UNAVAILABLE | шлюз не смог выделить путь к устройству: он неверно настроен или перегружен |
| 0B | GATEWAY 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.
Длительность символа, паузы и время передачи кадра из байт на скорости бит/с:
- t3,5 — тишина между кадрами: не меньше 3,5 символа. По ней приёмник находит конец одного кадра и начало следующего.
- t1,5 — наибольшая пауза между соседними символами одного кадра. Если она длиннее 1,5 символа, кадр считается оборванным и отбрасывается. Кадр нужно передавать сплошным потоком.
На скоростях выше 19 200 бит/с спецификация рекомендует не считать паузы в символах, а взять фиксированные 750 мкс для t1,5 и 1,75 мс для t3,5: иначе таймеры срабатывают слишком часто и нагружают процессор.
| Скорость, бит/с | Символ | t1,5 | t3,5 | Запрос, 8 байт | Ответ, 25 байт |
|---|---|---|---|---|---|
| 1200 | 9,167 мс | 13,75 мс | 32,08 мс | 73,33 мс | 229,2 мс |
| 2400 | 4,583 мс | 6,875 мс | 16,04 мс | 36,67 мс | 114,6 мс |
| 4800 | 2,292 мс | 3,438 мс | 8,021 мс | 18,33 мс | 57,29 мс |
| 9600 | 1,146 мс | 1,719 мс | 4,010 мс | 9,167 мс | 28,65 мс |
| 19 200 | 0,573 мс | 0,859 мс | 2,005 мс | 4,583 мс | 14,32 мс |
| 38 400 | 0,286 мс | 0,75 мс | 1,75 мс | 2,292 мс | 7,161 мс |
| 57 600 | 0,191 мс | 0,75 мс | 1,75 мс | 1,528 мс | 4,774 мс |
| 115 200 | 0,095 мс | 0,75 мс | 1,75 мс | 0,764 мс | 2,387 мс |
Калькулятор складывает из этих величин нижнюю границу цикла обмена: запрос, пауза t3,5, ответ и ещё одна пауза t3,5 перед следующим запросом. Реальный цикл длиннее на время, за которое устройство обрабатывает запрос; его даёт документация на устройство или осциллограф. Таймаут ожидания ответа спецификация оставляет приложению и приводит ориентир: от одной до нескольких секунд при 9600 бит/с.
Обязательные скорости — 9600 и 19 200 бит/с, вторая — по умолчанию. Передатчик должен выдерживать скорость точнее 1 %, приёмник — допускать расхождение 2 %; получится ли это на вашем кварце, покажет калькулятор скорости UART.
Номера регистров 4xxxx и адреса в кадре
В документации на устройства регистры часто обозначены номерами вида 40001, 30009 или 10197. Это нотация контроллеров Modicon: первая цифра — таблица данных, остальные — номер элемента в таблице, и счёт идёт с единицы. В кадре нет ни первой цифры, ни счёта с единицы: таблицу задаёт код функции, а адрес на единицу меньше номера.
| Первая цифра | Таблица | Пять цифр | Шесть цифр | Чтение | Запись |
|---|---|---|---|---|---|
| 0 | дискретные выходы (coils) | 00001–09999 | 000001–065536 | 01 | 05, 15 |
| 1 | дискретные входы | 10001–19999 | 100001–165536 | 02 | — |
| 3 | входные регистры | 30001–39999 | 300001–365536 | 04 | — |
| 4 | регистры хранения | 40001–49999 | 400001–465536 | 03 | 06, 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.
| Порядок | Первый регистр | Второй регистр | Что переставлено |
|---|---|---|---|
| ABCD | 42F6 | E979 | ничего: старший байт первым (big-endian) |
| CDAB | E979 | 42F6 | регистры: первым идёт младшее слово |
| BADC | F642 | 79E9 | байты внутри каждого регистра |
| DCBA | 79E9 | F642 | и то и другое: младший байт первым (little-endian) |
Порядок ABCD продолжает правило спецификации на два регистра. Порядок CDAB тоже распространён: в справке к драйверу Kepware вариант «первым идёт младшее слово» включён по умолчанию и назван соглашением пакета программирования Modicon Modsoft. В настройках драйверов и SCADA эти два выбора обычно разнесены на два переключателя — порядок байтов в регистре и порядок слов.
Если документация молчит, порядок подбирают по смыслу. Прочитайте пару регистров с величиной, значение которой известно хотя бы примерно, — напряжение сети, температуру в помещении — и посмотрите на четыре варианта в калькуляторе. Правдоподобное число получается только в одном. Если пары выглядят бессмысленно во всех порядках, возможно, значение начинается с соседнего регистра: переключите начало пар. Как float устроен побитно, показывает конвертер систем счисления.
Пример: запрос десяти регистров и разбор ответа
Запрос. Нужно прочитать 10 регистров хранения, начиная с адреса 0, у устройства с адресом 1 на скорости 9600 бит/с — это состояние калькулятора по умолчанию.
- Адрес устройства — 01, код функции — 03.
- Адрес первого регистра 0 — байты 00 00, количество 10 — байты 00 0A.
- CRC-16 по шести байтам 01 03 00 00 00 0A равна 0xCDC5, в кадр она идёт младшим байтом вперёд: C5 CD.
- Кадр целиком: 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.
- 01 — адрес устройства, 03 — функция, 04 — счётчик байт: два регистра.
- Регистры: 41CC — это 16 844, и 0000 — это 0.
- CRC: в кадре 2E 30, то есть 0x302E; расчёт по первым семи байтам даёт то же значение.
- Как 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 бит/с, иначе приёмник сочтёт кадр оборванным и отбросит его.
Источники
- Modbus Organization. MODBUS Application Protocol Specification V1.1b3, 2012 — порядок байтов (разд. 4.2), адресация с нуля (4.4), форматы запросов и ответов, пределы количества и примеры (6.1–6.6, 6.11, 6.12), ответы с исключением и коды исключений (7)
- 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)
- Modicon. Modbus Protocol Reference Guide PI-MBUS-300 Rev. J, 1996 — ссылки 0X, 1X, 3X и 4X; примеры: регистр 40001 — адрес 0000, регистр 40108 — адрес 006B
- 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>Обновлено . Нашли ошибку в расчёте? Напишите нам.