Quantex GmbH
DE RU EN EL
Ваш регион: Европа

PassThruStartMsgFilter v4.04 v5.0

Установка фильтра сообщений

Последнее изменение:

Описание

Перед началом приёма или передачи сообщений, необходимо установить фильтры сообщений. Если ни один фильтр не установлен, то все сообщения блокируются. Для протокола ISO 15765 доступен только один тип фильтра FLOW_CONTROL_FILTER. Его нельзя устанавливать для других протоколов. Для каждого СhannelID можно создать до 64 фильтров FLOW_CONTROL_FILTER и до 10 PASS_FILTER или BLOCK_FILTER. Для каждого выбранного типа фильтра необходимо указать параметры фильтра. Для FLOW_CONTROL_FILTER указывается три параметра pMaskMsg, pPatternMsg, pFlowControlMsg. Для PASS_FILTER или BLOCK_FILTER указывается два параметра pMaskMsg и pPatternMsg. Длина параметров может быть от 1 до 12 байт.

long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)

Параметры

В протоколе ISO 15765 существует стандартное и расширенное сообщение. В стандартном сообщении для заголовка используется 4 байта для расширенного 5 байт. Расширенный заголовок используется например в BCM Toyota или в ЭБУ BMW.

Возвращаемые коды ошибок

Код Описание Возможные причины и решения
STATUS_NOERROR Функция выполнена успешно
ERR_DEVICE_NOT_CONNECTED Нет соединения с адаптером
  • Адаптер выключен или вне зоны доступа
  • Решение: проверьте питание адаптера и сетевое подключение
ERR_INVALID_DEVICE_ID Недействительный идентификатор устройства
  • DeviceID не был получен через PassThruOpen или устройство уже закрыто
  • Решение: убедитесь, что PassThruOpen выполнен успешно
ERR_INVALID_CHANNEL_ID Недействительный идентификатор канала
  • ChannelID не был получен через PassThruConnect или канал уже закрыт
  • Решение: убедитесь, что PassThruConnect выполнен успешно
ERR_INVALID_MSG Неправильная структура сообщения
  • Неверная структура в pMaskMsg, pPatternMsg или pFlowControlMsg
  • Сообщения имеют разные TxFlags или DataSize
  • Решение: проверьте корректность полей ProtocolID, DataSize и TxFlags во всех сообщениях
ERR_NULL_PARAMETER Передан NULL вместо обязательного указателя
  • pMaskMsg, pPatternMsg или FilterID равен NULL
  • Решение: передайте корректные указатели на структуры
ERR_NOT_UNIQUE CAN ID уже используется в другом FLOW_CONTROL_FILTER
  • CAN ID в pPatternMsg или pFlowControlMsg совпадает с ID в существующем фильтре
  • Решение: удалите существующий фильтр или используйте другой CAN ID
ERR_EXCEEDED_LIMIT Превышен лимит фильтров
  • Достигнут максимум: 64 FLOW_CONTROL_FILTER или 10 PASS/BLOCK_FILTER на канал
  • Решение: удалите неиспользуемые фильтры через PassThruStopMsgFilter
ERR_MSG_PROTOCOL_ID Несоответствие протокола
  • ProtocolID в сообщениях фильтра не соответствует протоколу канала
  • Решение: используйте тот же ProtocolID, что был указан в PassThruConnect
ERR_FAILED Неопределённая ошибка
  • Внутренняя ошибка библиотеки или адаптера
  • Решение: вызовите PassThruGetLastError() для получения описания

Примеры

Протокол ISO15765 (CAN)

Пример на C/C++

#include "j2534_lib.hpp"

// ... ChannelID получен от PassThruConnect ...

PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;

// Маска: сравниваем первые 4 байта (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);

// Шаблон: принимаем сообщения с CAN ID 0x7E8
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;

// Ответ FlowControl: отправляем на CAN ID 0x7E0
FlowControlMsg.ProtocolID = ISO15765;
FlowControlMsg.DataSize = 4;
FlowControlMsg.Data[0] = 0x00;
FlowControlMsg.Data[1] = 0x00;
FlowControlMsg.Data[2] = 0x07;
FlowControlMsg.Data[3] = 0xE0;

Ret = PassThruStartMsgFilter(ChannelID, FLOW_CONTROL_FILTER, 
                             &MaskMsg, &PatternMsg, &FlowControlMsg, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Обработка ошибки
}

Пример на Kotlin (Android)

// channelID получен ранее от ptConnect
val mask = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Маска для CAN ID (сравниваем все 4 байта)
    data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Принимаем ответы от ЭБУ с CAN ID 0x7E8
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Отправляем FlowControl на CAN ID 0x7E0
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE0.toByte())
)

val resFilter = j2534.ptStartMsgFilter(channelID, FLOW_CONTROL_FILTER, mask, pattern, flowControl)
if (resFilter.status == STATUS_NOERROR) {
    val filterID = resFilter.filterId
    // Фильтр успешно установлен
    Log.i("J2534", "Фильтр FLOW_CONTROL_FILTER установлен, ID: $filterID")
} else {
    // Обработка ошибки
    Log.e("J2534", "Ошибка установки фильтра: ${resFilter.status}")
}

Пример на Python

from ctypes import *

# channelID получен ранее от PassThruConnect

# Создаём структуры сообщений
mask = PASSTHRU_MSG()
mask.ProtocolID = ISO15765
mask.DataSize = 4
mask.Data[0:4] = [0xFF, 0xFF, 0xFF, 0xFF]

pattern = PASSTHRU_MSG()
pattern.ProtocolID = ISO15765
pattern.DataSize = 4
pattern.Data[0:4] = [0x00, 0x00, 0x07, 0xE8]

flow_control = PASSTHRU_MSG()
flow_control.ProtocolID = ISO15765
flow_control.DataSize = 4
flow_control.Data[0:4] = [0x00, 0x00, 0x07, 0xE0]

filter_id = c_ulong()
ret = j2534.PassThruStartMsgFilter(
    channel_id, FLOW_CONTROL_FILTER,
    byref(mask), byref(pattern), byref(flow_control), byref(filter_id)
)
if ret == 0:  # STATUS_NOERROR
    print(f"Фильтр установлен, ID: {filter_id.value}")
else:
    print(f"Ошибка: {ret}")

Пример на C#

// channelID получен ранее от PassThruConnect

var mask = new PASSTHRU_MSG {
    ProtocolID = ISO15765,
    DataSize = 4,
    Data = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }
};

var pattern = new PASSTHRU_MSG {
    ProtocolID = ISO15765,
    DataSize = 4,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xE8 }
};

var flowControl = new PASSTHRU_MSG {
    ProtocolID = ISO15765,
    DataSize = 4,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xE0 }
};

uint filterId;
int ret = J2534.PassThruStartMsgFilter(
    channelId, FLOW_CONTROL_FILTER,
    ref mask, ref pattern, ref flowControl, out filterId
);
if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Фильтр установлен, ID: {filterId}");
}

Протокол ISO14230 (K-Line)

Пример на C/C++

#include "j2534_lib.hpp"

// ... ChannelID получен от PassThruConnect ...

PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;

// Маска: сравниваем первый байт (формат)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;

// Шаблон: пропускаем все сообщения с битом формата = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;

Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Обработка ошибки
}