Quantex GmbH
Votre région : Europe

PassThruStartMsgFilter v4.04 v5.0

Configuration du filtre de messages

Dernière modification :

Description

Avant de commencer à recevoir ou à transmettre des messages, il est nécessaire de configurer les filtres de messages. Si aucun filtre n'est configuré, tous les messages sont bloqués. Pour le protocole ISO 15765, un seul type de filtre est disponible, FLOW_CONTROL_FILTER. Il ne peut pas être configuré pour d'autres protocoles. Pour chaque ChannelID, il est possible de créer jusqu'à 16 filtres FLOW_CONTROL_FILTER et jusqu'à 10 filtres PASS_FILTER ou BLOCK_FILTER. Pour chaque type de filtre sélectionné, il faut indiquer les paramètres du filtre. Pour FLOW_CONTROL_FILTER, on indique trois paramètres pMaskMsg, pPatternMsg, pFlowControlMsg. Pour PASS_FILTER ou BLOCK_FILTER, on indique deux paramètres pMaskMsg et pPatternMsg. La longueur des paramètres peut être de 1 à 12 octets.

long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)

Paramètres

Dans le protocole ISO 15765, il existe un message standard et un message étendu. Dans le message standard, l'en-tête utilise 4 octets, et dans le message étendu 5 octets. L'en-tête étendu est utilisé, par exemple, dans le BCM de Toyota ou dans les ECU de BMW.

Codes d'erreur retournés

Code Description Causes possibles et solutions
STATUS_NOERROR La fonction s'est exécutée correctement
ERR_DEVICE_NOT_CONNECTED Aucune connexion avec l'adaptateur
  • L'adaptateur est éteint ou hors de la zone de couverture
  • Solution : vérifiez l'alimentation de l'adaptateur et la connexion réseau
ERR_INVALID_DEVICE_ID Identifiant de périphérique non valide
  • Le DeviceID n'a pas été obtenu via PassThruOpen ou le périphérique est déjà fermé
  • Solution : assurez-vous que PassThruOpen s'est exécuté correctement
ERR_INVALID_CHANNEL_ID Identifiant de canal non valide
  • Le ChannelID n'a pas été obtenu via PassThruConnect ou le canal est déjà fermé
  • Solution : assurez-vous que PassThruConnect s'est exécuté correctement
ERR_INVALID_MSG Structure de message incorrecte
  • Structure incorrecte dans pMaskMsg, pPatternMsg ou pFlowControlMsg
  • Les messages ont des TxFlags ou des DataSize différents
  • Solution : vérifiez la validité des champs ProtocolID, DataSize et TxFlags dans tous les messages
ERR_NULL_PARAMETER NULL transmis à la place d'un pointeur obligatoire
  • pMaskMsg, pPatternMsg ou FilterID est égal à NULL
  • Solution : transmettez des pointeurs corrects vers les structures
ERR_NOT_UNIQUE Le CAN ID est déjà utilisé dans un autre FLOW_CONTROL_FILTER
  • Le CAN ID dans pPatternMsg ou pFlowControlMsg coïncide avec l'ID d'un filtre existant
  • Solution : supprimez le filtre existant ou utilisez un autre CAN ID
ERR_EXCEEDED_LIMIT Limite de filtres dépassée
  • Maximum atteint : 16 FLOW_CONTROL_FILTER ou 10 PASS/BLOCK_FILTER par canal
  • Solution : supprimez les filtres inutilisés via PassThruStopMsgFilter
ERR_MSG_PROTOCOL_ID Incompatibilité de protocole
  • Le ProtocolID dans les messages du filtre ne correspond pas au protocole du canal
  • Solution : utilisez le même ProtocolID que celui indiqué dans PassThruConnect
ERR_FAILED Erreur indéterminée
  • Erreur interne de la bibliothèque ou de l'adaptateur
  • Solution : appelez PassThruGetLastError() pour obtenir la description

Exemples

