Quantex GmbH
Ihre Region: Europa

PassThruStartPeriodicMsg v4.04 v5.0

Starten einer periodischen Nachricht

Letzte Änderung:

Beschreibung

Startet das automatische periodische Senden einer Nachricht auf den Bus in einem festgelegten Intervall. Wird zur Aufrechterhaltung der Diagnosesitzung (Tester Present) oder zum periodischen Abfragen von Sensoren verwendet.

long PassThruStartPeriodicMsg(unsigned long ChannelID, PASSTHRU_MSG* pMsg, unsigned long* pMsgID, unsigned long TimeInterval)

Parameter

Rückgabe-Fehlercodes

Code Beschreibung Mögliche Ursachen und Lösungen
STATUS_NOERROR Funktion erfolgreich ausgeführt
ERR_NULL_PARAMETER Zeiger pMsg nicht gesetzt
  • nullptr anstelle eines Zeigers auf die Nachricht übergeben
  • Lösung: übergeben Sie einen gültigen Zeiger auf die Struktur PASSTHRU_MSG
ERR_INVALID_MSG Ungültige Nachrichtenstruktur
  • Die Datengröße ist 0 oder überschreitet 12 Byte
  • Lösung: stellen Sie sicher, dass DataSize im Bereich 1–12 liegt
ERR_INVALID_CHANNEL_ID Ungültige Kanal-ID
  • Der Kanal wurde nicht geöffnet oder ist bereits geschlossen
  • Lösung: verwenden Sie die von PassThruConnect erhaltene ChannelID
ERR_DEVICE_NOT_CONNECTED Keine Verbindung zum Adapter
  • Adapter ausgeschaltet, Netzwerk verloren, falsche IP-Adresse
  • Lösung: prüfen Sie die Stromversorgung des Adapters und die Netzwerkverbindung
ERR_INVALID_DEVICE_ID Ungültige Geräte-ID
  • DeviceID wurde nicht über PassThruOpen erhalten oder das Gerät ist geschlossen
  • Lösung: verwenden Sie die von PassThruOpen erhaltene DeviceID
ERR_INVALID_TIME_INTERVAL Unzulässiges Zeitintervall
  • Der Wert von TimeInterval liegt außerhalb des Bereichs 5–65535 ms
  • Lösung: verwenden Sie ein Intervall im zulässigen Bereich
ERR_NOT_SUPPORTED Parameter werden vom Adapter nicht unterstützt
  • Ein Intervall unter 20 ms wird von der Firmware nicht unterstützt
  • Lösung: erhöhen Sie TimeInterval auf 20 ms oder mehr
ERR_MSG_PROTOCOL_ID Protokoll stimmt nicht überein
  • ProtocolID in der Nachricht stimmt nicht mit dem Protokoll des Kanals überein
  • Lösung: setzen Sie in pMsg->ProtocolID dasselbe Protokoll, das bei PassThruConnect angegeben wurde
ERR_EXCEEDED_LIMIT Limit für periodische Nachrichten überschritten
  • Der Adapter unterstützt eine begrenzte Anzahl periodischer Nachrichten (üblicherweise 10)
  • Lösung: stoppen Sie nicht genutzte periodische Nachrichten über PassThruStopPeriodicMsg
ERR_FAILED Interner Fehler
  • Fehler in der DLL oder in der Firmware des Adapters
  • Lösung: rufen Sie PassThruGetLastError() auf, um Details zu erhalten

Beispiele

Beispiel in C/C++

#include "j2534_lib.hpp"

unsigned long ChannelID; // Kanal-ID
unsigned long MsgID;     // ID für die neue periodische Nachricht
long Ret;
PASSTHRU_MSG Msg;

// Nachricht "Tester Present" für ISO15765
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.DataSize = 5;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF; // Adresse des Steuergeräts
Msg.Data[4] = 0x3E; // Befehl Tester Present

// Senden alle 2000 ms starten
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
    // Fehlerbehandlung
}

Beispiel in Kotlin (Android)

// channelID wurde zuvor erhalten
val timeInterval = 2000 // ms

// Nachricht "Tester Present" für ISO15765
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 5,
    txFlags = ISO15765_FRAME_PAD,
    data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x3E)
)

val result = j2534.ptStartPeriodicMsg(channelID, msg, timeInterval)
if (result.status == STATUS_NOERROR) {
    val msgID = result.msgId
    // Periodische Nachricht erfolgreich gestartet
    Log.i("J2534", "Periodische Nachricht gestartet, MsgID: $msgID")
} else {
    // Fehlerbehandlung
    Log.e("J2534", "Fehler beim Starten der periodischen Nachricht: ${result.status}")
}

Beispiel in Python

import ctypes

# Bibliothek laden
j2534 = ctypes.CDLL("libj2534_v04_04.so")  # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")  # Windows

# channel_id wurde zuvor erhalten
time_interval = 2000  # ms

# Nachrichtenstruktur
class PASSTHRU_MSG(ctypes.Structure):
    _fields_ = [
        ("ProtocolID", ctypes.c_ulong),
        ("RxStatus", ctypes.c_ulong),
        ("TxFlags", ctypes.c_ulong),
        ("Timestamp", ctypes.c_ulong),
        ("DataSize", ctypes.c_ulong),
        ("ExtraDataIndex", ctypes.c_ulong),
        ("Data", ctypes.c_ubyte * 4128)
    ]

msg = PASSTHRU_MSG()
msg.ProtocolID = 6  # ISO15765
msg.TxFlags = 0x40  # ISO15765_FRAME_PAD
msg.DataSize = 5
msg.Data[0:5] = [0x00, 0x00, 0x07, 0xDF, 0x3E]  # Tester Present

msg_id = ctypes.c_ulong()
ret = j2534.PassThruStartPeriodicMsg(channel_id, ctypes.byref(msg), ctypes.byref(msg_id), time_interval)
if ret == 0:  # STATUS_NOERROR
    print(f"Periodische Nachricht gestartet, MsgID: {msg_id.value}")

Beispiel in C#

using System;
using System.Runtime.InteropServices;

// channel_id wurde zuvor erhalten
uint timeInterval = 2000; // ms

var msg = new PASSTHRU_MSG
{
    ProtocolID = 6, // ISO15765
    TxFlags = 0x40, // ISO15765_FRAME_PAD
    DataSize = 5,
    Data = new byte[4128]
};
msg.Data[0] = 0x00;
msg.Data[1] = 0x00;
msg.Data[2] = 0x07;
msg.Data[3] = 0xDF;
msg.Data[4] = 0x3E; // Tester Present

uint msgId;
int ret = J2534.PassThruStartPeriodicMsg(channelId, ref msg, out msgId, timeInterval);
if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Periodische Nachricht gestartet, MsgID: {msgId}");
}