Quantex GmbH
Twój region: Europa

PassThruConnect v4.04 v5.0

Nawiązanie połączenia według protokołu

Ostatnia zmiana:

Opis

Funkcja nawiązuje połączenie według zadanego protokołu. Adapter obsługuje dwie niezależne linie diagnostyczne. Każdy protokół jest powiązany z własną linią. Linia 1 jest podłączona do wyprowadzeń 6 i 14 złącza OBD i mogą się do niej podłączać wyłącznie protokoły ISO15765 i CAN. Linia 2 jest przełączana i mogą się do niej podłączać pozostałe protokoły. Ponieważ linie są niezależne, dopuszczalna jest jednoczesna praca dwóch protokołów. Na przykład ISO15765 i ISO14230 lub ISO15765 i ISO15765_PS. Przyrostek PS oznacza, że protokół może być przełączony na wyprowadzenia złącza OBD.
Protokoły ISO15765 i CAN, a także ISO15765_PS i CAN_PS mogą pracować na jednej linii fizycznej jednocześnie. Oznacza to, że w jednym adapterze można zainicjalizować jednocześnie do 4 protokołów. Należy przy tym uwzględnić, że ustawiane prędkości dla każdej pary protokołów muszą być takie same. Na przykład ISO15765 i CAN z prędkością 500 Kbit na wyprowadzeniach 6 i 14 złącza OBD oraz ISO15765_PS i CAN_PS z prędkością 125 Kbit na wyprowadzeniach 3 i 11.

long PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID)

Parametry


Zwracane kody błędów

Kod Opis Możliwe przyczyny i rozwiązania
STATUS_NOERROR Funkcja wykonana pomyślnie
ERR_DEVICE_NOT_CONNECTED Brak połączenia z adapterem
  • Adapter jest wyłączony lub nie ma zasilania
  • Rozwiązanie: Sprawdź zasilanie adaptera i wskaźniki
  • Brak połączenia sieciowego
  • Rozwiązanie: Sprawdź kabel sieciowy lub połączenie WLAN
  • Nieprawidłowy adres IP
  • Rozwiązanie: Upewnij się, że adres IP w łańcuchu połączenia jest podany prawidłowo
ERR_INVALID_DEVICE_ID Podano nieistniejący identyfikator adaptera DeviceID
  • DeviceID nie został uzyskany z PassThruOpen
  • Rozwiązanie: Najpierw wywołaj PassThruOpen, aby uzyskać prawidłowy DeviceID
  • Urządzenie zostało wcześniej zamknięte
  • Rozwiązanie: Sprawdź, czy PassThruClose nie został wywołany dla tego urządzenia
ERR_NOT_SUPPORTED Protokół nie jest obsługiwany przez adapter
  • Protokoły SCI nie są obsługiwane
  • Rozwiązanie: Użyj obsługiwanych protokołów: CAN, ISO15765, ISO9141, ISO14230 itp.
  • Niezgodne protokoły (na przykład VPW i PWM jednocześnie)
  • Rozwiązanie: Używaj zgodnych kombinacji protokołów
ERR_INVALID_PROTOCOL_ID v4.04
ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0
Podano nieistniejący ProtocolID
  • Przekazano nieprawidłową wartość ProtocolID
  • Rozwiązanie: Użyj stałych z j2534.h (ISO15765, CAN, ISO14230 itp.)
ERR_NULL_PARAMETER Nie podano wskaźnika pChannelID
  • Przekazano NULL zamiast wskaźnika na pChannelID
  • Rozwiązanie: Przekaż prawidłowy wskaźnik na zmienną unsigned long
ERR_INVALID_FLAGS v4.04
ERR_FLAG_NOT_SUPPORTED v5.0
Podano nieobsługiwaną flagę
  • Przekazano nieprawidłową lub niezgodną flagę dla danego protokołu
  • Rozwiązanie: Sprawdź kombinację flag. Dla ISO15765 użyj CAN_29BIT_ID lub CAN_ID_BOTH
ERR_BAUDRATE_NOT_SUPPORTED Podano nieobsługiwaną prędkość transmisji
  • Prędkość nie jest obsługiwana dla danego protokołu
  • Rozwiązanie: Dla CAN używaj standardowych prędkości: 125000, 250000, 500000, 1000000
  • Rozwiązanie: Dla K-Line używaj prędkości od 5 do 115200 bit/s
