Передайте и получите сообщения CAN

Этот пример показывает вам, как использовать каналы 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.12065 sec    100     false      {0x0 char}    {1x0 uint8        }      0       {0x0 struct}    false    false 
    0.12066 sec    200     false      {0x0 char}    {[            0 0]}      2       {0x0 struct}    false    false 
    0.12066 sec    400     false      {0x0 char}    {[        0 0 0 0]}      4       {0x0 struct}    false    false 
    0.12066 sec    600     false      {0x0 char}    {[    0 0 0 0 0 0]}      6       {0x0 struct}    false    false 
    0.12066 sec    800     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.14566 sec    800     false      {0x0 char}    {[1 1 1 1 1 1 1 1]}      8       {0x0 struct}    false    false 
    0.17065 sec    600     false      {0x0 char}    {[    1 1 1 1 1 1]}      6       {0x0 struct}    false    false 
    0.17066 sec    800     false      {0x0 char}    {[1 1 1 1 1 1 1 1]}      8       {0x0 struct}    false    false 
    0.19565 sec    800     false      {0x0 char}    {[1 1 1 1 1 1 1 1]}      8       {0x0 struct}    false    false 
    0.22063 sec    600     false      {0x0 char}    {[    1 1 1 1 1 1]}      6       {0x0 struct}    false    false 
    0.22063 sec    800     false      {0x0 char}    {[1 1 1 1 1 1 1 1]}      8       {0x0 struct}    false    false 
    0.24565 sec    400     false      {0x0 char}    {[        1 1 1 1]}      4       {0x0 struct}    false    false 
    0.24566 sec    800     false      {0x0 char}    {[1 1 1 1 1 1 1 1]}      8       {0x0 struct}    false    false 
    0.27065 sec    600     false      {0x0 char}    {[    2 2 2 2 2 2]}      6       {0x0 struct}    false    false 
    0.27066 sec    800     false      {0x0 char}    {[2 2 2 2 2 2 2 2]}      8       {0x0 struct}    false    false 
    0.29566 sec    800     false      {0x0 char}    {[2 2 2 2 2 2 2 2]}      8       {0x0 struct}    false    false 
    0.32066 sec    600     false      {0x0 char}    {[    2 2 2 2 2 2]}      6       {0x0 struct}    false    false 
    0.32067 sec    800     false      {0x0 char}    {[2 2 2 2 2 2 2 2]}      8       {0x0 struct}    false    false 
    0.34566 sec    800     false      {0x0 char}    {[2 2 2 2 2 2 2 2]}      8       {0x0 struct}    false    false 
    0.37066 sec    200     false      {0x0 char}    {[            2 2]}      2       {0x0 struct}    false    false 
    0.37066 sec    400     false      {0x0 char}    {[        2 2 2 2]}      4       {0x0 struct}    false    false 
    0.37067 sec    600     false      {0x0 char}    {[    2 2 2 2 2 2]}      6       {0x0 struct}    false    false 
    0.37067 sec    800     false      {0x0 char}    {[2 2 2 2 2 2 2 2]}      8       {0x0 struct}    false    false 
    0.39567 sec    800     false      {0x0 char}    {[2 2 2 2 2 2 2 2]}      8       {0x0 struct}    false    false 
    0.42066 sec    600     false      {0x0 char}    {[    3 3 3 3 3 3]}      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')