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

Узнайте установленное оборудование

В примере вы обнаруживаете свои системные устройства CAN с canChannelList, затем создайте два использования каналов CAN canChannel. Позже, вы редактируете свойства первого канала и создаете использование сообщения canMessage, затем передайте сообщение от первого использования канала transmit, и получите его на другом использовании канала receive.

  1. Получите информацию об аппаратных устройствах CAN в вашей системе.

    info = canChannelList
    info =
    
      14×6 table
    
          Vendor              Device           Channel       DeviceModel       ProtocolMode   SerialNumber
       _____________  _______________________  _______  _____________________  _____________  ____________
    
       "MathWorks"    "Virtual 1"                 1     "Virtual"              "CAN, CAN FD"    "0"     
       "MathWorks"    "Virtual 1"                 2     "Virtual"              "CAN, CAN FD"    "0"     
       "Vector"       "VN1610 1"                  1     "VN1610"               "CAN, CAN FD"    "18959"
       "Vector"       "VN1610 1"                  2     "VN1610"               "CAN, CAN FD"    "18959"
       "Vector"       "Virtual 1"                 1     "Virtual"              "CAN, CAN FD"    "0"
       "Vector"       "Virtual 1"                 2     "Virtual"              "CAN, CAN FD"    "0"
       "PEAK-System"  "PCAN-USB Pro"              1     "PCAN-USB Pro"         "CAN, CAN FD"    "0"
       "PEAK-System"  "PCAN-USB Pro"              2     "PCAN-USB Pro"         "CAN, CAN FD"    "0"
       "Kvaser"       "USBcan Professional 1"     1     "USBcan Professional"  "CAN"            "10680"
       "Kvaser"       "USBcan Professional 1"     1     "USBcan Professional"  "CAN"            "10680"
       "Kvaser"       "Virtual 1"                 1     "Virtual"              "CAN, CAN FD"    "0"
       "Kvaser"       "Virtual 1"                 2     "Virtual"              "CAN, CAN FD"    "0"
       "NI"           "9862 CAN/HS (CAN1)"        1     "9862"                 "CAN, CAN FD"    "17F5094"
       "NI"           "9862 CAN/HS (CAN2)"        1     "9862"                 "CAN, CAN FD"    "17F50B2"

Примечание

Чтобы изменить этот пример для аппаратного устройства CAN, установите петлевую связь между двумя каналами.

Создайте каналы CAN

Создайте два MathWorks виртуальные каналы CAN.

canch1 = canChannel('MathWorks','Virtual 1',1)
canch2 = canChannel('MathWorks','Virtual 1',2)
canch1 = 

  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 1
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0×0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 500000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []


canch2 = 

  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 2
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0×0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 500000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

Для каждого канала заметьте что его начальный Running значением является 0 (остановленный), и его скорость шины 500000.

Примечание

Вы не можете использовать ту же переменную, чтобы создать несколько каналов последовательно. Очистите любой канал перед использованием той же переменной, чтобы создать новый канал CAN.

Вы не можете создать массивы объектов канала CAN. Каждый объект, который вы создаете, должен быть присвоен своей собственной скалярной переменной.

Сконфигурируйте свойства канала

Можно установить поведение канала CAN путем конфигурирования его значений свойств. Для этого осуществления измените скорость шины канала 1 - 250 000 использований configBusSpeed функция.

Совет

Сконфигурируйте значения свойств, прежде чем вы запустите канал.

  1. Измените скорость шины обоих каналов к 250000, затем просмотрите канал BusSpeed свойство проверить установку.

    configBusSpeed(canch1,250000)
    canch1.BusSpeed
    
    ans =
    
          250000
    
    
  2. Можно также видеть обновленную скорость шины в отображении канала.

    canch1
    
    canch1 = 
    
      Channel with properties:
    
       Device Information
                DeviceVendor: 'MathWorks'
                      Device: 'Virtual 1'
          DeviceChannelIndex: 1
          DeviceSerialNumber: 0
                ProtocolMode: 'CAN'
    
       Status Information
                     Running: 0
           MessagesAvailable: 0
            MessagesReceived: 0
         MessagesTransmitted: 0
        InitializationAccess: 1
            InitialTimestamp: [0×0 datetime]
               FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'
    
       Channel Information
                   BusStatus: 'N/A'
                  SilentMode: 0
             TransceiverName: 'N/A'
            TransceiverState: 'N/A'
           ReceiveErrorCount: 0
          TransmitErrorCount: 0
                    BusSpeed: 250000
                         SJW: []
                       TSEG1: []
                       TSEG2: []
                NumOfSamples: []
    
       Other Information
                    Database: []
                    UserData: []
    
    
  3. Похожим способом измените скорость шины второго канала.

    configBusSpeed(canch2,250000)
    

