Quantex GmbH
Ihre Region: Europa

PassThruStartMsgFilter v4.04 v5.0

Nachrichtenfilter einrichten

Letzte Änderung:

Beschreibung

Bevor mit dem Empfang oder dem Senden von Nachrichten begonnen wird, müssen Nachrichtenfilter eingerichtet werden. Ist kein Filter eingerichtet, werden alle Nachrichten blockiert. Für das Protokoll ISO 15765 steht nur ein Filtertyp zur Verfügung: FLOW_CONTROL_FILTER. Er darf nicht für andere Protokolle eingerichtet werden. Für jede ChannelID können bis zu 16 Filter FLOW_CONTROL_FILTER sowie bis zu 10 PASS_FILTER oder BLOCK_FILTER angelegt werden. Für jeden gewählten Filtertyp müssen die Filterparameter angegeben werden. Für FLOW_CONTROL_FILTER werden drei Parameter angegeben: pMaskMsg, pPatternMsg, pFlowControlMsg. Für PASS_FILTER oder BLOCK_FILTER werden zwei Parameter angegeben: pMaskMsg und pPatternMsg. Die Länge der Parameter kann zwischen 1 und 12 Byte betragen.

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

Parameter

Im Protokoll ISO 15765 gibt es eine Standard- und eine erweiterte Nachricht. Bei der Standardnachricht werden für den Header 4 Byte verwendet, bei der erweiterten 5 Byte. Der erweiterte Header wird beispielsweise im BCM von Toyota oder in Steuergeräten von BMW verwendet.

Rückgabe-Fehlercodes

Code Beschreibung Mögliche Ursachen und Lösungen
STATUS_NOERROR Funktion erfolgreich ausgeführt
ERR_DEVICE_NOT_CONNECTED Keine Verbindung zum Adapter
  • Adapter ausgeschaltet oder außerhalb der Reichweite
  • Lösung: Prüfen Sie die Stromversorgung des Adapters und die Netzwerkverbindung
ERR_INVALID_DEVICE_ID Ungültige Gerätekennung
  • Die DeviceID wurde nicht über PassThruOpen bezogen oder das Gerät ist bereits geschlossen
  • Lösung: Stellen Sie sicher, dass PassThruOpen erfolgreich ausgeführt wurde
ERR_INVALID_CHANNEL_ID Ungültige Kanalkennung
  • Die ChannelID wurde nicht über PassThruConnect bezogen oder der Kanal ist bereits geschlossen
  • Lösung: Stellen Sie sicher, dass PassThruConnect erfolgreich ausgeführt wurde
ERR_INVALID_MSG Fehlerhafte Nachrichtenstruktur
  • Ungültige Struktur in pMaskMsg, pPatternMsg oder pFlowControlMsg
  • Die Nachrichten haben unterschiedliche TxFlags oder DataSize
  • Lösung: Prüfen Sie die Korrektheit der Felder ProtocolID, DataSize und TxFlags in allen Nachrichten
ERR_NULL_PARAMETER NULL anstelle eines erforderlichen Zeigers übergeben
  • pMaskMsg, pPatternMsg oder FilterID ist NULL
  • Lösung: Übergeben Sie gültige Zeiger auf die Strukturen
ERR_NOT_UNIQUE Die CAN ID wird bereits in einem anderen FLOW_CONTROL_FILTER verwendet
  • Die CAN ID in pPatternMsg oder pFlowControlMsg stimmt mit der ID eines bestehenden Filters überein
  • Lösung: Entfernen Sie den bestehenden Filter oder verwenden Sie eine andere CAN ID
ERR_EXCEEDED_LIMIT Filterlimit überschritten
  • Maximum erreicht: 16 FLOW_CONTROL_FILTER oder 10 PASS/BLOCK_FILTER pro Kanal
  • Lösung: Entfernen Sie nicht verwendete Filter über PassThruStopMsgFilter
ERR_MSG_PROTOCOL_ID Protokoll-Diskrepanz
  • Die ProtocolID in den Filternachrichten entspricht nicht dem Protokoll des Kanals
  • Lösung: Verwenden Sie dieselbe ProtocolID, die in PassThruConnect angegeben wurde
ERR_FAILED Nicht näher bestimmter Fehler
  • Interner Fehler der Bibliothek oder des Adapters
  • Lösung: Rufen Sie PassThruGetLastError() auf, um eine Beschreibung zu erhalten

Beispiele

Protokoll ISO15765 (CAN)

Beispiel in C/C++

#include "j2534_lib.hpp"

// ... ChannelID von PassThruConnect erhalten ...

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

// Maske: Wir vergleichen die ersten 4 Byte (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);

// Muster: Wir nehmen Nachrichten mit CAN ID 0x7E8 an
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;

// FlowControl-Antwort: Wir senden an 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)
{
    // Fehlerbehandlung
}

Beispiel in Kotlin (Android)

// channelID zuvor von ptConnect erhalten
val mask = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Maske für CAN ID (wir vergleichen alle 4 Byte)
    data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Wir nehmen Antworten vom Steuergerät mit CAN ID 0x7E8 an
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Wir senden FlowControl an 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
    // Filter erfolgreich eingerichtet
    Log.i("J2534", "Filter FLOW_CONTROL_FILTER eingerichtet, ID: $filterID")
} else {
    // Fehlerbehandlung
    Log.e("J2534", "Fehler beim Einrichten des Filters: ${resFilter.status}")
}

Beispiel in Python

from ctypes import *

# channelID zuvor von PassThruConnect erhalten

# Wir erstellen die Nachrichtenstrukturen
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"Filter eingerichtet, ID: {filter_id.value}")
else:
    print(f"Fehler: {ret}")

Beispiel in C#

// channelID zuvor von PassThruConnect erhalten

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($"Filter eingerichtet, ID: {filterId}");
}

Protokoll ISO14230 (K-Line)

Beispiel in C/C++

#include "j2534_lib.hpp"

// ... ChannelID von PassThruConnect erhalten ...

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

// Maske: Wir vergleichen das erste Byte (Format)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;

// Muster: Wir lassen alle Nachrichten mit gesetztem Format-Bit = 1 durch
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;

Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Fehlerbehandlung
}