Модуль разбивается на разделы (название в квадратных скобках).
В разделах есть подразделы, на этом вложенность заканчивается.
Подразделы — фактически управляющие команды.
Основу модуля составляют триггеры — команды, реагирующие на некоторые сообщения (или их часть).
Не требуется знать программирование, чтобы писать подобные модули. Далее подробное описание.
Стандартные Разделы
- главный раздел [main]
- чтение ошибок [readdtc]
- информация [getinfo]
- непрерывные данные [data]
- стирание ошибок [erasedtc]
- флешер [readflash], [readeeprom], [writeeeprom]…
возможно появятся и другие типы
Нестандартные Разделы
Нестандартный раздел может иметь любое имя, отличное от стандартного.
Обязательным параметром такого раздела является button — имя кнопки. Оно вписывается в подраздел settings:
[unlock]
[unlock/settings]
button="Unlock Computer"
Дополнительным параметром является
ACTION — действие на кнопку, может быть одним из:
Чтение ошибок = 1
Стирание ошибок = 2
ECU Info = 3
READEEPROM = 4
READFLASH = 5
WRITEEEPROM = 6
CUSTOMACTION = 7 (по умолчанию), DEC
Раздел [main]
параметр name — имя модуля (отображается в окне работы с модулем).
Другие разделы. Подраздел [имяраздела/settings]
Общие параметры данного раздела, действуют только в рамках раздела
CANID — идентификатор CAN, Hex
FIRSTBYTE — DEC, первый байт данных в многострочных ответах, по умолчанию 4
TEXTTYPE — DEC, возвращаемый результат это текст или не текст (применяется для строковых параметров, в основном, в getinfo)
пока есть два типа
- 0 — binary, при котором возвращаемое значение будет сконвертировано из HEX в строку
- 1 — текст (по умолчанию), конвертация не производится, выводятся все печатные символы
ERR — файл с расшифровками ошибок, STR (возможно использовать макрос %LOCALE% для загрузки файлов с расшифровками ошибок на нужном языке, например, ERR=errors_%LOCALE%.txt для русского языка будет errors_ru_RU.txt
DTCSIZE — размер ошибок в ответах блока (2,4), DEC
script — имя файла со скриптом python (должен лежать в директории с конфигом), STR
size — (только для бинарных операций) размер конечного файла в байтах, DEC
mpause — глобальная пауза в миллисекундах на отсылку всех сообщения раздела
skipbytes — количество байт сообщения, которое нужно «пропустить» при разборе длинных сообщений
filter — фильтр CANID сообщений, чтобы отсеивать сообщения, используется синтаксис как в программе, например «*7??,*5??», STR
usetriggers — возможность импортировать триггеры из другого раздела, STR
формат: <имя раздела>,<нач знач индекса>,<кон знач индекса>
например,usetriggers=readeeprom,1,27
— импорт производится из раздела readeeprom с 1 по 27 включительно.
При импорте, нумерация триггеров производится так, как если бы они были просто скопированы, т.е. сквозным образом
если импортированы триггеры 2-4, то необходимо наличие триггера с номером 1 и далее 5, чтобы обеспечить непрерывность индексирования.
Подраздел [имяраздела/send]
Отправка первых сообщений (инициализация)
messages — список сообщений, STR
сообщения имеют формат CANID;DLC;DATA0 DATA1…, например,
messages=000007F1;8;02 10 60 00 00 00 00 00
если нужно послать несколько сообщений, они разделяются символом \n
timeout — время ожидание ответа на сообщение в секундах, DEC (по умолчанию 2 сек)
фактически определяет время ожидания, прежде, чем будет осуществлён переход к следующему триггеру.
Подраздел [имяраздела/triggerX]
где X — десятичное число
Последовательность триггеров начиная с 1 (до 500 шт).
Последовательность должна быть непрерывной, т.к. разборщик, увидев разрыв нумерации, далее не идёт.
Каждый триггер описывает каким образом программа должна реагировать на определённое CAN сообщение.
Команды
wait — сообщение на которое реагирует триггер (формат сообщений такой же как messages)
сравнивается только часть сообщения указанной длины
например,
[getinfo/trigger1]
wait=000007F9;2;03 7F
если первые два байта сообщения равны 03 7F, триггер будет выполнен.
также может содержать * вместо любого символа (маска), например wait=777;1;1*
будет откликаться на все сообщения начинающиеся на 1
messages — список сообщений, формат см. выше. Сообщения, которые необходимо посылать когда срабатывает данный trigger
timeout — время ожидания ответа на сообщение в секундах, DEC (по умолчанию 2 сек)
pause — пауза до отсылки _первого_ сообщения в триггере, DEC, миллисекунды
mpause — пауза до отсылки любого сообщения в триггере в миллисекундах, DEC (если есть параметр pause, то соотв для первого сообщения будет сумма)
command — команда, DEC
В настоящее время команда — это составное число (бинарное сложение)
- 0 — ничего не делать (по умолчанию)
- 1 — остановить прием передачу сообщений и выйти
- 2 — успех
- 4 — ошибка
- 8 — вывести текущее сообщение CAN
Т.е. например, если реакция на сообщение должна быть успех и выйти, то пишется 3 (сумма признаков)
progress — прогресс от 1-100, DEC
прогресс в окне ожидания, рекомендуется заполнять для длительных операций
прогрессы триггеров складываются т.е. если у вас четыре триггера с прогрессом, в каждом надо поставить 25
firstbyte — DEC, номер байта, с которого начинать вывод текста в сообщении триггера
print — STR, строка которую вывести, когда будет вызван данный триггер
при этом в строке можно использовать макросы:
- %TRGMSG% — первое сообщение из очереди триггера (если были применены какие-либо функции преобразования — преобразованное);
- %TRGID%» — идентификатор триггера из списка;
- %EVMSG% — сообщение на которое откликнулся триггер (полное, без сокращений);
- %EVMSGLIT% — тоже самое, только не в виде сообщения, а текст из сообщения начиная с firstbyte (доп параметр в триггер);
- %EVCANID% — идентефикатор интерфейса события;
printf=calcV
def calcV(dwCanid, dwDLC, strMsg):
msg = bytearray.fromhex(strMsg)dwVoltage = (msg[5] << 8) + msg[4]fVoltage = dwVoltage*4.801/1000return «Voltage = {:.2f}».format(fVoltage)
type — тип триггера, DEC
- 0 — простой (по умолчанию)
- 1 — постоянный — этот триггер не удаляется
- 2 — самостоятельный — этому триггер не требуется реакция на сообщение, он просто является аналогом send но в очереди триггеров
- 3 — чтение binary — читает binary данные из CAN потока, самовозобновляемый, как и 2
- 4 — запись binary — пишет binary данные в CAN поток, самовозобновляемый, как и 2
start — начало цикла, для создания циклов, HEX
finish — конец цикла, HEX
counter — количество повторений данного триггер, DEC. Приводит к простому дублированию в течение counter раз.
если заданы start и finish, то посылаемые сообщения в команде messages могут содержать ?? этот символ будет заменён на текущий итератор (HEX)
start1, finish1 — если ?? два (для второго)
callback — STR функция python из скрипта, имя которого указывается в settings.
Обработка триггеров происходит сверху-вниз
По мере вызова триггеры уничтожаются, остаются только триггеры типа «постоянный». Чтобы избежать бесконечных циклов, постоянный триггер не может быть самостоятельным.
если вызвана команда 1 (стоп), то дальнейшая обработка будет остановлена.
для разделов readeeprom, writeeeprom
действуют дополнительные параметры триггеров для записи/чтения в/из бинарного файла
bstart — начальный адрес, HEX
bfinish — конечный адрес, HEX
Эти адреса передаются в виде сообщений посредством callback — обязательный параметр в этом случае, описание см. выше.
Сам binary пишется/читается последовательно, т.е. от написанных команд зависит каким образом будет сформирован конечный файл при чтении, или каким образом
будут переданы команды на запись из файла в ЭБУ.
cont — триггер типа continuous, т.е. имеющий составные индексируемые CAN-фреймы
infostart — указывается для пометки сообщения, после которого блок должен начать возвращать информацию (до этого все сообщения игнорируются), DEC. Этот параметр используется для получения данных о DTC и getinfo, чтобы не перепутать с предварительными техническими сообщениями. По умолчанию, он равен 0, но в случае, если прямо за текущим триггером должны пойти информационные сообщения, то необходимо указать infostart=1, фактически это указывает программе, на сколько сообщений от текущего отступить, перед чтением информационных сообщений.
CALLBACK
CALLBACK — это скрипт python, в которой вы декларируете функции определённого вида
def HyS(strBytes, dwLen, strTemplate)
strBytes — массив байтов из сообщения, в виде строки. Для перевода в байты, преобразовать с помощью встроенных функций:pMsgBytes = bytearray.fromhex(strBytes)
dwLen — длина сообщения
pTemplate — шаблон сообщения из скрипта (параметр messages), который Вы, в зависимости от своих вычислений меняете, тоже в виде строки
Возвращаемое значение — tuple: длина сообщения, которое требуется послать (по идее оно должно равняться длине сообщения из pTemplate), и сообщение с изменёнными данными, например,
return (8,pTemplate.hex())
для команды callback в блоке типа read/write binary
def GetB(dwAddr, dwLen, strMsg):
dwAddr — адрес из диапазона скрипта от bstart до bfinish
dwLen — длина подготовленного к отправке сообщения
strMsg — шаблон сообщения из скрипта (параметр messages), который меняется, текстовый формат (см. выше)
Возвращаемое значение — tuple: длина в байтах, которое предполагается прочитать или записать, и само сообщение
Внимание! Если callback возвращает 0, то данный триггер немедленно удаляется/закрывается и управление передается на следующий trigger.
Индексированные [getinfo], [data]
если вы хотите вернуть несколько значений в [getinfo] или [data] например номер блока, вин автомобиля и т.п. информацию, то нужно создать несколько разделов для каждого из значений: [getinfo], [getinfo1], [getinfo2]…
Они будут выполняться последовательно при нажатии кнопки Get Info.
Если при отладке модуля он ушел в бесконечный цикл, то можно нажать Ctrl+C — выполнения модуля прервется.