В этом примере показано, как использовать поддержку протокола 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