Quantex GmbH
DE RU EN EL
Ваш регион: Европа

PassThruStartPeriodicMsg v4.04 v5.0

Запуск периодического сообщения

Последнее изменение:

Описание

Запускает автоматическую периодическую отправку сообщения на шину с заданным интервалом. Используется для поддержания диагностической сессии (Tester Present) или периодического опроса датчиков.

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

Параметры

Возвращаемые коды ошибок

Код Описание Возможные причины и решения
STATUS_NOERROR Функция выполнена успешно
ERR_NULL_PARAMETER Не задан указатель pMsg
  • Передан nullptr вместо указателя на сообщение
  • Решение: передайте корректный указатель на структуру PASSTHRU_MSG
ERR_INVALID_MSG Некорректная структура сообщения
  • Размер данных равен 0 или превышает 12 байт
  • Решение: убедитесь, что DataSize в диапазоне 1–12
ERR_INVALID_CHANNEL_ID Недействительный идентификатор канала
  • Канал не был открыт или уже закрыт
  • Решение: используйте ChannelID, полученный от PassThruConnect
ERR_DEVICE_NOT_CONNECTED Нет соединения с адаптером
  • Адаптер выключен, потеряна сеть, неверный IP-адрес
  • Решение: проверьте питание адаптера и сетевое подключение
ERR_INVALID_DEVICE_ID Недействительный идентификатор устройства
  • DeviceID не был получен через PassThruOpen или устройство закрыто
  • Решение: используйте DeviceID, полученный от PassThruOpen
ERR_INVALID_TIME_INTERVAL Недопустимый интервал времени
  • Значение TimeInterval вне диапазона 5–65535 мс
  • Решение: используйте интервал в допустимом диапазоне
ERR_NOT_SUPPORTED Параметры не поддерживаются адаптером
  • Интервал менее 20 мс не поддерживается прошивкой
  • Решение: увеличьте TimeInterval до 20 мс и выше
ERR_MSG_PROTOCOL_ID Несоответствие протокола
  • ProtocolID в сообщении не совпадает с протоколом канала
  • Решение: установите в pMsg->ProtocolID тот же протокол, что указан при PassThruConnect
ERR_EXCEEDED_LIMIT Превышен лимит периодических сообщений
  • Адаптер поддерживает ограниченное число периодических сообщений (обычно 10)
  • Решение: остановите неиспользуемые периодические сообщения через PassThruStopPeriodicMsg
ERR_FAILED Внутренняя ошибка
  • Ошибка в DLL или прошивке адаптера
  • Решение: вызовите PassThruGetLastError() для получения деталей

Примеры

Пример на C/C++

#include "j2534_lib.hpp"

unsigned long ChannelID; // ID канала
unsigned long MsgID;     // ID для нового периодического сообщения
long Ret;
PASSTHRU_MSG Msg;

// Сообщение "Tester Present" для 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; // Адрес ЭБУ
Msg.Data[4] = 0x3E; // Команда Tester Present

// Запускаем отправку каждые 2000 мс
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
    // Обработка ошибки
}

Пример на Kotlin (Android)

// channelID получен ранее
val timeInterval = 2000 // ms

// Сообщение "Tester Present" для 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
    // Периодическое сообщение успешно запущено
    Log.i("J2534", "Запущено периодическое сообщение, MsgID: $msgID")
} else {
    // Обработка ошибки
    Log.e("J2534", "Ошибка запуска периодического сообщения: ${result.status}")
}

Пример на Python

import ctypes

# Загрузка библиотеки
j2534 = ctypes.CDLL("libj2534_v04_04.so")  # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")  # Windows

# channel_id получен ранее
time_interval = 2000  # мс

# Структура сообщения
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"Периодическое сообщение запущено, MsgID: {msg_id.value}")

Пример на C#

using System;
using System.Runtime.InteropServices;

// channel_id получен ранее
uint timeInterval = 2000; // мс

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($"Периодическое сообщение запущено, MsgID: {msgId}");
}