Считайте измерения XCP с прямым захватом

В этом примере показано, как использовать поддержку протокола XCP соединить и получить данные из модели Simulink, развернутой на исполняемом файле Windows. Пример читает параметры измерения модели с помощью TCP и прямого доступа к памяти. 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\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex50006896\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-файле. Один способ считать данные об измерении использует прямой доступ к памяти. readMeasurement функция получает текущее значение для данного измерения с сервера. Это - одно чтение в данный момент без буферизации.

readMeasurement(xcpCh, "Sine") 
ans = -0.9511
readMeasurement(xcpCh, "SineAfterGain")
ans = -1.1756
readMeasurement(xcpCh, "SineAfterTable")
ans = 0

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

Может быть необходимо считать измерение постоянно в некотором равном интервале, такой что касается визуализации значения в пользовательском пользовательском интерфейсе или использовании значения, как введено к некоторому коду обработки. В таких случаях, readMeasurement является вызываемым в любом типе интервала, управляемого таймером или циклом. Ниже, readMeasurement называется в фиксированном цикле без задержки, чтобы накопить и построить чтение значений. Значение измерения постоянно изменяется в памяти о модели, таким образом, не каждое изменение данных отражается в графике, как значения относительно уровня самого вызова чтения. При чтении измерений этот путь подходит лучше всего для целей асинхронной или низкой частоты.

allSamples = zeros(30,1);
for ii = 1:30
    allSamples(ii) = readMeasurement(xcpCh, "Sine"); 
end
plot(allSamples, "o-")
title("Sine Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

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

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

disconnect(xcpCh)

Очистка

clear a2lInfo