Quantex GmbH
Twój region: Europa

PassThruStartMsgFilter v4.04 v5.0

Ustawienie filtra wiadomości

Ostatnia modyfikacja:

Opis

Przed rozpoczęciem odbioru lub wysyłania wiadomości należy ustawić filtry wiadomości. Jeśli nie ustawiono żadnego filtra, wszystkie wiadomości są blokowane. Dla protokołu ISO 15765 dostępny jest tylko jeden typ filtra FLOW_CONTROL_FILTER. Nie można go ustawiać dla innych protokołów. Dla każdego ChannelID można utworzyć do 16 filtrów FLOW_CONTROL_FILTER oraz do 10 filtrów PASS_FILTER lub BLOCK_FILTER. Dla każdego wybranego typu filtra należy podać parametry filtra. Dla FLOW_CONTROL_FILTER podaje się trzy parametry pMaskMsg, pPatternMsg, pFlowControlMsg. Dla PASS_FILTER lub BLOCK_FILTER podaje się dwa parametry pMaskMsg i pPatternMsg. Długość parametrów może wynosić od 1 do 12 bajtów.

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

Parametry

W protokole ISO 15765 istnieje wiadomość standardowa i rozszerzona. W wiadomości standardowej nagłówek wykorzystuje 4 bajty, w rozszerzonej 5 bajtów. Rozszerzony nagłówek używany jest na przykład w BCM Toyota lub w ECU BMW.

Zwracane kody błędów

Kod Opis Możliwe przyczyny i rozwiązania
STATUS_NOERROR Funkcja wykonana pomyślnie
ERR_DEVICE_NOT_CONNECTED Brak połączenia z adapterem
  • Adapter wyłączony lub poza zasięgiem
  • Rozwiązanie: sprawdź zasilanie adaptera i połączenie sieciowe
ERR_INVALID_DEVICE_ID Nieprawidłowy identyfikator urządzenia
  • DeviceID nie został uzyskany przez PassThruOpen lub urządzenie jest już zamknięte
  • Rozwiązanie: upewnij się, że PassThruOpen został wykonany pomyślnie
ERR_INVALID_CHANNEL_ID Nieprawidłowy identyfikator kanału
  • ChannelID nie został uzyskany przez PassThruConnect lub kanał jest już zamknięty
  • Rozwiązanie: upewnij się, że PassThruConnect został wykonany pomyślnie
ERR_INVALID_MSG Nieprawidłowa struktura wiadomości
  • Nieprawidłowa struktura w pMaskMsg, pPatternMsg lub pFlowControlMsg
  • Wiadomości mają różne TxFlags lub DataSize
  • Rozwiązanie: sprawdź poprawność pól ProtocolID, DataSize i TxFlags we wszystkich wiadomościach
ERR_NULL_PARAMETER Przekazano NULL zamiast wymaganego wskaźnika
  • pMaskMsg, pPatternMsg lub FilterID jest równy NULL
  • Rozwiązanie: przekaż poprawne wskaźniki na struktury
ERR_NOT_UNIQUE CAN ID jest już używany w innym FLOW_CONTROL_FILTER
  • CAN ID w pPatternMsg lub pFlowControlMsg pokrywa się z ID w istniejącym filtrze
  • Rozwiązanie: usuń istniejący filtr lub użyj innego CAN ID
ERR_EXCEEDED_LIMIT Przekroczono limit filtrów
  • Osiągnięto maksimum: 16 FLOW_CONTROL_FILTER lub 10 PASS/BLOCK_FILTER na kanał
  • Rozwiązanie: usuń nieużywane filtry przez PassThruStopMsgFilter
ERR_MSG_PROTOCOL_ID Niezgodność protokołu
  • ProtocolID w wiadomościach filtra nie odpowiada protokołowi kanału
  • Rozwiązanie: użyj tego samego ProtocolID, który został podany w PassThruConnect
ERR_FAILED Nieokreślony błąd
  • Wewnętrzny błąd biblioteki lub adaptera
  • Rozwiązanie: wywołaj PassThruGetLastError(), aby uzyskać opis

Przykłady

Protokół ISO15765 (CAN)

Przykład w C/C++

#include "j2534_lib.hpp"

// ... ChannelID uzyskany z PassThruConnect ...

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

// Maska: porównujemy pierwsze 4 bajty (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);

// Wzorzec: odbieramy wiadomości z 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;

// Odpowiedź FlowControl: wysyłamy na 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)
{
    // Obsługa błędu
}

Przykład w Kotlin (Android)

// channelID uzyskany wcześniej z ptConnect
val mask = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Maska dla CAN ID (porównujemy wszystkie 4 bajty)
    data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Odbieramy odpowiedzi od ECU z CAN ID 0x7E8
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Wysyłamy FlowControl na 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
    // Filtr ustawiony pomyślnie
    Log.i("J2534", "Filtr FLOW_CONTROL_FILTER ustawiony, ID: $filterID")
} else {
    // Obsługa błędu
    Log.e("J2534", "Błąd ustawiania filtra: ${resFilter.status}")
}

Przykład w Python

from ctypes import *

# channelID uzyskany wcześniej z PassThruConnect

# Tworzymy struktury wiadomości
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"Filtr ustawiony, ID: {filter_id.value}")
else:
    print(f"Błąd: {ret}")

Przykład w C#

// channelID uzyskany wcześniej z 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($"Filtr ustawiony, ID: {filterId}");
}

Protokół ISO14230 (K-Line)

Przykład w C/C++

#include "j2534_lib.hpp"

// ... ChannelID uzyskany z PassThruConnect ...

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

// Maska: porównujemy pierwszy bajt (format)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;

// Wzorzec: przepuszczamy wszystkie wiadomości z bitem formatu = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;

Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Obsługa błędu
}