Quantex GmbH
Ihre Region: Europa

PassThruLogicalConnect v5.0

Erstellung eines logischen Kommunikationskanals über einer physikalischen Verbindung

Letzte Änderung:

Beschreibung

Die Funktion erstellt einen logischen Kommunikationskanal zum Fahrzeug auf dem angegebenen Pass-Thru-Gerät. Der logische Kanal legt ein zusätzliches Protokollschema über einen bestehenden physikalischen Kommunikationskanal.

Bei erfolgreicher Ausführung gibt die Funktion STATUS_NOERROR zurück, und der Wert am Zeiger pChannelID wird als Handle für den erstellten Kanal verwendet. Der Kanal befindet sich im initialisierten Zustand.

Es sind bis zu 10 logische Kanäle pro physikalischem Kommunikationskanal zulässig. Die Erstellung eines logischen Kanals beeinträchtigt nicht den Betrieb des physikalischen Kanals und der anderen mit ihm verbundenen logischen Kanäle.

long PassThruLogicalConnect(
    unsigned long PhysicalChannelID,
    unsigned long ProtocolID,
    unsigned long Flags,
    void *pChannelDescriptor,
    unsigned long *pChannelID
)

Initialisierter Kanalzustand

Der erstellte logische Kanal hat den folgenden Anfangszustand:

Parameter

PhysicalChannelID

Eingabeparameter. Identifikator des physikalischen Kanals, der beim Aufruf von PassThruConnect() zurückgegeben wurde.

ProtocolID

Eingabeparameter. Protokoll-Identifikator für den logischen Kommunikationskanal. Legt fest, wie der logische Kanal mit dem Fahrzeug kommuniziert, sowie den Typ der Struktur pChannelDescriptor.

ProtocolID Beschreibung
ISO15765_LOGICAL ISO 15765-2 mit Flusssteuerung (flow control)

Flags

Eingabeparameter. Konfigurationsflags des logischen Kanals. Die Flags können per OR kombiniert werden.

Flag Beschreibung Werte
FULL_DUPLEX Duplex-Modus des Kanals. Nur für ISO 15765. 0 = Halbduplex
1 = Vollduplex
ISO15765_ON_J1939 Maskierung der Prioritätsbits (28-26) in der CAN ID für ISO 15765-Nachrichten mit 29-Bit-Identifikator (gemäß ISO 15765-2 Annex A und SAE J1939-21). Nur für ISO 15765. 0 = Maskierung deaktiviert (Standardverarbeitung nach ISO 15765)
1 = Maskierung aktiviert

pChannelDescriptor

Eingabeparameter. Zeiger auf eine Struktur, die die Endpunkte der logischen Verbindung beschreibt. Ist der Zeiger NULL, gibt die Funktion ERR_NULL_PARAMETER zurück.

pChannelID

Eingabeparameter. Zeiger auf eine von der Anwendung allozierte Variable vom Typ unsigned long. Bei erfolgreicher Ausführung enthält die Variable den Identifikator des logischen Kanals für nachfolgende Funktionsaufrufe.

Struktur ISO15765_CHANNEL_DESCRIPTOR

Für das Protokoll ISO15765_LOGICAL wird die Struktur ISO15765_CHANNEL_DESCRIPTOR verwendet, die die Endpunkte der logischen Verbindung definiert:

typedef struct {
    unsigned long LocalTxFlags;     // TxFlags für LocalAddress
    unsigned long RemoteTxFlags;    // TxFlags für RemoteAddress
    unsigned char LocalAddress[5];  // CAN ID + extended address (lokale Seite)
    unsigned char RemoteAddress[5]; // CAN ID + extended address (entfernte Seite)
} ISO15765_CHANNEL_DESCRIPTOR;

LocalTxFlags und RemoteTxFlags

Zulässige Flags für den Kanaldeskriptor ISO 15765:

