Паузы t1,5 и t3,5 (Modbus RTU)
В Modbus RTU нет специального символа начала или конца сообщения. Приёмник находит границы кадра по паузам на линии: длинная тишина отделяет кадры, а слишком длинный разрыв внутри кадра делает его недействительным.
Обновлено Редакция GAW
Паузы t1,5 и t3,5 — интервалы тишины на линии, по которым устройства Modbus RTU находят границы кадров. В режиме RTU нет символов начала и конца сообщения, поэтому спецификация Modbus over Serial Line задаёт время:
- t3,5 — кадры разделяет тишина не короче 3,5 символа. После неё приёмник ждёт новый кадр.
- t1,5 — внутри кадра пауза между символами не может быть больше 1,5 символа. Если она длиннее, кадр считается неполным и отбрасывается.
Время символа
Символ RTU — всегда 11 битов: старт-бит, 8 бит данных, бит чётности и стоп-бит. Если чётность не используется, вместо неё ставят второй стоп-бит, и длина не меняется. Поэтому время символа равно 11 / скорость, а паузы считаются так:
где B — скорость в бит/с.
| Скорость | Символ | t1,5 | t3,5 |
|---|---|---|---|
| 9600 бит/с | 1,146 мс | 1,72 мс | 4,01 мс |
| 19 200 бит/с | 0,573 мс | 0,859 мс | 2,005 мс |
| выше 19 200 бит/с | — | 750 мкс | 1,75 мс |
Первые две строки — наш расчёт по формуле, последняя — рекомендация спецификации: на высоких скоростях таймеры срабатывали бы слишком часто и нагружали процессор, поэтому вместо расчётных значений берут постоянные.
Как это реализуют
Приёмник перезапускает таймер на каждом принятом байте. Сработал таймер t1,5 — кадр закончен или испорчен, сработал t3,5 — линия свободна и можно отвечать. Схожий, но более короткий признак есть в самих UART — флаг свободной линии IDLE, который срабатывает через один кадр. Составить запрос и проверить CRC поможет калькулятор кадра Modbus RTU, а опросить устройство из браузера — Modbus-мастер.
Не путать с таймаутом ответа: это время, которое ведущий ждёт ответа ведомого после своего запроса. Спецификация называет его Response time-out и оставляет значение на усмотрение приложения (разд. 2.4).
Частые вопросы
Как рассчитать t3,5 для Modbus RTU?
Символ RTU всегда 11 битов: старт, 8 бит данных, чётность и стоп или два стопа без чётности. Время символа — 11 / скорость, t3,5 — в 3,5 раза больше. При 9600 бит/с символ длится 1,146 мс, t3,5 ≈ 4,01 мс, t1,5 ≈ 1,72 мс; при 19 200 бит/с — 2,005 и 0,859 мс (наш расчёт). Выше 19 200 бит/с берут постоянные 1,75 мс и 750 мкс.
Что будет, если внутри кадра пауза больше 1,5 символа?
По спецификации приёмник считает кадр неполным и отбрасывает его целиком. Поэтому передатчик должен выдавать кадр непрерывным потоком: например, класть все байты в буфер UART или DMA заранее, а не по одному из медленного цикла.
Можно ли определять конец кадра по флагу IDLE UART?
Только как первый шаг. Флаг IDLE в STM32 срабатывает после паузы в один кадр UART, а Modbus требует тишины 3,5 символа. Чтобы не принять разрыв внутри кадра за его конец, нужен таймер на t1,5 и t3,5 или аппаратный тайм-аут приёмника с нужной длительностью.
Источники
- Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02 (20.12.2006) — разд. 2.5.1: символ RTU — 11 битов: 1 старт, 8 данных, бит чётности (по умолчанию even), 1 стоп; без чётности — 2 стоп-бита; разд. 2.5.1.1: кадры разделяются тишиной не меньше 3,5 символа (t3,5), кадр передаётся непрерывно; пауза больше 1,5 символа между символами — кадр неполный и отбрасывается; до 19 200 бит/с включительно оба таймера соблюдаются строго, выше — рекомендованы постоянные 750 мкс (t1,5) и 1,750 мс (t3,5); переход из начального состояния в Idle — после истечения t3,5
- Modicon, Inc. Modbus Protocol Reference Guide, PI-MBUS-300 Rev. J (1996) — режим RTU: сообщение начинается и заканчивается тишиной не меньше 3,5 символа; пауза больше 1,5 символа до конца кадра — приёмник сбрасывает неполное сообщение; новое сообщение раньше 3,5 символа после предыдущего считается его продолжением
Нашли ошибку?