Считайте измерения XCP с динамическими списками DAQ

В этом примере показано, как использовать поддержку протокола XCP соединить и получить данные из модели Simulink, развернутой на исполняемом файле Windows. Пример читает параметры измерения модели с помощью TCP и динамических списков DAQ. XCP является высокоуровневым протоколом, используемым для доступа и изменения внутренних параметров и переменных модели, алгоритма или ECU. Для получения дополнительной информации обратитесь к стандартам ASAM.

Обзор алгоритма

Алгоритм, используемый в этом примере, является моделью Simulink, созданной и развернутой как сервер XCP. Модель была уже скомпилирована и доступна, чтобы запустить в файле XCPServerSineWaveGenerator.exe. Кроме того, A2L-файл XCPServerSineWaveGenerator.a2l обеспечивается как выход того процесса сборки. Модель содержит три измерения и две характеристики, доступные через XCP. Поскольку модель уже развертывается, Simulink не требуется запустить этот пример. Следующее изображение иллюстрирует модель.

Для получения дополнительной информации о том, как создать модель Simulink, включая сервер XCP и генерацию A2L-файла, смотрите Экспорт Файл ASAP2 для Измерения Данных и Калибровки (Simulink Coder).

Запустите модель сервера XCP

Чтобы связаться с сервером XCP, развернутая модель должна быть запущена. При помощи system функция, можно выполнить XCPServerSineWaveGenerator.exe из MATLAB. Функция требует построения списка аргументов, указывающего на исполняемый файл. Отдельное командное окно открывает и показывает рабочие выходные параметры с сервера.

sysCommand = ['"', fullfile(pwd, 'XCPServerSineWaveGenerator.exe'),'"', ' &'];
system(sysCommand);

Откройте A2L-файл

A2L-файл требуется, чтобы устанавливать связь с сервером XCP. A2L-файл описывает всю функциональность и возможность, которую сервер XCP предусматривает, а также детали того, как связать с сервером. Используйте xcpA2L функционируйте, чтобы открыть A2L-файл, который описывает модель сервера.

a2lInfo = xcpA2L("XCPServerSineWaveGenerator.a2l")
a2lInfo = 
  A2L with properties:

   File Details
                 FileName: 'XCPServerSineWaveGenerator.a2l'
                 FilePath: 'C:\Users\kuanliu\Documents\MATLAB\Examples\vnt-ex16421241\XCPServerSineWaveGenerator.a2l'
               ServerName: 'ModuleName'
                 Warnings: [0×0 string]

   Parameter Details
                   Events: {'100 ms'}
                EventInfo: [1×1 xcp.a2l.Event]
             Measurements: {'Sine'  'SineAfterGain'  'SineAfterTable'  'XCPServer_DW.lastCos'  'XCPServer_DW.lastSin'  'XCPServer_DW.systemEnable'}
          MeasurementInfo: [6×1 containers.Map]
          Characteristics: {'Gain'  'ydata'}
       CharacteristicInfo: [2×1 containers.Map]
                 AxisInfo: [1×1 containers.Map]
            RecordLayouts: [4×1 containers.Map]
             CompuMethods: [3×1 containers.Map]
                CompuTabs: [0×1 containers.Map]
               CompuVTabs: [0×1 containers.Map]

   XCP Protocol Details
        ProtocolLayerInfo: [1×1 xcp.a2l.ProtocolLayer]
                  DAQInfo: [1×1 xcp.a2l.DAQ]
    TransportLayerCANInfo: [0×0 xcp.a2l.XCPonCAN]
    TransportLayerUDPInfo: [0×0 xcp.a2l.XCPonIP]
    TransportLayerTCPInfo: [1×1 xcp.a2l.XCPonIP]

TCP является транспортным протоколом, используемым, чтобы связаться с сервером XCP. Детали для соединения по протоколу TCP, такие как IP-адрес и номер порта, содержатся в TransportLayerTCPInfo свойство.

a2lInfo.TransportLayerTCPInfo
ans = 
  XCPonIP with properties:
          CommonParameters: [1×1 xcp.a2l.CommonParameters]
    TransportLayerInstance: ''
                      Port: 17725
                   Address: 2.1307e+09
             AddressString: '127.0.0.1'

Создайте канал XCP

Чтобы создать активную связь XCP с сервером, используйте xcpChannel функция. Функция требует, чтобы ссылка на A2L-файл сервера и тип транспортного протокола использовала для обмена сообщениями с сервером.

xcpCh = xcpChannel(a2lInfo, "TCP")
xcpCh = 
  Channel with properties:

              ServerName: 'ModuleName'
             A2LFileName: 'XCPServerSineWaveGenerator.a2l'
          TransportLayer: 'TCP'
    TransportLayerDevice: [1×1 struct]
              SeedKeyDLL: []

Свяжите с сервером

Чтобы сделать связь с сервером активной, используйте connect функция.

connect(xcpCh)

Создайте и просмотрите список измерений

Измерение в XCP представляет переменную в памяти о модели. Измерения, доступные с сервера, заданы в A2L-файле. Один способ считать данные об измерении использует динамические списки DAQ. Используйте createMeasurementList функция, чтобы создать динамический список DAQ с заданным событием, используемым, чтобы инициировать сбор данных и измерения, которые включают список.

createMeasurementList(xcpCh, "DAQ", "100 ms", ["Sine", "SineAfterGain", "SineAfterTable"]) 

Просмотрите сконфигурированные динамические списки DAQ с помощью viewMeasurementLists функция.

viewMeasurementLists(xcpCh)
DAQ List #1 using the "100 ms" event @ 0.100000 seconds and the following measurements:
   Sine
   SineAfterGain
   SineAfterTable

Получите форму Данных сервер XCP

Запустите сконфигурированный динамический список DAQ с помощью startMeasurement функция. Это начинает передачу данных о DAQ из сервера и хранит данные о DAQ в канале XCP. После выполнения в течение нескольких секунд остановите измерения с помощью stopMeasurement функция.

startMeasurement(xcpCh)
pause(3);
stopMeasurement(xcpCh)

Получите данные об измерении синуса

Чтобы получить полученные данные от XCP образовывают канал для Sine измерение, используйте readDAQ функция. Функция требует, чтобы ссылка на канал XCP и заданное измерение читала. readDAQ возвращает все доступные выборки, сохраненные каналом XCP. Данные об измерении возвращены readDAQ полностью масштабируется с помощью вычислить методов, заданных для измерения в A2L-файле.

dataSine = readDAQ(xcpCh, "Sine");
plot(dataSine, "o-")
title("Sine Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

Получите данные об измерении SineAfterGain

Чтобы получить полученные данные от XCP образовывают канал для SineAfterGain измерение, используйте readDAQ функция.

dataSineAfterGain = readDAQ(xcpCh, "SineAfterGain");
plot(dataSineAfterGain, "o-")
title("SineAfterGain Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

Получите данные об измерении SineAfterTable

Чтобы получить полученные данные от XCP образовывают канал для SineAfterTable измерение, используйте readDAQ функция.

dataSineAfterTable = readDAQ(xcpCh, "SineAfterTable");
plot(dataSineAfterTable, "o-")
title("SineAfterTable Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

Отключитесь от сервера

Чтобы сделать связь с сервером неактивной, используйте disconnect функция. Сервер XCP может быть безопасно закрыт после разъединения.

disconnect(xcpCh)

Очистка

clear a2lInfo