Flag Anwendung Beschreibung
CAN_29BIT_ID LocalAddress, RemoteAddress 29-Bit-CAN ID verwenden (statt 11-Bit)
ISO15765_ADDR_TYPE LocalAddress, RemoteAddress Erweiterte Adressierung verwenden (extended address)
ISO15765_FRAME_PAD RemoteAddress Padding der Flow-Control-Frames bei der Übertragung aktivieren

Format von LocalAddress und RemoteAddress

Wichtig: Die Adressen LocalAddress und RemoteAddress müssen eindeutig sein. Keine der Adressen darf mit den Adressen anderer bestehender logischer Kanäle für diesen physikalischen Kanal übereinstimmen. Die CAN ID einer erweiterten Adresse darf nicht mit einer CAN ID ohne erweiterte Adresse übereinstimmen.

Zurückgegebene Fehlercodes

Code Beschreibung
STATUS_NOERROR Die Funktion wurde erfolgreich ausgeführt
ERR_CONCURRENT_API_CALL Eine J2534-API-Funktion wurde aufgerufen, bevor der vorherige Aufruf abgeschlossen war
ERR_DEVICE_NOT_OPEN PassThruOpen() wurde nicht erfolgreich aufgerufen
ERR_INVALID_CHANNEL_ID Unzulässiger Wert von PhysicalChannelID
ERR_DEVICE_NOT_CONNECTED Kommunikationsfehler mit dem Pass-Thru-Gerät. Das Gerät wurde getrennt.
ERR_NOT_SUPPORTED Die DLL unterstützt diese Funktion nicht
ERR_LOG_CHAN_NOT_ALLOWED Ein logischer Kanal ist für diese Kombination aus physikalischem Kanal und ProtocolID nicht zulässig
ERR_PROTOCOL_ID_NOT_SUPPORTED Der Wert von ProtocolID wird nicht unterstützt (unzulässig oder unbekannt)
ERR_FLAG_NOT_SUPPORTED Die Werte von Flags sind unzulässig, unbekannt oder für den aktuellen Kanal nicht anwendbar
ERR_INVALID_CHANNEL_DESCRIPTOR Ein oder mehrere Elemente der Struktur pChannelDescriptor sind unzulässig oder für den aktuellen Kanal nicht anwendbar
ERR_NULL_REQUIRED Ein Parameter, der NULL sein muss, ist nicht auf NULL gesetzt
ERR_NULL_PARAMETER Es wurde ein NULL-Zeiger anstelle eines erforderlichen Zeigers übergeben
ERR_NOT_UNIQUE Versuch, einen logischen Kanal mit Adressen anzulegen, die die Adressen eines bestehenden Kanals duplizieren
ERR_EXCEEDED_LIMIT Die maximale Anzahl logischer Kanäle für diesen physikalischen Kanal wurde überschritten
ERR_FAILED Unspezifizierter Fehler. Verwenden Sie PassThruGetLastError(), um eine Beschreibung zu erhalten.

Beispiele

Beispiel in C/C++

#include "j2534_dll.hpp"

unsigned long deviceID = 0;
unsigned long physicalChannelID = 0;
unsigned long logicalChannelID = 0;

// Gerät öffnen
long ret = PassThruOpen("ScanDoc", &deviceID);
if (ret != STATUS_NOERROR) return;

// Physikalische CAN-Verbindung erstellen
ret = PassThruConnect(deviceID, CAN, CAN_29BIT_ID, 500000, &physicalChannelID);
if (ret != STATUS_NOERROR) {
    PassThruClose(deviceID);
    return;
}

// Deskriptor des logischen ISO 15765-Kanals konfigurieren
ISO15765_CHANNEL_DESCRIPTOR channelDesc = {0};

// Lokale Adresse (Adapter) - 0x18DA00F1 (funktionale Anfrage)
channelDesc.LocalTxFlags = CAN_29BIT_ID;
channelDesc.LocalAddress[0] = 0x18;
channelDesc.LocalAddress[1] = 0xDA;
channelDesc.LocalAddress[2] = 0x00;
channelDesc.LocalAddress[3] = 0xF1;

