Quantex GmbH
Twój region: Europa

PassThruSelect v5.0

Wybór kanałów do monitorowania wiadomości

Ostatnia zmiana:

Opis

Funkcja umożliwia aplikacji wybór kanałów do monitorowania dostępnych wiadomości (w tym wskazań). Aplikacja może podać dowolną kombinację fizycznych i logicznych kanałów komunikacyjnych, minimalną liczbę kanałów z dostępnymi wiadomościami oraz limit czasu.

Funkcja nie zwraca sterowania, dopóki nie wystąpi jedno z poniższych:

long PassThruSelect(
    SCHANNELSET *ChannelSetPtr,
    unsigned long SelectType,
    unsigned long Timeout
)
Przeznaczenie: PassThruSelect umożliwia aplikacji sprawdzanie i oczekiwanie na dostępność wiadomości na wielu kanałach bez ciągłego wywoływania PassThruReadMsgs. Minimalizuje to wymianę danych między aplikacją a urządzeniem, zwiększając wydajność.
Ważne: PassThruSelect NIE zwraca samych wiadomości — jedynie informację o tym, które kanały mają dostępne wiadomości. Aby odebrać wiadomości, należy wywołać PassThruReadMsgs.

Parametry

ChannelSetPtr

Parametr wejściowy. Wskaźnik do struktury SCHANNELSET przydzielonej przez aplikację.

SelectType

Parametr wejściowy. Określa przeznaczenie wyboru kanałów. Jedyna dopuszczalna wartość:

Wartość Opis
READABLE_TYPE Monitorowanie kanałów pod kątem dostępnych wiadomości (wiadomości przychodzących lub wskazań)

Timeout

Parametr wejściowy. Minimalny czas oczekiwania (w milisekundach) na dostępność wymaganej liczby wiadomości.

Struktura SCHANNELSET

typedef struct {
    unsigned long ChannelCount;      // Liczba kanałów na liście
    unsigned long ChannelThreshold;  // Minimalna liczba kanałów z wiadomościami
    unsigned long *ChannelList;      // Wskaźnik do tablicy ID kanałów
} SCHANNELSET;

Pola struktury

Pole Wejście/Wyjście Opis
ChannelCount Wejście/Wyjście Przy wywołaniu: liczba kanałów w ChannelList.
Przy zwrocie: liczba kanałów pozostałych w ChannelList (z dostępnymi wiadomościami).
ChannelThreshold Wejście Minimalna liczba kanałów, które muszą mieć co najmniej jedną dostępną wiadomość. Wartość 0 — funkcja zwraca sterowanie natychmiast (równoważne Timeout = 0). Musi być ≤ ChannelCount.
ChannelList Wejście/Wyjście Przy wywołaniu: wskaźnik do tablicy ID kanałów (fizycznych i/lub logicznych) do monitorowania.
Przy zwrocie: podzbiór pierwotnej listy — tylko kanały z dostępnymi wiadomościami (kolejność nie jest gwarantowana).

Zwracane kody błędów

Kod Opis
STATUS_NOERROR Funkcja wykonana pomyślnie. ChannelList zawiera kanały z dostępnymi wiadomościami.
ERR_CONCURRENT_API_CALL Funkcja J2534 API została wywołana przed zakończeniem poprzedniego wywołania
ERR_DEVICE_NOT_OPEN PassThruOpen() nie został pomyślnie wywołany
ERR_NULL_PARAMETER ChannelSetPtr lub ChannelList ma wartość NULL
ERR_INVALID_CHANNEL_ID Jeden z ID kanałów w ChannelList jest nieprawidłowy. Struktura SCHANNELSET nie jest modyfikowana.
ERR_DEVICE_NOT_CONNECTED Błąd komunikacji z urządzeniem pass-thru. Urządzenie zostało odłączone.
ERR_NOT_SUPPORTED DLL nie obsługuje tej funkcji
ERR_SELECT_TYPE_NOT_SUPPORTED Wartość SelectType jest nieprawidłowa lub nieznana
ERR_EXCEEDED_LIMIT Wartość ChannelThreshold jest większa niż ChannelCount
ERR_BUFFER_EMPTY Brak dostępnych wiadomości na którymkolwiek ze wskazanych kanałów
ERR_TIMEOUT Limit czasu upłynął, a liczba kanałów z wiadomościami jest mniejsza niż ChannelThreshold. Dotyczy tylko niezerowego Timeout oraz obecności co najmniej jednej wiadomości.
ERR_FAILED Nieokreślony błąd. Użyj PassThruGetLastError(), aby uzyskać opis.

Przykłady

Przykład w C/C++

#include "j2534_dll.hpp"

// ID kanałów uzyskane z PassThruConnect/PassThruLogicalConnect
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;

// Tablica kanałów do monitorowania
unsigned long channels[2] = { canChannelID, isoChannelID };

// Struktura dla PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1;  // Czekamy na co najmniej 1 kanał z wiadomością
channelSet.ChannelList = channels;

// Czekamy na wiadomości do 1000 ms
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);

if (ret == STATUS_NOERROR) {
    printf("Kanałów z wiadomościami: %lu\n", channelSet.ChannelCount);

    // Odczytujemy wiadomości z kanałów, które mają dane
    for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
        unsigned long channelID = channelSet.ChannelList[i];
        printf("Kanał %lu ma wiadomości\n", channelID);

        // Odczytujemy wiadomości
        PASSTHRU_MSG msg[10];
        unsigned long numMsgs = 10;
        ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
        // ...obsługa wiadomości...
    }
} else if (ret == ERR_BUFFER_EMPTY) {
    printf("Brak dostępnych wiadomości\n");
} else if (ret == ERR_TIMEOUT) {
    printf("Limit czasu, ale jest %lu kanałów z wiadomościami\n", channelSet.ChannelCount);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Błąd: %s\n", error);
}

Przykład w Pythonie (ctypes)

from ctypes import *

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

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

# ID kanałów
can_channel_id = c_ulong(...)  # z PassThruConnect
iso_channel_id = c_ulong(...)  # z PassThruLogicalConnect

# Tablica kanałów
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)

# Struktura dla PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels

READABLE_TYPE = 0x01

# Czekamy na wiadomości do 1000 ms
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)

if ret == 0:  # STATUS_NOERROR
    print(f"Kanałów z wiadomościami: {channel_set.ChannelCount}")
    for i in range(channel_set.ChannelCount):
        print(f"Kanał {channel_set.ChannelList[i]} ma wiadomości")
elif ret == 0x10:  # ERR_BUFFER_EMPTY
    print("Brak dostępnych wiadomości")
elif ret == 0x09:  # ERR_TIMEOUT
    print(f"Limit czasu, kanałów z wiadomościami: {channel_set.ChannelCount}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Błąd: {error.value.decode()}")

Funkcje powiązane