Локальная поддержка checksum и rolling counter в сетевой симуляции TSMaster позволяет реализовать симуляцию сети с checksum и RC, не написав ни строки кода. Разбираем, чем новый подход отличается от старого, как настроить сигналы в базе данных и как задать собственный CRC-алгоритм.
Ключевые слова: checksum, rolling counter, CRC, RBS, сетевая симуляция, TSMaster.
1. Старая версия против новой
Старый способ. Раньше каждый сигнал имитировался мини-приложением: открываем пример, нажимаем F5 для запуска симуляции — и видим непрерывно нарастающий rolling counter, ту самую синюю треугольную волну (рис. 1-1). Развернув Trace, можно перетащить checksum в окно графиков и наблюдать кривую checksum в реальном времени. Но в коде мини-приложения, в callback-функции pretx, приходилось писать программу, напрямую управляющую сигналами checksum и rolling counter. При крупной сетевой симуляции это отнимает массу времени: обработка каждого сигнала по отдельности чревата ошибками и проблемами с производительностью.

Новый способ не требует ручной обработки каждого сигнала. Создадим новый проект: откройте «Проект → Каталог проекта», найдите пример базы данных из комплекта установки TSMaster, например powertrain, и перетащите её — база загружена (рис. 1-2).

Выберите кадр сообщения, например ABS data: в нём нет checksum и RC — добавим эти сигналы в базу. Нажмите кнопку редактирования, откройте редактор базы данных и создайте два новых сигнала: ABS checksum (checksum обычно 8-битный беззнаковый) и ABS RC (обычно 4-битный беззнаковый). Перетащите оба сигнала в сообщение ABS data, откройте окно конфигурации сообщения, измените DLC на 8 и переключитесь на layout (рис. 1-3).

Перетащите новый RC на подходящую позицию, затем задайте позицию checksum. Поскольку checksum защищает содержимое данных сообщения, он обычно располагается в первом или последнем байте сообщения. Перетащим сигнал в последний байт — то есть защищаемый диапазон с байта 0 по байт 6. Нажмите «OK», «Сохранить», «Закрыть» — TSMaster автоматически обновит отредактированную базу (рис. 1-4).

Теперь разверните сообщение ABS data и переключитесь в окно раскладки: видны два новых сигнала — rolling counter на битах 52–55 и checksum на битах 56–63. Сигналы добавлены в соответствии с требованиями (рис. 1-5).

2. Локальная поддержка checksum и RC
Закройте редактор базы данных, переключитесь в «Симуляция», откройте окно RBS, дважды щёлкните для активации узла engine, установите автозапуск симуляции и нажмите F5 — RBS будет симулировать все сообщения узла engine (рис. 2-1).

Переключитесь в «Анализ», откройте окно Trace, разверните сообщение ABS data: новые RC и checksum пока равны 0 — их нужно сконфигурировать. Вернитесь в окно RBS, щёлкните правой кнопкой по сигналу RC и назначьте его сигналом rolling counter — настройка вступает в силу немедленно, и rolling counter начинает изменяться (рис. 2-2).

Откройте окно графиков и перетащите туда RC — увидите пилообразную волну: RC работает. Далее настраиваем checksum. Поскольку checksum связан с установкой и редактированием библиотеки CRC-алгоритмов, этот сигнал нельзя конфигурировать «на лету»: сначала нажмите F6 для остановки симуляции, затем щёлкните правой кнопкой по сигналу checksum и выберите «Назначить сигналом checksum». При первой настройке система установит библиотеку CRC-алгоритмов по умолчанию и после установки покажет список CRC-алгоритмов (рис. 2-3).

Выберите любой алгоритм, например CRC-8, — алгоритм CRC-8 связан с сигналом checksum. Осталось подтвердить ещё один параметр: защищаемый диапазон checksum — по умолчанию начиная с байта 0 защищаются следующие 7 байтов, и это можно изменить в любой момент. Щёлкните правой кнопкой и выберите «Редактировать параметры CRC-алгоритма» — откроется таблица уже сконфигурированных CRC-сигналов (рис. 2-4).

