Этот пример показывает вам, как использовать каналы CAN, чтобы передать и получить сообщения CAN. Это использует MathWorks Virtual CAN channels, соединенный в петлевой настройке.
Создайте канал CAN, чтобы получить сообщения путем определения имени поставщика, имени устройства и индекса канала устройства.
rxCh = canChannel('MathWorks', 'Virtual 1', 2);
Используйте get команда, чтобы получить более подробную информацию обо всех свойствах канала и их текущих значениях.
get(rxCh)
ArbitrationBusSpeed: []
DataBusSpeed: []
ReceiveErrorCount: 0
TransmitErrorCount: 0
InitializationAccess: 1
InitialTimestamp: [0x0 datetime]
SilentMode: 0
TransceiverState: 'N/A'
BusSpeed: 500000
NumOfSamples: []
SJW: []
TSEG1: []
TSEG2: []
BusStatus: 'N/A'
TransceiverName: 'N/A'
Database: []
MessageReceivedFcn: []
MessageReceivedFcnCount: 1
UserData: []
FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'
MessagesReceived: 0
MessagesTransmitted: 0
Running: 0
Device: 'Virtual 1'
DeviceChannelIndex: 2
DeviceSerialNumber: 0
DeviceVendor: 'MathWorks'
ProtocolMode: 'CAN'
MessagesAvailable: 0
Используйте start команда, чтобы установить канал онлайн.
start(rxCh);
Функция, взятая в качестве примера, generateMsgs создает сообщения CAN и передает их на различных периодических уровнях. Это создает трафик на шине CAN, например, цели и не является частью Vehicle Network Toolbox™.
type generateMsgs
function generateMsgs()
% generateMsgs Creates and transmits CAN messages for demo purposes.
%
% generateMsgs periodically transmits multiple CAN messages at various
% periodic rates with changing message data.
%
% Copyright 2008-2016 The MathWorks, Inc.
% Create the messages to send using the canMessage function. The
% identifier, an indication of standard or extended type, and the data
% length is given for each message.
msgTx100 = canMessage(100, false, 0);
msgTx200 = canMessage(200, false, 2);
msgTx400 = canMessage(400, false, 4);
msgTx600 = canMessage(600, false, 6);
msgTx800 = canMessage(800, false, 8);
% Create a CAN channel on which to transmit.
txCh = canChannel('MathWorks', 'Virtual 1', 1);
% Register each message on the channel at a specified periodic rate.
transmitPeriodic(txCh, msgTx100, 'On', 0.500);
transmitPeriodic(txCh, msgTx200, 'On', 0.250);
transmitPeriodic(txCh, msgTx400, 'On', 0.125);
transmitPeriodic(txCh, msgTx600, 'On', 0.050);
transmitPeriodic(txCh, msgTx800, 'On', 0.025);
% Start the CAN channel.
start(txCh);
% Run for several seconds incrementing the message data regularly.
for ii = 1:50
% Increment the message data bytes.
msgTx200.Data = msgTx200.Data + 1;
msgTx400.Data = msgTx400.Data + 1;
msgTx600.Data = msgTx600.Data + 1;
msgTx800.Data = msgTx800.Data + 1;
% Wait for a time period.
pause(0.100);
end
% Stop the CAN channel.
stop(txCh);
end
Запустите generateMsgs функционируйте, чтобы передать сообщения для примера.
generateMsgs();
Однажды generateMsgs завершается, получите все доступные сообщения от канала.
rxMsg = receive(rxCh, Inf, 'OutputFormat', 'timetable'); rxMsg(1:25, :)
ans =
25x8 timetable
Time ID Extended Name Data Length Signals Error Remote
_____________ ___ ________ __________ ___________ ______ ____________ _____ ______
0.0055509 sec 100 false {0x0 char} {1x0 uint8} 0 {0x0 struct} false false
0.0055545 sec 200 false {0x0 char} {1x2 uint8} 2 {0x0 struct} false false
0.0055572 sec 400 false {0x0 char} {1x4 uint8} 4 {0x0 struct} false false
0.0055585 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
0.0055592 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.022818 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.047764 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
0.047768 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.0728 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.097762 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
0.097766 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.12276 sec 400 false {0x0 char} {1x4 uint8} 4 {0x0 struct} false false
0.12276 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.14776 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
0.14776 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.17276 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.19781 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
0.19781 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.22281 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.24776 sec 200 false {0x0 char} {1x2 uint8} 2 {0x0 struct} false false
0.24776 sec 400 false {0x0 char} {1x4 uint8} 4 {0x0 struct} false false
0.24776 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
0.24777 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.27276 sec 800 false {0x0 char} {1x8 uint8} 8 {0x0 struct} false false
0.29782 sec 600 false {0x0 char} {1x6 uint8} 6 {0x0 struct} false false
Используйте stop команда, чтобы установить канал оффлайн.
stop(rxCh);
MATLAB® обеспечивает мощную среду для выполнения анализа сообщений CAN. plot команда может создать график рассеивания с Метками времени сообщения и идентификаторами, чтобы предоставить обзор того, когда определенные сообщения произошли в сети.
plot(rxMsg.Time, rxMsg.ID, 'x') ylim([0 2047]) xlabel('Timestamp') ylabel('CAN Identifier')