Запустите каналы

После того, как вы сконфигурируете их свойства, запустите оба канала. Затем просмотрите обновленную информацию о статусе первого канала.

start(canch1)
start(canch2)
canch1
canch1 = 

  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 1
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 1
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 23-May-2019 15:43:40
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 250000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

Заметьте, что каналом, Запускающим значение свойства, является теперь 1 TRUE.

Создайте сообщение

После того, как вы устанавливаете все значения свойств, как желаемый, и ваши каналы запускаются, вы готовы передать и получить сообщения на шине CAN. Для этого осуществления передайте сообщение с помощью canch1 и получите его с помощью canch2. Чтобы передать сообщение, создайте объект сообщения и упакуйте сообщение необходимыми данными.

Создайте сообщение CAN со стандартным идентификатором типа 500 и длиной данных 8 байтов.

messageout = canMessage(500,false,8)
messageout = 

  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 500
        Extended: 0
            Name: ''

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0]
         Signals: []
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: []
        UserData: []

Некоторые свойства сообщения указывают:

  • Error — Логический 0 (FALSE), потому что сообщение не является ошибкой.

  • Remote — Логический 0 (FALSE), потому что сообщение не является удаленной системой координат.

  • ID — ID вы задали.

  • Extended — Логический 0 (FALSE), потому что вы не задавали расширенный ID.

  • Data — uint8 массив 0s, с размером, заданным по условию длина.

Обратитесь к canMessage функция, чтобы понять больше о ее входных параметрах.

Упакуйте сообщение

После того, как вы создаете сообщение, упаковываете его необходимыми данными.

  1. Используйте pack функционируйте, чтобы упаковать ваше сообщение этими входными параметрами: Data значение 25, старт-бит 0, сигнализирует о размере 16, и порядок байтов с помощью формата с прямым порядком байтов. Просмотрите сообщение Data свойство проверить настройки.

    pack(messageout,25,0,16,'LittleEndian')
    messageout.Data
    
    ans =
    
      1×8 uint8 row vector
    
       25    0    0    0    0    0    0    0
    
    

Единственным свойством сообщения, которое изменяется от упаковки, является Data. Обратитесь к pack функция, чтобы понять больше о ее входных параметрах.

Передайте сообщение

Теперь можно передать упакованное сообщение. Используйте transmit функция, предоставляя канал canch1 и сообщение как входные параметры.

transmit(canch1,messageout)
canch1
canch1 = 

  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 1
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 1
       MessagesAvailable: 1
        MessagesReceived: 0
     MessagesTransmitted: 1
    InitializationAccess: 1
        InitialTimestamp: 23-May-2019 15:43:40
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 250000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

MATLAB® отображает обновленный канал. В разделе Status Information, MessagesTransmitted значение постепенно увеличивается к 1 каждому разу, когда вы передаете сообщение. Сообщение, которое будет получено, доступно для всех устройств на шине, таким образом, это обнаруживается в MessagesAvailable свойство даже для канала передачи.

Обратитесь к transmit функция, чтобы понять больше о ее входных параметрах.

Получите сообщение

