Этот пример показывает вам, как использовать каналы 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.0055549 sec 100 false '' [1x0 uint8] 0 [0x0 struct] false false 0.0055586 sec 200 false '' [1x2 uint8] 2 [0x0 struct] false false 0.0055615 sec 400 false '' [1x4 uint8] 4 [0x0 struct] false false 0.005563 sec 600 false '' [1x6 uint8] 6 [0x0 struct] false false 0.0055638 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.02477 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.04977 sec 600 false '' [1x6 uint8] 6 [0x0 struct] false false 0.049773 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.07477 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.099771 sec 600 false '' [1x6 uint8] 6 [0x0 struct] false false 0.099774 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.12477 sec 400 false '' [1x4 uint8] 4 [0x0 struct] false false 0.12477 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.14977 sec 600 false '' [1x6 uint8] 6 [0x0 struct] false false 0.14978 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.17478 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.19977 sec 600 false '' [1x6 uint8] 6 [0x0 struct] false false 0.19978 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.22477 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.24977 sec 200 false '' [1x2 uint8] 2 [0x0 struct] false false 0.24977 sec 400 false '' [1x4 uint8] 4 [0x0 struct] false false 0.24978 sec 600 false '' [1x6 uint8] 6 [0x0 struct] false false 0.24978 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.27477 sec 800 false '' [1x8 uint8] 8 [0x0 struct] false false 0.29978 sec 600 false '' [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')