Модуль XCP в TSMaster умеет напрямую выгружать mat-файлы в сжатом формате HDF5 (MATLAB 7.3 и новее), что удобно для модельной разработки на базе Simulink. В статье — формат переменных mat-файла, методы разбора временных осей и сигналов, построение timeseries и воспроизведение сигналов в Simulink.

Ключевые слова: TSMaster, XCP, mat-файл, HDF5, MATLAB, Simulink, timeseries.

1. Определение формата переменных mat

После загрузки mat-файла, выгруженного TSMaster, в MATLAB список переменных рабочей области выглядит следующим образом (рис. 1-1).

Переменные рабочей области
Рис. 1-1. Переменные рабочей области MATLAB

1.1. Фиксированные переменные

Список фиксированных переменных (рис. 1-2):

Фиксированные переменные
Рис. 1-2. Список фиксированных переменных

1.2. Метод разбора времени

Сначала разделите временной ряд, чтобы получить все временные оси (рис. 1-3):

Разбор времени
Рис. 1-3. Разделение временного ряда

На примере сигналов, записанных в AN0001: строковая переменная временного ряда TIME_LIST выглядит так:

ecu1_TIME_DAQ_Cyclic, ecu1_TIME_DAQ_10_ms, ecu1_TIME_DAQ_100ms, ecu1_TIME_POLL_noiseSignal, TIME_XCPSimBus__engine_speed

После разделения по именам в рабочей области можно получить массив каждой временной оси; каждая ось связана с одним сигналом или группой сигналов. Временные оси бывают трёх типов: время DAQ (одна ось — один сигнал или группа), время Poll (одна ось — один сигнал) и время системных переменных (одна ось — один сигнал) (рис. 1-4).

Типы временных осей
Рис. 1-4. Типы временных осей

По имени массива каждой временной оси можно извлечь абсолютное время каждого момента в секундах — на примере ecu1_TIME_DAQ_100ms (рис. 1-5):

Массив временной оси
Рис. 1-5. Массив временной оси ecu1_TIME_DAQ_100ms

1.3. Разбор сигналов, связанных со временем

Получив временную ось, нужно получить список связанных с ней сигналов и по именам сигналов из списка найти сами сигналы. Для оси ecu1_TIME_DAQ_100ms соответствующий список сигналов хранится в строковой переменной ecu1_TIME_DAQ_100ms_LIST (через запятую); правило именования: имя_оси_LIST.

Развернув строку ecu1_TIME_DAQ_100ms_LIST по запятым, получим один или несколько имён переменных, связанных с осью — в данном примере одно: ecu1_triangleSignal.

Это имя указывает на массив значений сигнала ecu1_triangleSignal: каждый элемент массива значений соответствует по времени каждому элементу массива временной оси один к одному. Правой кнопкой по сигналу можно построить кривую распределения по точкам (без информации о времени) (рис. 1-6):

Кривая по точкам
Рис. 1-6. Кривая сигнала по точкам

1.4. Построение timeseries

Чтобы построить последовательность значений сигнала с информацией о времени, дополнительно выполните m-скрипт, создающий timeseries. Для сигнала ecu1_triangleSignal с временной осью ecu1_TIME_DAQ_100ms timeseries строится так:

Triangle_signal = timeseries(ecu1_triangleSignal, ecu1_TIME_DAQ_100ms)

После этого в рабочей области появляется новый сигнал «Triangle_signal» (рис. 1-7):

Новая переменная
Рис. 1-7. Переменная Triangle_signal в рабочей области

Правой кнопкой постройте кривую изменения: по осям — время и значение (рис. 1-8):

Кривая timeseries
Рис. 1-8. Кривая timeseries: время и значение

2. Воспроизведение сигналов в Simulink

2.1. Воспроизведение переменных рабочей области в модели

Воспроизведение XCP-сигнала в модели выполняется в несколько шагов:

  1. Шаг 1. Откройте модуль Simulink, дважды кликните по пустому месту модели и выберите «FromWorkspace» (рис. 2-1).
  2. Шаг 2. По имени timeseries задайте в Simulink имя сигнала «Triangle_signal» — теперь сигнал участвует в модельных алгоритмах симуляции и тестирования (рис. 2-2).
  3. Шаг 3. Подключите Scope — результат симуляции (рис. 2-3).
FromWorkspace
Рис. 2-1. Блок FromWorkspace
Имя сигнала
Рис. 2-2. Привязка сигнала Triangle_signal
Результат симуляции
Рис. 2-3. Результат симуляции на Scope