Nawiązanie połączenia według protokołu
Ostatnia zmiana:
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)
| Definicja | wyprowadzenia | Opis |
|---|---|---|
| J1850VPW | 2 VPW | Zdefiniowany normami SAE J1850 i SAE J2178. Może pracować jednocześnie z CAN i ISO15765. Niezgodny z protokołami przełączanymi. |
| J1850PWM | 2, 10 PWM | Zdefiniowany normą SAE J1850. Może pracować jednocześnie z CAN i ISO15765. Niezgodny z protokołami przełączanymi. |
| ISO9141 | 7K,15L Line | Zdefiniowany normami ISO 9141 i SAE J1979. Może pracować jednocześnie z CAN i ISO15765. Niezgodny z protokołami przełączanymi. |
| ISO14230 | 7K,15L Line | |
| CAN | 6H,14L CAN | Nieprzetworzony strumień CAN. Może pracować jednocześnie ze wszystkimi protokołami. |
| ISO15765 | 6H,14L CAN | Zdefiniowany normami ISO 15765-4 i ISO 14229-1 UDS Może pracować jednocześnie ze wszystkimi protokołami. |
| ISO15765_PS | Przełączany CAN | Przełączana wersja ISO 15765. Może pracować jednocześnie z CAN i ISO15765. |
| ISO13400_PS Quantex | Ethernet | DoIP (Diagnostics over IP) — diagnostyka przez Ethernet zgodnie z normą ISO 13400. Szczegóły zob. opis DoIP. |
| Pełną listę protokołów zob. w normie SAE J2534-1. | ||
| Nazwa stałej | bit | Opis |
|---|---|---|
| ISO9141_K_LINE | 12 | Użycie linii L do inicjalizacji protokołów. 0 = Do inicjalizacji używana jest linia L i linia K 1 = Do inicjalizacji używana jest tylko linia K |
| CAN_29BIT_ID | 8 | Typ identyfikatora CAN dla protokołów CAN i ISO 15765 0 = Odbierane są pakiety z 11-bitowym identyfikatorem. 1 = Odbierane są pakiety z 29-bitowym identyfikatorem. |
| Pełną listę flag zob. w normie SAE J2534-1. | ||
| Kod | Opis | Możliwe przyczyny i rozwiązania |
|---|---|---|
| STATUS_NOERROR | Funkcja wykonana pomyślnie | — |
| ERR_DEVICE_NOT_CONNECTED | Brak połączenia z adapterem |
|
| ERR_INVALID_DEVICE_ID | Podano nieistniejący identyfikator adaptera DeviceID |
|
| ERR_NOT_SUPPORTED | Protokół nie jest obsługiwany przez adapter |
|
| ERR_INVALID_PROTOCOL_ID v4.04 ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0 |
Podano nieistniejący ProtocolID |
|
| ERR_NULL_PARAMETER | Nie podano wskaźnika pChannelID |
|
| ERR_INVALID_FLAGS v4.04 ERR_FLAG_NOT_SUPPORTED v5.0 |
Podano nieobsługiwaną flagę |
|
| ERR_BAUDRATE_NOT_SUPPORTED | Podano nieobsługiwaną prędkość transmisji |
|
| ERR_CHANNEL_IN_USE | Kanał jest już używany |
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 |
|
#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
}
// 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}")
}
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()}")
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)}");
}
}
}