Четвёртая часть серии: как на базе TSMaster построить мост между алгоритмом ЭБУ и моделью автомобиля. Подключаем SDK CarSim Controller к мини-программе ABS, управляем динамической моделью через API и проводим симуляционный эксперимент: разгон автомобиля и экстренное торможение со скорости выше 80 км/ч.
Ключевые слова: HIL, TSMaster, CarSim Controller, SDK, мини-программа, системные переменные, graphics, ABS.
1. Интеграция SDK в среду выполнения TSMaster
Поскольку в этом видео-примере используется клиент CarSim engine, входящий в состав CarSim Controller, кодовую базу нужно сконфигурировать: подключить SDK-файлы из пакета разработки CarSim Controller. Откройте кодовую базу мини-программы алгоритма ABS.
Поднимитесь на уровень выше в папку common — в ней могут храниться общие заголовочные и кодовые файлы нескольких мини-программ. Перетащите SDK-файлы в эту папку.
Затем перейдите в глобальные определения и в первой строке подключите заголовочный файл C++: #include "CarSimAPIUtilities.hpp" (рис. 1-1).

Нажмите «Компилировать» — SDK интегрирован в среду выполнения TSMaster.
2. Управление динамической моделью через SDK
Теперь динамической моделью можно легко управлять вызовами SDK.
Можно использовать 47 штатных API-функций CarSim engine, а можно — SDK, разработанный поверх CarSim engine: его функции проще, и весь цикл управления CarSim разделён на три стадии — инициализация, выполнение и завершение.
Функция инициализации называется callback_setup и размещается в событии запуска программы (рис. 2-1).

Функция выполнения называется callback_start_carsim, размещается в step-функции и должна выполниться только один раз; для однократного срабатывания заводится глобальная переменная vToStart (рис. 2-2).

Функция завершения называется callback_teardown и размещается в событии остановки программы. После этого компилируем и запускаем программу.
3. Симуляционный эксперимент: разгон автомобиля
Попробуем разогнать автомобиль и при скорости выше 80 км/ч выполнить экстренное торможение. Для этого в мини-программе ABS достаточно определить две собственные API-функции — назовём их acc и brake.
В acc управляем дросселем; имя входной переменной throttle копируем из CarSim Controller: cs->IMP_THROTTLE_ENGINE = 0.6; (рис. 3-1).

В brake имитируем водителя, резко нажимающего тормоз с усилием 150 бар: задаём давление главного цилиндра 15 МПа. Заводим глобальную переменную vPMC для приёма этого давления и объявляем её в глобальных определениях (рис. 3-2).

Чтобы сравнить торможение с ABS и без, сначала попробуем вариант без алгоритма ABS — давление напрямую прикладывается к четырём колёсным цилиндрам. Для этого объявим переменную vHasABS, по умолчанию — ложь (рис. 3-3).

Далее в step-функции по vHasABS определяем, выполняется ли алгоритм: если нет — напрямую присваиваем давление колёсных цилиндров.
Завершив логику, нужно наблюдать скорости колёс и давления. Эти переменные приходят из модели автомобиля — как их наблюдать? Выразим их переменными мини-программы (рис. 3-4).

Перейдите к группе переменных, правой кнопкой добавьте таблицу переменных и последовательно введите: скорость автомобиля, пройденный путь, дроссель, скорости и давления всех колёс. После «OK» объявлен набор переменных. В отличие от глобальных определений, это системные переменные: их могут получать другие мини-программы, окна graphics, панели — и автоматически строить по ним кривые.
Вернёмся в step-функцию и последовательно присвоим значения системным переменным — присваивание выполняется операцией set:
v.set(cs->VX);
station.set(cs->STATION);
throttle.set(cs->IMP_THROTTLE_ENGINE);
vFL.set(cs->VX_L1);
vFR.set(cs->VX_R1);
vRL.set(cs->VX_L2);
vRR.set(cs->VX_R2);
pFL.set(cs->IMP_PBK_L1);
pFR.set(cs->IMP_PBK_R1);
pRL.set(cs->IMP_PBK_L2);
pRR.set(cs->IMP_PBK_R2);
Запустите программу и откройте таблицу системных переменных — там виден весь набор добавленных мини-программой переменных мониторинга (рис. 3-5).

Откройте graphics и разделите график на три области: верхняя — скорость, средняя — давление, нижняя — дроссель и пройденный путь; добавьте соответствующие системные переменные для наблюдения (рис. 3-6).

Наконец, перейдите в модуль автоматизации и измените текущую логику: после запуска ждём разгона автомобиля до 80 км/ч, затем тормозим; симуляция останавливается только когда скорость упадёт до нуля.
Продолжение — в части 5: практическая реализация HIL-симуляции ЭБУ.