Transaction Identifier (номер транзакции) в Modbus TCP
В Modbus RTU ведущий ждёт ответа на каждый запрос, прежде чем послать следующий. В Modbus TCP можно отправить несколько запросов подряд — и тогда нужно понять, какой ответ к какому запросу относится. Для этого первые два байта кадра занимает номер транзакции.
Обновлено Редакция GAW
Содержание
Transaction Identifier (номер транзакции) — первые два байта заголовка MBAP в кадре Modbus TCP. Клиент записывает в него номер запроса, а сервер копирует этот номер в ответ без изменений, чтобы клиент мог сопоставить ответ с запросом (Implementation Guide V1.0b, разд. 3.1.3).
Зачем он нужен
На последовательной линии Modbus RTU клиент отправляет один запрос и ждёт ответа, прежде чем послать следующий. В Modbus TCP можно отправить несколько запросов подряд, не дожидаясь ответов, — тогда номер транзакции обязателен, чтобы отличать ответы друг от друга (разд. 4.2.1.1 и 4.4.1.2). Совместимость двух режимов — за шлюзом Modbus TCP — RTU, который стоит между сетью и линией (разд. 4.4.1.2).
Правила
- Уникальность. В каждый момент номер должен быть уникален среди ожидающих транзакций на данном соединении TCP. Его можно вести как счётчик, увеличиваемый с каждым запросом, или использовать как индекс контекста транзакции (разд. 4.4.1.2).
- Порядок байтов. Как и остальные поля MBAP, номер передаётся старшим байтом вперёд — см. «Порядок байтов».
- Проверка ответа. Ответ с номером, который не относится ни к одной ожидающей транзакции, клиент отбрасывает; затем проверяет Protocol Identifier — он должен быть 0x0000 (разд. 4.4.1.3).
- Предел одновременных транзакций. У клиента параметр NumberMaxOfClientTransaction — от 1 до 16 в зависимости от устройства. Если у сервера закончились свободные транзакции, он отвечает исключением 06 — Server Busy (разд. 4.4.2.2).
Пример
Запрос чтения регистров с номером транзакции 1: 00 01 00 00 00 06 01 03 00 6B 00 03. Первые два байта — номер транзакции 0x0001, дальше Protocol Identifier 0, длина 6 и Unit ID 1, затем PDU — функция 03, адрес 0x006B, количество 3. Ответ на него тоже начнётся с 00 01 (наш пример, формат по разд. 3.1.3). Собрать и разобрать кадр можно в калькуляторе Modbus TCP.
Таймаут
Время ответа в Modbus TCP намеренно не нормировано: протокол работает и в сетях с субмиллисекундными опросами, и на радиоканалах с задержками в секунды (разд. 4.4.1.4). Поэтому клиент сам выбирает таймаут, а опоздавший ответ отбрасывает по номеру транзакции. Как устроены функции и регистры самого протокола — в статье «Modbus RTU».
Частые вопросы
Какое значение ставить в Transaction ID?
Любое, лишь бы оно было уникальным среди запросов, ожидающих ответа на этом соединении. Проще всего — счётчик, который увеличивается с каждым запросом; можно использовать номер как индекс контекста транзакции (Implementation Guide, разд. 4.4.1.2). Сервер копирует номер в ответ без изменений.
Что делать с ответом, номер которого не совпал ни с одним запросом?
Отбросить: спецификация так и требует — ответ, номер транзакции которого не относится ни к одной ожидающей транзакции, отбрасывается (разд. 4.4.1.3). Так бывает, например, когда ответ пришёл после того, как клиент перестал ждать по таймауту (наш пример).
Сколько запросов можно отправить, не дожидаясь ответов?
Столько, сколько поддерживают обе стороны. У клиента параметр NumberMaxOfClientTransaction — от 1 до 16 в зависимости от устройства (разд. 4.4.1.2), у сервера свой предел; если у сервера кончились транзакции, он ответит исключением 06 — устройство занято (разд. 4.4.2.2).
Источники
- Modbus Organization. MODBUS Messaging on TCP/IP Implementation Guide V1.0b (2006) — разд. 3.1.3: Transaction Identifier — 2 байта, для связи запроса и ответа, задаёт клиент, сервер копирует из запроса; Protocol Identifier 0 = Modbus; поля big-endian; разд. 4.2.1.1, п. 4: несколько транзакций одновременно на одном соединении TCP — тогда номер транзакции обязателен для сопоставления; разд. 4.4.1.2: в каждый момент на соединении номер должен быть уникален, его можно использовать как счётчик, увеличиваемый с каждым запросом, или как индекс контекста транзакции; на последовательной линии клиент ждёт ответа, в TCP — нет, совместимость обеспечивает шлюз; NumberMaxOfClientTransaction — от 1 до 16 в зависимости от устройства; разд. 4.4.1.3: ответ с номером, не относящимся ни к одной ожидающей транзакции, отбрасывается; затем проверяется Protocol Identifier 0x0000; разд. 4.4.1.4: время ответа намеренно не нормировано; разд. 4.4.2.2: кадр с Protocol Identifier не 0 сервер отбрасывает; при нехватке транзакций (NumberMaxOfTransaction) — исключение 06 Server Busy
- Modbus Organization. MODBUS Application Protocol Specification V1.1b3 (2012) — разд. 4.1: PDU не длиннее 253 байт, ADU Modbus TCP — до 260 байт; разд. 7: исключение 06 SERVER DEVICE BUSY — повторить запрос позже
Нашли ошибку?
Смотрите также
- Modbus TCP: кадрыЗаголовок MBAP, функции 01–06, 15, 16 и 23, разбор, сравнение с RTU
- Unit ID (Modbus TCP)Байт MBAP для адресации ведомого за шлюзом; напрямую — 0xFF или 0
- Modbus RTUКадр, паузы 3,5 символа, функции, регистры, CRC-16, RS-485, отладка
- Порядок байтовLittle-endian и big-endian в памяти и протоколах
- Modbus RTU мастерОпрос приборов через Web Serial: регистры, исключения, журнал
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка