Передача и прием сообщений 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 функция, чтобы упаковать ваше сообщение с этими входными параметрами: a 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® отображает обновленный канал. В разделе «Информация о состоянии» 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

Похожие примеры

Подробнее о