Фильтры Tracer
Фильтр оставляет строки, удовлетворяющие условию по полям сообщения. Он действует на выбранное представление Tracer; сбор трассы, сохранение и Monitor от него не зависят. Выражение фильтра — строка условия, которую вы вводите в Filter expression.
Шпаргалка
В таблице field, flag, text и data — условные имена, а не поля приложения. Замените их полями из каталога своего уровня.
| Конструкция | Короткий пример | Назначение |
|---|---|---|
==, != | field == 7, field != 7 | Равенство и неравенство совместимых типов |
<, <=, >, >= | field < 10, field <= 10, field > 0, field >= 1 | Сравнение целых чисел |
and, or, not | field == 7 and flag == true, field == 7 or field == 8, not (flag == true) | Логические условия |
in (...) | field in (1, 2, 3) | Одно из перечисленных значений |
contains | text contains "метка", data contains [0x22, 0xF1] | Подстрока или непрерывная последовательность байтов |
exists(...) | exists(field) | Наличие поля у сообщения |
[индекс] | data[0] == 0x22 | Отдельный байт; отсчёт с нуля |
( ... ) | flag == true and (field == 1 or field == 2) | Группировка условий |
Приоритет и совместимые формы записи — в разделе «Операции». Если поле есть не у всех сообщений, проверьте правила отсутствующих значений.
Выберите нужный каталог
| Профиль и уровень | Доступные поля | Справочник |
|---|---|---|
CANopen / VAG, Physical | trace.*, can.* | CAN |
| Modbus RTU | modbus.* | Modbus RTU |
CANopen, Protocol | protocol.type, canopen.* | CANopen |
VAG, Transport | protocol.type, isotp.*, tp20.* | Automotive VAG |
VAG, Protocol | protocol.type, uds.*, kwp.* | Automotive VAG |
Звёздочка здесь обозначает группу полей в справке. Это не синтаксис выражения. Общие по названию поля trace.* сейчас доступны только на исходном уровне CAN.
Одно выражение не объединяет разные уровни. Например, can.id нельзя использовать на уровне Protocol вместе с uds.service. На уровне Protocol VAG можно объединять uds.* и kwp.*, поскольку они входят в каталог одного уровня. Поля другого протокола у конкретной строки при этом отсутствуют.
Ввод
Введите выражение фильтра в Filter expression. Корректное выражение применяется после небольшой паузы при вводе; Enter запускает применение сразу.
Ctrl+Space— открыть подсказки.- Стрелки вверх и вниз — выбрать подсказку.
EnterилиTabпри открытом списке — принять подсказку.Esc— закрыть список подсказок.- Пустая строка — снять выражение фильтра.
После ==, != и внутри набора in (...) предлагаются известные значения выбранного поля. Для числовых полей подсказки также работают после <, <=, > и >=, для строковых — после contains. Список сужается по введённому префиксу: например, после protocol.type == u нажмите Tab, чтобы принять uds.
Подстановка работает и внутри кавычек: после can.frameType == "e предлагается "ext". Подсказки также используют кавычки для строк, совпадающих с ключевыми словами: например, направление "in".
| Известные значения | Примеры полей | Варианты |
|---|---|---|
| Логические признаки | can.fd, uds.positiveResponse, modbus.exception | true, false |
| Строковые варианты | can.frameType, isotp.frameType, canopen.type | Типы кадров и сообщений из каталога поля |
| Коды сервисов и ошибок | uds.service, kwp.service, modbus.function, modbus.exceptionCode | Известные шестнадцатеричные коды |
| Сессии и команды | uds.session, canopen.nmtCommand | Известные коды сессий и команд |
Для адресов, меток и других полей со свободными значениями используется ручной ввод. Числовые подсказки не запрещают другие коды: значение, отсутствующее в списке, можно ввести вручную.
Подсказки типа протокола
Поле protocol.type обозначает протокол сообщения выбранного уровня, а не физический адаптер. Допустимые значения приведены в справочниках VAG и CANopen.
Список значений определяется текущей трассой и выбранным уровнем: если на уровне Transport есть только ISO-TP, подсказка protocol.type предлагает isotp, без tp20. При переходе на уровень Protocol предлагаются прикладные протоколы. Новые типы появляются по мере поступления сообщений; после Clear очищенный участок не учитывается. Применённый фильтр и скрытие TesterPresent не сужают этот список. В пустой трассе поле доступно, но подсказок его значений нет.
Подсказки типов не запрещают ручной ввод: protocol.type == kwp2000 допустим и до появления сообщений KWP2000. Остальные списки значений, например для isotp.frameType, берутся из каталога поля и не ограничиваются текущими сообщениями трассы.
Если выражение не применяется
При ошибке выводится диагностика. Ранее применённый корректный фильтр остаётся действовать: проверяйте состояние Previous filter active. В VAG отдельный переключатель скрытия TesterPresent продолжает работать и при пустой строке.
Типы и литералы
| Тип | Запись | Пример |
|---|---|---|
| Целое число | Десятичное или шестнадцатеричное с 0x | 7, 0x7E0, 0xF190 |
| Логическое значение | true или false | modbus.exception == true |
| Строка | В двойных кавычках | can.frameType == "std" |
| Простое строковое значение | После сравнения или внутри множества допускается без кавычек | canopen.type == pdo |
| Байты | Список чисел от 0 до 255 | [0x62, 0xF1, 0x90] |
Число 10 — десятичное; шестнадцатеричное десять записывается 0x0A. Используйте точный регистр имён полей и значений из справочника. Ключевые слова пишутся строчными буквами. Сравнение строк и поиск подстроки учитывают регистр. Не заменяйте canopen.nodeId на canopen.node_id или NodeId.
Операции
Приоритет: сравнения и операции in / contains, затем not, затем and, затем or. Скобки делают смешанные условия понятнее.
Пример: адрес устройства и набор функций Modbus RTU.
modbus.unitId == 7 and modbus.function in (0x03, 0x04)Пример: формат идентификатора и набор CAN ID на уровне Physical.
can.frameType == std and can.id in (0x181, 0x185)Пример: последовательность байтов в сообщении UDS на уровне Protocol VAG.
uds.data contains [0x62, 0xF1, 0x90]Совместимые формы записи: in {1, 2}, hex"62 F1 90" для байтов и поле exists для проверки наличия. В примерах справки используются круглые скобки, список байтов и exists(поле).
Поле может отсутствовать
Отсутствие поля отличается от нуля, пустой строки и false. Примеры: у положительного ответа UDS нет кода отрицательного ответа; у ответа чтения Modbus нет начального адреса; у сегмента SDO может не быть индекса объекта.
Сравнение с отсутствующим значением даёт неопределённый результат. В таблицу попадают только строки, для которых всё выражение истинно. Поэтому условие uds.negativeResponseCode != 0x78 не означает «все сообщения, кроме ожидания»: оно также отсеет сообщения без этого поля. Отрицание сравнения эту проблему не решает.
Чтобы оставить сообщения без кода отрицательного ответа и ответы с другим кодом, явно проверьте отсутствие:
not exists(uds.negativeResponseCode) or uds.negativeResponseCode != 0x78В смешанном VAG-потоке этот пример оставит и строки KWP2000: у них нет поля uds.negativeResponseCode. Чтобы ограничить результат типом UDS, используйте protocol.type:
protocol.type == uds and (not exists(uds.negativeResponseCode) or uds.negativeResponseCode != 0x78)Если нужны только распознанные UDS-сервисы, используйте exists(uds.service):
exists(uds.service) and (not exists(uds.negativeResponseCode) or uds.negativeResponseCode != 0x78)Выход за границы данных, например обращение к can.data[7] у двухбайтного кадра, тоже даёт отсутствующее значение. Неизвестное имя поля — другая ситуация: это ошибка выражения, которую программа показывает до фильтрации.
Границы языка
Фильтр проверяет каждый кадр или сообщение выбранного уровня отдельно. Он не присоединяет автоматически соответствующий ответ к найденному запросу, не вычисляет среднее время и не ищет отсутствующий ответ как отдельное событие. Между разными сообщениями нет арифметики или условий вида «после предыдущего сообщения».
Регулярные выражения, арифметические и побитовые операции не поддерживаются. Числовые поля целочисленные; сравнений с дробными литералами нет. Синтаксис не заявлен как полностью совместимый с Wireshark.
Описание работы с обменом: Modbus RTU, CANopen, VAG.