ERR_CHANNEL_IN_USE Kanał jest już używany
  • Zdefiniowany normą J2534
Ważne: W rzeczywistości ten kod błędu nigdy się nie pojawi, ponieważ przy ponownym wywołaniu PassThruConnect nastąpi automatyczne wywołanie PassThruDisconnect i kanał zostanie ponownie otwarty.
ERR_FAILED Błąd wewnętrzny
  • Błąd w bibliotece DLL lub w oprogramowaniu układowym adaptera
  • Rozwiązanie: Wywołaj PassThruGetLastError(), aby uzyskać szczegółowy opis
  • Rozwiązanie: Zrestartuj adapter i ponów próbę

Przykłady

Przykład w C/C++

#include "j2534_dll.hpp"

// DeviceID uzyskany wcześniej z PassThruOpen
unsigned long DeviceID;
unsigned long ChannelID;
unsigned long Flags = 0; // Zależy od protokołu

// Połączenie po magistrali CAN ISO 15765 z prędkością 500 Kbit/s
long ret = PassThruConnect(DeviceID, ISO15765, Flags, 500000, &ChannelID);
if (ret != STATUS_NOERROR)
{
    char error[256];
    PassThruGetLastError(error);
    // Obsługa błędu
}

Przykład w Kotlin (Android)

// deviceID uzyskany wcześniej z ptOpen
val protocolID = ISO15765
val flags = 0
val baudRate = 500000

val resConnect = j2534.ptConnect(deviceID, protocolID, flags, baudRate)
if (resConnect.status == STATUS_NOERROR) {
    val channelID = resConnect.chnlId
    // Kanał komunikacji z pojazdem został otwarty
    Log.i("J2534", "Kanał otwarty, ChannelID: $channelID")
} else {
    // Obsługa błędu
    Log.e("J2534", "Błąd otwarcia kanału: ${resConnect.status}")
}

Przykład w Python

import ctypes

# Załadowanie biblioteki
# Windows: j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")
# macOS: j2534 = ctypes.CDLL("libj2534_v04_04.dylib")
# Linux: j2534 = ctypes.CDLL("libj2534_v04_04.so")

ISO15765 = 6
STATUS_NOERROR = 0

# device_id uzyskany wcześniej z PassThruOpen
device_id = ctypes.c_ulong(0)
channel_id = ctypes.c_ulong()
protocol_id = ISO15765
flags = 0
baud_rate = 500000

ret = j2534.PassThruConnect(device_id, protocol_id, flags, baud_rate, ctypes.byref(channel_id))
if ret == STATUS_NOERROR:
    print(f"Kanał otwarty, ChannelID: {channel_id.value}")
else:
    error_msg = ctypes.create_string_buffer(256)
    j2534.PassThruGetLastError(error_msg)
    print(f"Błąd: {error_msg.value.decode()}")

Przykład w C#

using System;
using System.Runtime.InteropServices;

public class J2534Example
{
    // Windows: j2534sd_v04_04_x64.dll
    [DllImport("j2534sd_v04_04_x64.dll")]
    public static extern int PassThruConnect(uint deviceId, uint protocolId,
        uint flags, uint baudRate, out uint channelId);

    [DllImport("j2534sd_v04_04_x64.dll")]
    public static extern int PassThruGetLastError(byte[] errorMsg);

    const uint ISO15765 = 6;
    const int STATUS_NOERROR = 0;

    public void ConnectExample(uint deviceId)
    {
        uint channelId;
        uint flags = 0;
        uint baudRate = 500000;

        int ret = PassThruConnect(deviceId, ISO15765, flags, baudRate, out channelId);
        if (ret == STATUS_NOERROR)
        {
            Console.WriteLine($"Kanał otwarty, ChannelID: {channelId}");
        }
        else
        {
            byte[] errorMsg = new byte[256];
            PassThruGetLastError(errorMsg);
            Console.WriteLine($"Błąd: {System.Text.Encoding.ASCII.GetString(errorMsg)}");
        }
    }
}