В этом примере показано, как использовать поддержку протокола XCP соединить и получить данные из модели Simulink, развернутой на исполняемом файле Windows. Пример читает параметры измерения модели с помощью TCP и прямого доступа к памяти. 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\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 с сервером, используйте 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