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

Для получения дополнительной информации о том, как создать модель Simulink, включая сервер XCP и генерацию A2L-файла, смотрите Экспорт Файл ASAP2 для Измерения Данных и Калибровки (Simulink Coder).
Чтобы связаться с сервером XCP, развернутая модель должна быть запущена. При помощи system функция, можно выполнить XCPServerSineWaveGenerator.exe из MATLAB. Функция требует построения списка аргументов, указывающего на исполняемый файл. Отдельное командное окно открывает и показывает рабочие выходные параметры с сервера.
sysCommand = ['"', fullfile(pwd, 'XCPServerSineWaveGenerator.exe'),'"', ' &']; system(sysCommand);
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 с сервером, используйте 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
Запустите сконфигурированный динамический список 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")

Чтобы получить полученные данные от XCP образовывают канал для SineAfterGain измерение, используйте readDAQ функция.
dataSineAfterGain = readDAQ(xcpCh, "SineAfterGain"); plot(dataSineAfterGain, "o-") title("SineAfterGain Measurement Data") xlabel("Data Point") ylabel("Data Value")

Чтобы получить полученные данные от 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