exponenta event banner

Передача и получение сообщений 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

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

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 на 250000 с помощью 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: []

Обратите внимание, что значение свойства Running канала теперь 1 Правда.

Создание сообщения

После установки всех требуемых значений свойств и запуска каналов, вы будете готовы передавать и принимать сообщения на шине 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 - указанный идентификатор.

  • Extended - Логический 0 (false), так как не указан расширенный идентификатор.

  • Data - массив uint8 из 0 с размером, заданным длиной данных.

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

Упаковать сообщение

После создания сообщения упакуйте его с требуемыми данными.

  1. Используйте pack функция для упаковки сообщения со следующими входными параметрами: Data значение 25, начальный бит 0, размер сигнала 16 и порядок байтов с использованием формата little-endian. Просмотр сообщения 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

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

Подробнее