Appearance
Поля фильтра Modbus RTU
Фильтр работает по разобранной записи Modbus. Имя поля начинается с modbus.. Синтаксис общий с другими профилями, но поля trace.* и can.* в этом каталоге недоступны.
Каталог
| Поле | Тип | Значение и применимость |
|---|---|---|
modbus.transport | Строка | В этом профиле rtu. Общий каталог также знает tcp, но TCP не входит в этот раздел |
modbus.unitId | Целое | Адрес RTU-устройства у корректной записи; 0 используется для широковещательного запроса |
modbus.function | Целое | Код функции без бита исключения. Ответ 0x83 относится к функции 0x03 |
modbus.transactionId | Целое | Поле общего каталога для Modbus TCP. У RTU всегда отсутствует |
modbus.request | Логическое | Запрос при определённой роли; широковещательный запрос тоже считается запросом |
modbus.response | Логическое | Ответ при определённой роли |
modbus.broadcast | Логическое | Корректный широковещательный запрос RTU к адресу 0 |
modbus.exception | Логическое | Корректный ответ с исключением |
modbus.exceptionCode | Целое | Код исключения; отсутствует у обычного ответа и запроса |
modbus.valid | Логическое | Запись прошла проверку структуры и CRC; false выделяет некорректные записи |
modbus.startAddress | Целое | Начальный или целевой адрес с отсчётом от нуля, если он содержится в PDU |
modbus.quantity | Целое | Количество запрошенных или подтверждённых элементов, если содержится в PDU |
modbus.byteCount | Целое | Объявленное число байтов данных, если содержится в PDU |
modbus.data | Байты | Данные функции без адреса устройства, кода функции, начального адреса, количества, счётчика байтов и CRC; см. таблицу ниже |
Для неверной записи большинство разобранных полей отсутствует. Поэтому условие modbus.valid == false and modbus.unitId == 7 не подходит для поиска всех повреждённых сообщений предполагаемого устройства: адрес может быть недостоверен и не предоставляться фильтру.
Роль запроса или ответа не выводится только из RX/TX. В частности, одинаковые по форме сообщения записи одного элемента не всегда однозначно классифицируются при пассивном наблюдении.
Где находятся диапазон и данные
| Функции | Запрос | Обычный ответ |
|---|---|---|
01, 02, 03, 04 — чтение | startAddress, quantity; поля data нет | byteCount, data; полей startAddress и quantity нет |
05, 06 — запись одного элемента | startAddress, data из двух байтов значения; поля quantity нет | Такие же поля |
0F, 10 — запись нескольких элементов | startAddress, quantity, byteCount, data | startAddress, quantity; поля data нет |
| Ответ с исключением | — | exceptionCode; диапазона и данных обычного ответа нет |
Значение modbus.data[0] — первый байт данных функции, а не первый байт RTU-кадра. Для ответа чтения регистров это старший байт первого регистра. Назначение и преобразование значения определяет описание устройства.
Примеры
Чтение регистров хранения у адреса 7, включая ответы с исключением:
text
modbus.unitId == 7 and modbus.function == 0x03Запрос чтения десяти регистров начиная с адреса 100:
text
modbus.unitId == 7 and modbus.request == true and modbus.function == 0x03 and modbus.startAddress == 100 and modbus.quantity == 10Это фильтр запросов. Ответ чтения не содержит адрес 100 и к нему автоматически не присоединяется.
Ответы с исключением:
text
modbus.exception == trueОтветы с кодом исключения 0x02:
text
modbus.exceptionCode == 0x02Некорректные записи:
text
modbus.valid == falseШироковещательные запросы:
text
modbus.broadcast == trueРаспознанные запросы записи:
text
modbus.request == true and modbus.function in (0x05, 0x06, 0x0F, 0x10)Ответы чтения со значением 0x1234 в первом регистре:
text
modbus.function == 0x03 and modbus.response == true and modbus.data[0] == 0x12 and modbus.data[1] == 0x34Начальный адрес в выражении — адрес протокола. Не подставляйте обозначения вида 40001 без перевода по правилам документации устройства.
Продолжить: практический разбор Modbus RTU.