// Entfernte Adresse (ECU) - 0x18DAF100 (Antwort vom ECU)
channelDesc.RemoteTxFlags = CAN_29BIT_ID | ISO15765_FRAME_PAD;
channelDesc.RemoteAddress[0] = 0x18;
channelDesc.RemoteAddress[1] = 0xDA;
channelDesc.RemoteAddress[2] = 0xF1;
channelDesc.RemoteAddress[3] = 0x00;

// Logischen Kanal erstellen
ret = PassThruLogicalConnect(
    physicalChannelID,
    ISO15765_LOGICAL,
    0,  // Flags: Halbduplex
    &channelDesc,
    &logicalChannelID
);

if (ret == STATUS_NOERROR) {
    printf("Logischer Kanal erstellt: %lu\n", logicalChannelID);

    // Jetzt kann logicalChannelID für PassThruReadMsgs/PassThruQueueMsgs verwendet werden

    // Logischen Kanal schließen
    PassThruLogicalDisconnect(logicalChannelID);
}

// Physikalischen Kanal und Gerät schließen
PassThruDisconnect(physicalChannelID);
PassThruClose(deviceID);

Beispiel in Python (ctypes)

from ctypes import *

# Bibliothek laden
j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")

# Struktur des Kanaldeskriptors
class ISO15765_CHANNEL_DESCRIPTOR(Structure):
    _fields_ = [
        ("LocalTxFlags", c_ulong),
        ("RemoteTxFlags", c_ulong),
        ("LocalAddress", c_ubyte * 5),
        ("RemoteAddress", c_ubyte * 5)
    ]

device_id = c_ulong()
physical_channel_id = c_ulong()
logical_channel_id = c_ulong()

# Gerät öffnen
ret = j2534.PassThruOpen(b"ScanDoc", byref(device_id))
if ret != 0:
    print(f"Fehler bei PassThruOpen: {ret}")
    exit()

# Physikalische CAN-Verbindung erstellen (500 kbit/s, 29-bit ID)
CAN = 0x05
CAN_29BIT_ID = 0x100
ret = j2534.PassThruConnect(device_id, CAN, CAN_29BIT_ID, 500000, byref(physical_channel_id))
if ret != 0:
    print(f"Fehler bei PassThruConnect: {ret}")
    j2534.PassThruClose(device_id)
    exit()

# Kanaldeskriptor konfigurieren
ISO15765_LOGICAL = 0x200
ISO15765_FRAME_PAD = 0x40

channel_desc = ISO15765_CHANNEL_DESCRIPTOR()
channel_desc.LocalTxFlags = CAN_29BIT_ID
channel_desc.LocalAddress[0] = 0x18
channel_desc.LocalAddress[1] = 0xDA
channel_desc.LocalAddress[2] = 0x00
channel_desc.LocalAddress[3] = 0xF1

channel_desc.RemoteTxFlags = CAN_29BIT_ID | ISO15765_FRAME_PAD
channel_desc.RemoteAddress[0] = 0x18
channel_desc.RemoteAddress[1] = 0xDA
channel_desc.RemoteAddress[2] = 0xF1
channel_desc.RemoteAddress[3] = 0x00

# Logischen Kanal erstellen
ret = j2534.PassThruLogicalConnect(
    physical_channel_id,
    ISO15765_LOGICAL,
    0,
    byref(channel_desc),
    byref(logical_channel_id)
)

if ret == 0:
    print(f"Logischer Kanal erstellt: {logical_channel_id.value}")
    # ...Arbeit mit dem Kanal...
    j2534.PassThruLogicalDisconnect(logical_channel_id)
else:
    print(f"Fehler: {ret}")

j2534.PassThruDisconnect(physical_channel_id)
j2534.PassThruClose(device_id)

Verwandte Funktionen