Используйте receive функция, чтобы получить доступное сообщение на canch2.

  1. Чтобы видеть сообщения, доступные, чтобы быть полученными на этом канале, введите:

    canch2
    
    canch2 = 
    
      Channel with properties:
    
       Device Information
                DeviceVendor: 'MathWorks'
                      Device: 'Virtual 1'
          DeviceChannelIndex: 2
          DeviceSerialNumber: 0
                ProtocolMode: 'CAN'
    
       Status Information
                     Running: 1
           MessagesAvailable: 1
            MessagesReceived: 0
         MessagesTransmitted: 0
        InitializationAccess: 1
            InitialTimestamp: 23-May-2019 15:43:40
               FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'
    
       Channel Information
                   BusStatus: 'N/A'
                  SilentMode: 0
             TransceiverName: 'N/A'
            TransceiverState: 'N/A'
           ReceiveErrorCount: 0
          TransmitErrorCount: 0
                    BusSpeed: 250000
                         SJW: []
                       TSEG1: []
                       TSEG2: []
                NumOfSamples: []
    
       Other Information
                    Database: []
                    UserData: []
    
    

    Информация о состоянии канала указывает 1 для MessagesAvailable.

  2. Получите одно сообщение на canch2 и присвойте его messagein.

    messagein = receive(canch2,1)
    
    messagein = 
    
      Message with properties:
    
       Message Identification
        ProtocolMode: 'CAN'
                  ID: 500
            Extended: 0
                Name: ''
    
       Data Details
           Timestamp: 0.0312
                Data: [25 0 0 0 0 0 0 0]
             Signals: []
              Length: 8
    
       Protocol Flags
               Error: 0
              Remote: 0
    
       Other Information
            Database: []
            UserData: []
    
    

    Отметьте полученное сообщение Data свойство. Это совпадает с данными, переданными от canch1.

    Обратитесь к receive функция, чтобы понять больше о ее входных параметрах.

  3. Чтобы проверять, получил ли канал сообщение, просмотрите отображение канала.

    canch2
    
    canch2 = 
    
      Channel with properties:
    
       Device Information
                DeviceVendor: 'MathWorks'
                      Device: 'Virtual 1'
          DeviceChannelIndex: 2
          DeviceSerialNumber: 0
                ProtocolMode: 'CAN'
    
       Status Information
                     Running: 1
           MessagesAvailable: 0
            MessagesReceived: 1
         MessagesTransmitted: 0
        InitializationAccess: 1
            InitialTimestamp: 23-May-2019 15:43:40
               FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'
    
       Channel Information
                   BusStatus: 'N/A'
                  SilentMode: 0
             TransceiverName: 'N/A'
            TransceiverState: 'N/A'
           ReceiveErrorCount: 0
          TransmitErrorCount: 0
                    BusSpeed: 250000
                         SJW: []
                       TSEG1: []
                       TSEG2: []
                NumOfSamples: []
    
       Other Information
                    Database: []
                    UserData: []
    
    

    Информация о состоянии канала указывает 1 для MessagesReceived, и 0 для MessagesAvailable.

Распакуйте сообщение

После того, как ваш канал получает сообщение, задайте, как распаковать сообщение и интерпретировать данные в сообщении. Использование unpack задавать параметры для распаковки сообщения; они должны соответствовать параметрам, используемым для упаковки.

value = unpack(messagein,0,16,'LittleEndian','int16')
value =

  int16

   25

Обратитесь к unpack функция, чтобы понять больше о ее входных параметрах.

Сохраните и загрузите каналы CAN

Можно сохранить объект канала CAN в файл с помощью save функционируйте в любое время во время сеанса связи CAN.

Сохранить canch1 к файлу MATLAB mycanch.matВвод:

save mycanch.mat canch1

Если вы имеете сохраненный канал CAN в файле MATLAB, можно загрузить канал в MATLAB с помощью load функция. Например, чтобы перезагрузить канал от mycanch.mat который был создан ранее, введите:

load mycanch.mat

Загруженный объект канала CAN снова соединяется с заданным оборудованием и реконфигурировал себя к техническим требованиям, когда канал был сохранен.

Отключите каналы и вымойтесь

Отключите сконфигурированные каналы

Когда вы больше не должны будете связываться со своей шиной CAN, используйте stop функционируйте, чтобы отключить каналы CAN, которые вы сконфигурировали.

  1. Остановите первый канал.

    stop(canch1)
  2. Проверяйте состояние канала.

    canch1
    .
    .
    .
     Status Information
                     Running: 0
           MessagesAvailable: 1
            MessagesReceived: 0
         MessagesTransmitted: 1
  3. Остановите второй канал.

    stop(canch2)
  4. Проверяйте состояние канала.

    canch2
    .
    .
    .
     Status Information
                     Running: 0
           MessagesAvailable: 0
            MessagesReceived: 1
         MessagesTransmitted: 0

Очистите рабочее пространство MATLAB

Когда вы больше не нуждаетесь в этих объектах и переменных, удаляете их из рабочего пространства MATLAB с clear команда.

  1. Очистите каждый канал.

    clear canch1
    clear canch2
  2. Очистите сообщения CAN.

    clear messageout
    clear messagein
  3. Очистите распакованное значение.

    clear value

Связанные примеры

Больше о