- Главная
- ScanDoc Development
- Описание команд PassThru
PassThru StartMsgFilter Установка фильтра сообщений
Описание
Перед началом приёма или передачи сообщений, необходимо установить фильтры сообщений. Если ни один фильтр не установлен, то все сообщения блокируются. Для протокола ISO 15765 доступен только один тип фильтра FLOW_CONTROL_FILTER. Его нельзя устанавливать
для других протоколов. Для каждого СhannelID можно создать до 64 фильтров FLOW_CONTROL_FILTER и до 10 PASS_FILTER или BLOCK_FILTER. Для каждого выбранного типа фильтра необходимо указать параметры фильтра. Для FLOW_CONTROL_FILTER указывается
три параметра pMaskMsg, pPatternMsg, pFlowControlMsg. Для PASS_FILTER или BLOCK_FILTER указывается два параметра pMaskMsg и pPatternMsg. Длина параметров может быть от 1 до 12 байт.
long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)
Параметры
- unsigned long ChanneID - Сохранённый при установлении связи командой PassThruConnect идентификатор канала.
- unsigned long FilterType - Тип фильтра.
Название константы |
Описание |
PASS_FILTER |
Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение пропускается. Этот фильтр не действителен для ISO 15765 протоколов. |
BLOCK_FILTER |
Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение блокируется. Этот фильтр не действителен для ISO 15765 протоколов. |
FLOW_CONTROL_FILTER |
Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение пропускается. Этот фильтр действителен только для ISO 15765 протоколов. |
- PASSTHRU_MSG* pMaskMsg - Указатель на маску фильтра. Маска накладывается по AND на сообщение, начиная с первого байта заголовка.
- PASSTHRU_MSG* pPatternMsg - Указатель на шаблон. Он сравнивается с сообщением на который была наложена маска. Если заголовок не совпадает, то считается что условия фильтра не выполнено. И в зависимости от типа фильтра сообщение
блокируется или пропускается.
- PASSTHRU_MSG* pFlowControlMsg - Указатель на параметр Flow control. Используется только для протокола ISO15765. В параметре указывается заголовок для передачи пакета FlowControl в сегментированном сообщении. Как правило устанавливается
равным CANID диагностического тестера.
- unsigned long* FilterID, - Возвращаемый указатель на установленный фильтр. Необходим в последствии для удаления фильтра.
В протоколе ISO 15765 существует стандартное и расширенное сообщение. В стандартном сообщении для заголовка используется 4 байта для расширенного 5 байт. Расширенный заголовок используется например в BCM Toyota или в ЭБУ BMW.
Возвращаемые коды ошибок
Определение |
Описание |
STATUS_NOERROR |
Функция выполнена успешно |
ERR_DEVICE_NOT_CONNECTED |
Нет соединения с адаптером. Возможные причины: Адаптер выключен, нет сети, или не правильно задан IP адрес. |
ERR_INVALID_DEVICE_ID |
Задан не существующий идентификатор адаптера DeviceID |
ERR_INVALID_MSG |
Не правильная структура сообщения заданная в указателях pMaskMsg, pPatternMsg или pFlowControlMsg |
ERR_INVALID_CHANNEL_ID |
Задан не существующий идентификатор канала ChannelID |
ERR_NULL_PARAMETER |
Не задан указатель на pMaskMsg или pPatternMsg |
ERR_NOT_UNIQUE |
CAN ID в pPatternMsg или pFlowControlMsg соответствует какому либо ID в уже существующем FLOW_CONTROL_FILTER |
ERR_MSG_PROTOCOL_ID |
Протокол заданный в параметрах фильтра не совпадает с протоколом заданным в ChannelID |
ERR_EXCEEDED_LIMIT |
Превышено количество установленных фильтров. |
ERR_FAILED |
Определён стандартом J2534. В адаптере, для этой функции не используется. |
Пример
Протокол ISO15765
#include "j2534_lib.hpp"
PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long ChannelID;
unsigned long FilterID;
static const uint8_t cMaskMsg[] = { 0xFF, 0xFF, 0xFF, 0xFF};
static const uint8_t cPatternMsg[] = { 0x00, 0x00, 0x07, 0xE8};
static const uint8_t cFlowControlMsg[] = { 0x00, 0x00, 0x07, 0xE0};
PassThruOpen("192.168.1.3", &DeviceID);
PassThruConnect(DeviceID, ISO15765, 0, 500000, &ChannelID);
MaskMsg.ProtocolID = ISO15765;
MaskMsg.TxFlags = FL_ISO15765_FRAME_PAD;
memcpy(MaskMsg.Data, cMaskMsg, sizeof(cMaskMsg));
MaskMsg.DataSize = sizeof(cMaskMsg);
PatternMsg.ProtocolID = ISO15765;
PatternMsg.TxFlags = FL_ISO15765_FRAME_PAD;
memcpy(PatternMsg.Data, cPatternMsg, sizeof(cPatternMsg));
PatternMsg.DataSize = sizeof(cPatternMsg);
FlowControlMsg.ProtocolID = ISO15765;
FlowControlMsg.TxFlags = FL_ISO15765_FRAME_PAD;
memcpy(FlowControlMsg.Data, cFlowControlMsg, sizeof(cFlowControlMsg));
FlowControlMsg.DataSize = sizeof(cFlowControlMsg);
Ret = PassThruStartMsgFilter(ChannelID, FLOW_CONTROL_FILTER, &MaskMsg, &PatternMsg, &FlowControlMsg, &FilterID);
if (Ret != STATUS_NOERROR)
{ // Обработка ошибки
}
Протокол ISO14230
#include "j2534_lib.hpp"
PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long ChannelID;
unsigned long FilterID;
static const uint8_t cMaskMsg[] = {0x80};
static const uint8_t cPatternMsg[] = {0x80};
PassThruOpen("192.168.1.3", &DeviceID);
PassThruConnect(DeviceID, ISO14230, 0, 10400, &ChannelID);
MaskMsg.ProtocolID = ISO14230;
MaskMsg.TxFlags = 0;
memcpy(MaskMsg.Data, cMaskMsg, sizeof(cMaskMsg));
MaskMsg.DataSize = sizeof(cMaskMsg);
PatternMsg.ProtocolID = ISO14230;
PatternMsg.TxFlags = 0;
memcpy(PatternMsg.Data, cPatternMsg, sizeof(cPatternMsg));
PatternMsg.DataSize = sizeof(cPatternMsg);
Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{ // Обработка ошибки
}