Двойной щелчок по любому сигналу таблицы позволяет изменить связанный CRC-алгоритм; пока алгоритм менять не будем — достаточно знать, что в этом окне можно менять начальный защищаемый байт и число защищаемых байтов. Нажмите «OK», снова нажмите F5 для запуска симуляции, разверните сообщение ABS data — checksum уже обновляется (рис. 2-5).

Перетащите сигнал в окно графиков — видна кривая checksum в реальном времени. Обычно алгоритм checksum определяется самой компанией, и библиотеку CRC по умолчанию можно переписать под свои нужды. Откройте «Симуляция → Библиотека мини-приложений»: библиотека CRC по умолчанию — тоже просто библиотека мини-приложения, предоставляющая 21 штатный алгоритм (рис. 2-6).

Исходный код этой библиотеки можно найти в редакторе C-кода. Обратите внимание: это мини-приложение поставляется как библиотечный файл, у него нет собственных кнопок запуска и остановки. Определим в нём собственный CRC-алгоритм: правой кнопкой добавьте пользовательскую функцию с именем mycrc, скопируйте любую таблицу параметров и перенесите содержимое существующего алгоритма, например CRC-8, а затем модифицируйте — например, измените poly = 0x17. Чтобы установить новую функцию в систему, достаточно скомпилировать библиотеку алгоритмов (рис. 2-7).

Сначала остановите симуляцию — библиотека алгоритмов в этот момент используется движком RBS. После этого нажмите «Компилировать»: компиляция пройдёт успешно, и библиотека автоматически установится в систему.
3. Как получить кривые в реальном времени
Откройте симуляцию шины, щёлкните правой кнопкой по сигналу и заново выберите CRC-алгоритм — наш mycrc; связь установлена. Нажмите F5, переключитесь в окно графиков — кривая checksum уже другая. Поскольку во всём сообщении изменяется только сигнал rolling counter, кривая checksum имеет закономерный вид. Как «оживить» и остальные сигналы?
3.1. Ручной способ
Быстрее всего — через генератор сигналов окна отправки. Сначала в окне RBS измените цикл этого сообщения на 0 — тогда RBS не будет отправлять его автоматически. Затем переключитесь в окно отправки, нажмите «добавить сообщение из базы данных», выберите ABS data и нажмите «Отправить»; в окне графиков появится та же кривая, что и раньше (рис. 3-1). В этом сила новой функции: из какого бы модуля системы ни отправлялось сообщение, пока RBS активен, checksum и rolling counter сообщения конфигурируются корректно.

Теперь можно возбуждать другие сигналы, например carspeed: выберите в генераторе синусоиду, задайте смещение 150 (его диапазон 0–300), нажмите «Применить», «Закрыть», «Запустить генерацию» — checksum начнёт изменяться. Перетащите carspeed в окно графиков — видны кривые всех сигналов в реальном времени, причём checksum меняется уже нерегулярно, потому что изменяются сразу два сигнала (рис. 3-2). Это и есть ручной способ настройки checksum и rolling counter.

3.2. Автоматический способ
Ту же настройку можно выполнить автоматически через API мини-приложений. Сначала очистите конфигурацию двух сигналов: щёлкните правой кнопкой и выберите «Назначить обычным сигналом» — сигналы потеряют свои функции и примут значения по умолчанию. Затем откройте модуль автоматизации, добавьте вызов функции и введите в поиске «rc» — среди результатов есть функция can rbs set rc Signal, связанная с rolling counter. У неё один входной параметр — адрес сигнала в базе данных. Перейдите в симуляцию шины и скопируйте адрес базы данных сигнала RC (правой кнопкой) — настройка сигнала готова (рис. 3-3).

Добавьте ещё один вызов функции (Enter — новое действие) и выберите функцию, связанную с CRC, — set crc Signal, у неё 4 параметра. Первый — адрес сигнала: действуем так же, копируем адрес checksum из базы данных. Второй — имя алгоритма: это выбранный ранее mycrc, но перед ним нужен префикс мини-приложения, то есть crc.mycrc (мини-приложение называется crc — берём имя, добавляем точку и имя функции). Далее начальный защищаемый байт — с байта 0, защищаем 7 байтов. Настройка завершена (рис. 3-4).