Protocole ISO15765 (CAN)

Exemple en C/C++

#include "j2534_lib.hpp"

// ... ChannelID obtenu de PassThruConnect ...

PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;

// Masque : nous comparons les 4 premiers octets (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);

// Modèle : nous recevons les messages avec CAN ID 0x7E8
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;

// Réponse FlowControl : nous envoyons au CAN ID 0x7E0
FlowControlMsg.ProtocolID = ISO15765;
FlowControlMsg.DataSize = 4;
FlowControlMsg.Data[0] = 0x00;
FlowControlMsg.Data[1] = 0x00;
FlowControlMsg.Data[2] = 0x07;
FlowControlMsg.Data[3] = 0xE0;

Ret = PassThruStartMsgFilter(ChannelID, FLOW_CONTROL_FILTER,
                             &MaskMsg, &PatternMsg, &FlowControlMsg, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Traitement de l'erreur
}

Exemple en Kotlin (Android)

// channelID obtenu précédemment de ptConnect
val mask = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Masque pour CAN ID (nous comparons les 4 octets)
    data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Nous recevons les réponses de l'ECU avec CAN ID 0x7E8
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Nous envoyons FlowControl au CAN ID 0x7E0
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE0.toByte())
)

val resFilter = j2534.ptStartMsgFilter(channelID, FLOW_CONTROL_FILTER, mask, pattern, flowControl)
if (resFilter.status == STATUS_NOERROR) {
    val filterID = resFilter.filterId
    // Filtre configuré correctement
    Log.i("J2534", "Filtre FLOW_CONTROL_FILTER configuré, ID: $filterID")
} else {
    // Traitement de l'erreur
    Log.e("J2534", "Erreur lors de la configuration du filtre: ${resFilter.status}")
}

Exemple en Python

from ctypes import *

# channelID obtenu précédemment de PassThruConnect

# Nous créons les structures des messages
mask = PASSTHRU_MSG()
mask.ProtocolID = ISO15765
mask.DataSize = 4
mask.Data[0:4] = [0xFF, 0xFF, 0xFF, 0xFF]

pattern = PASSTHRU_MSG()
pattern.ProtocolID = ISO15765
pattern.DataSize = 4
pattern.Data[0:4] = [0x00, 0x00, 0x07, 0xE8]

flow_control = PASSTHRU_MSG()
flow_control.ProtocolID = ISO15765
flow_control.DataSize = 4
flow_control.Data[0:4] = [0x00, 0x00, 0x07, 0xE0]

filter_id = c_ulong()
ret = j2534.PassThruStartMsgFilter(
    channel_id, FLOW_CONTROL_FILTER,
    byref(mask), byref(pattern), byref(flow_control), byref(filter_id)
)
if ret == 0:  # STATUS_NOERROR
    print(f"Filtre configuré, ID: {filter_id.value}")
else:
    print(f"Erreur: {ret}")

Exemple en C#

// channelID obtenu précédemment de PassThruConnect

var mask = new PASSTHRU_MSG {
    ProtocolID = ISO15765,
    DataSize = 4,
    Data = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }
};

var pattern = new PASSTHRU_MSG {
    ProtocolID = ISO15765,
    DataSize = 4,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xE8 }
};

var flowControl = new PASSTHRU_MSG {
    ProtocolID = ISO15765,
    DataSize = 4,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xE0 }
};

uint filterId;
int ret = J2534.PassThruStartMsgFilter(
    channelId, FLOW_CONTROL_FILTER,
    ref mask, ref pattern, ref flowControl, out filterId
);
if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Filtre configuré, ID: {filterId}");
}

Protocole ISO14230 (K-Line)

Exemple en C/C++

#include "j2534_lib.hpp"

// ... ChannelID obtenu de PassThruConnect ...

PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;

// Masque : nous comparons le premier octet (format)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;

// Modèle : nous laissons passer tous les messages avec le bit de format = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;

Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Traitement de l'erreur
}