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

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

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

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

    info = canHWInfo
    
    info =
    
    CAN Devices Detected
    
        Vendor    |             Device             | Channel | Serial Number |                    Constructor
      ----------- | ------------------------------ | ------- | ------------- | -------------------------------------------------
      MathWorks   | Virtual 1                      | 1       | 0             | canChannel('MathWorks','Virtual 1',1)
      MathWorks   | Virtual 1                      | 2       | 0             | canChannel('MathWorks','Virtual 1',2)
      Vector      | VN1610 1                       | 1       | 18959         | canChannel('Vector','VN1610 1',1)
      Vector      | VN1610 1                       | 2       | 18959         | canChannel('Vector','VN1610 1',2)
      Vector      | Virtual 1                      | 1       | 0             | canChannel('Vector','Virtual 1',1)
      Vector      | Virtual 1                      | 2       | 0             | canChannel('Vector','Virtual 1',2)
      PEAK-System | PCAN-USB Pro                   | 1       | 0             | canChannel('PEAK-System','PCAN_USBBUS1')
      PEAK-System | PCAN-USB Pro                   | 2       | 0             | canChannel('PEAK-System','PCAN_USBBUS2')
      Kvaser      | USBcan Professional 1          | 1       | 10680         | canChannel('Kvaser','USBcan Professional 1',1)
      Kvaser      | USBcan Professional 1          | 2       | 10680         | canChannel('Kvaser','USBcan Professional 1',2)
      Kvaser      | Virtual 1                      | 1       | 0             | canChannel('Kvaser','Virtual 1',1)
      Kvaser      | Virtual 1                      | 2       | 0             | canChannel('Kvaser','Virtual 1',2)
      NI          | 9862 CAN/HS (CAN1)             | 1       | 17F5094       | canChannel('NI','CAN1')
      NI          | 9862 CAN/HS (CAN2)             | 1       | 17F50B2       | canChannel('NI','CAN2')
    
  2. Сохраните информацию виртуального устройства MathWorks к переменной. Индексация указывает на поставщиков; таким образом от этого canHWInfo вывод, info.VendorInfo(1) соответствует MathWorks, info.VendorInfo(2) соответствует Vector и т.д.

    mwvirt = info.VendorInfo(1)
    
    mwvirt = 
    
      VendorInfo with properties:
    
                     VendorName: 'MathWorks'
        VendorDriverDescription: 'MathWorks Virtual CAN Driver'
            VendorDriverVersion: '1'
                    ChannelInfo: [1×2 can.mathworks.ChannelInfo]
    
    
  3. Получите детали о первом доступном виртуальном канале CAN на устройстве.

    mwvirt.ChannelInfo(1)
    
    ans = 
    
      ChannelInfo with properties:
    
                    Device: 'Virtual 1'
        DeviceChannelIndex: 1
        DeviceSerialNumber: 0
         ObjectConstructor: 'canChannel('MathWorks','Virtual 1',1)'
    
    

Примечание

Чтобы изменить этот пример для аппаратного устройства 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: 12-Jul-2017 17:04:48
           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: []

Заметьте, что состояние канала теперь обозначается как Online.

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

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

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

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

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

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

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

  • Данные 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: 12-Jul-2017 17:04:48
           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 значение MessagesTransmitted постепенно увеличивается к 1 каждому разу, когда вы передаете сообщение. Сообщение, которое будет получено, доступно всем устройствам на шине, таким образом, это собирается здесь даже для канала передачи.

Обратитесь к функции 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: 12-Jul-2017 17:04:48
               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.1101
                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: 12-Jul-2017 17:04:48
               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

Похожие темы