Quantex GmbH
DE RU EN EL
Ihre Region: Europa

PassThruSelect v5.0

Auswahl von Kanälen zur Nachrichtenüberwachung

Letzte Änderung:

Beschreibung

Die Funktion ermöglicht es der Anwendung, Kanäle zur Überwachung verfügbarer Nachrichten (einschließlich Indikationen) auszuwählen. Die Anwendung kann eine beliebige Kombination aus physischen und logischen Kommunikationskanälen, die minimale Anzahl von Kanälen mit verfügbaren Nachrichten sowie einen Timeout angeben.

Die Funktion kehrt erst zurück, wenn eine der folgenden Bedingungen eintritt:

long PassThruSelect(
    SCHANNELSET *ChannelSetPtr,
    unsigned long SelectType,
    unsigned long Timeout
)
Zweck: PassThruSelect ermöglicht es der Anwendung, die Verfügbarkeit von Nachrichten auf mehreren Kanälen zu prüfen und darauf zu warten, ohne ständig PassThruReadMsgs aufzurufen. Dies minimiert den Datenaustausch zwischen Anwendung und Gerät und erhöht die Leistung.
Wichtig: PassThruSelect gibt die Nachrichten NICHT selbst zurück — nur die Information darüber, welche Kanäle verfügbare Nachrichten haben. Um die Nachrichten abzurufen, muss PassThruReadMsgs aufgerufen werden.

Parameter

ChannelSetPtr

Eingabeparameter. Zeiger auf eine von der Anwendung zugewiesene SCHANNELSET-Struktur.

SelectType

Eingabeparameter. Gibt den Zweck der Kanalauswahl an. Einziger zulässiger Wert:

Wert Beschreibung
READABLE_TYPE Überwachung der Kanäle auf verfügbare Nachrichten (eingehende Nachrichten oder Indikationen)

Timeout

Eingabeparameter. Minimale Wartezeit (in Millisekunden) auf die Verfügbarkeit der erforderlichen Anzahl von Nachrichten.

SCHANNELSET-Struktur

typedef struct {
    unsigned long ChannelCount;      // Anzahl der Kanäle in der Liste
    unsigned long ChannelThreshold;  // Minimale Anzahl der Kanäle mit Nachrichten
    unsigned long *ChannelList;      // Zeiger auf das Array der Kanal-IDs
} SCHANNELSET;

Felder der Struktur

Feld Ein/Aus Beschreibung
ChannelCount Ein/Aus Beim Aufruf: Anzahl der Kanäle in ChannelList.
Bei der Rückkehr: Anzahl der in ChannelList verbleibenden Kanäle (mit verfügbaren Nachrichten).
ChannelThreshold Ein Minimale Anzahl von Kanälen, die mindestens eine verfügbare Nachricht haben müssen. Wert 0 — die Funktion kehrt sofort zurück (entspricht Timeout = 0). Muss ≤ ChannelCount sein.
ChannelList Ein/Aus Beim Aufruf: Zeiger auf ein Array von Kanal-IDs (physisch und/oder logisch) zur Überwachung.
Bei der Rückkehr: Teilmenge der ursprünglichen Liste — nur Kanäle mit verfügbaren Nachrichten (Reihenfolge nicht garantiert).

Rückgabe-Fehlercodes

Code Beschreibung
STATUS_NOERROR Funktion erfolgreich ausgeführt. ChannelList enthält die Kanäle mit verfügbaren Nachrichten.
ERR_CONCURRENT_API_CALL J2534 API-Funktion wurde vor Abschluss des vorherigen Aufrufs aufgerufen
ERR_DEVICE_NOT_OPEN PassThruOpen() wurde nicht erfolgreich aufgerufen
ERR_NULL_PARAMETER ChannelSetPtr oder ChannelList ist NULL
ERR_INVALID_CHANNEL_ID Eine der Kanal-IDs in ChannelList ist ungültig. Die SCHANNELSET-Struktur wird nicht verändert.
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_SELECT_TYPE_NOT_SUPPORTED Der Wert von SelectType ist unzulässig oder unbekannt
ERR_EXCEEDED_LIMIT Der Wert von ChannelThreshold ist größer als ChannelCount
ERR_BUFFER_EMPTY Auf keinem der angegebenen Kanäle sind Nachrichten verfügbar
ERR_TIMEOUT Der Timeout ist abgelaufen und die Anzahl der Kanäle mit Nachrichten ist kleiner als ChannelThreshold. Gilt nur bei einem Timeout ungleich null und wenn mindestens eine Nachricht vorliegt.
ERR_FAILED Unbestimmter Fehler. Verwenden Sie PassThruGetLastError(), um eine Beschreibung zu erhalten.

Beispiele

Beispiel in C/C++

#include "j2534_dll.hpp"

// Kanal-IDs von PassThruConnect/PassThruLogicalConnect erhalten
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;

// Array der zu überwachenden Kanäle
unsigned long channels[2] = { canChannelID, isoChannelID };

// Struktur für PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1;  // Auf mindestens 1 Kanal mit Nachricht warten
channelSet.ChannelList = channels;

// Bis zu 1000 ms auf Nachrichten warten
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);

if (ret == STATUS_NOERROR) {
    printf("Kanäle mit Nachrichten: %lu\n", channelSet.ChannelCount);

    // Nachrichten von Kanälen mit Daten lesen
    for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
        unsigned long channelID = channelSet.ChannelList[i];
        printf("Kanal %lu hat Nachrichten\n", channelID);

        // Nachrichten lesen
        PASSTHRU_MSG msg[10];
        unsigned long numMsgs = 10;
        ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
        // ...Nachrichtenverarbeitung...
    }
} else if (ret == ERR_BUFFER_EMPTY) {
    printf("Keine Nachrichten verfügbar\n");
} else if (ret == ERR_TIMEOUT) {
    printf("Timeout, aber %lu Kanäle mit Nachrichten vorhanden\n", channelSet.ChannelCount);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Fehler: %s\n", error);
}

Beispiel in Python (ctypes)

from ctypes import *

j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")

# SCHANNELSET-Struktur
class SCHANNELSET(Structure):
    _fields_ = [
        ("ChannelCount", c_ulong),
        ("ChannelThreshold", c_ulong),
        ("ChannelList", POINTER(c_ulong))
    ]

# Kanal-IDs
can_channel_id = c_ulong(...)  # von PassThruConnect
iso_channel_id = c_ulong(...)  # von PassThruLogicalConnect

# Kanal-Array
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)

# Struktur für PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels

READABLE_TYPE = 0x01

# Bis zu 1000 ms auf Nachrichten warten
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)

if ret == 0:  # STATUS_NOERROR
    print(f"Kanäle mit Nachrichten: {channel_set.ChannelCount}")
    for i in range(channel_set.ChannelCount):
        print(f"Kanal {channel_set.ChannelList[i]} hat Nachrichten")
elif ret == 0x10:  # ERR_BUFFER_EMPTY
    print("Keine Nachrichten verfügbar")
elif ret == 0x09:  # ERR_TIMEOUT
    print(f"Timeout, Kanäle mit Nachrichten: {channel_set.ChannelCount}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Fehler: {error.value.decode()}")

Verwandte Funktionen