Erstellung eines logischen Kommunikationskanals über einer physikalischen Verbindung
Letzte Änderung:
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
)
Der erstellte logische Kanal hat den folgenden Anfangszustand:
Eingabeparameter. Identifikator des physikalischen Kanals, der beim Aufruf von PassThruConnect() zurückgegeben wurde.
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) |
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 |
Eingabeparameter. Zeiger auf eine Struktur, die die Endpunkte der logischen Verbindung beschreibt. Ist der Zeiger NULL, gibt die Funktion ERR_NULL_PARAMETER zurück.
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.
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;
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 |
Address[0] — CAN ID Bits 28-24 (die drei höchstwertigen Bits müssen null sein)Address[1] — CAN ID Bits 23-16Address[2] — CAN ID Bits 15-8Address[3] — CAN ID Bits 7-0Address[4] — erweiterte Adresse (wenn das Flag ISO15765_ADDR_TYPE gesetzt ist)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.
| 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. |
#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);
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)
PassThruConnect() - Erstellung einer physikalischen VerbindungPassThruLogicalDisconnect() - Schließen eines logischen KanalsPassThruReadMsgs() - Lesen von Nachrichten aus dem Kanal