В примере вы обнаруживаете свои системные устройства CAN с canHWInfo
, затем создаете два канала CAN с помощью canChannel
. Позже, вы редактируете свойства первого канала и создаете сообщение с помощью canMessage
, затем передаете сообщение от первого канала с помощью transmit
и получаете его на другом канале с помощью receive
.
Получите информацию об аппаратных устройствах 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')
Сохраните информацию виртуального устройства 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]
Получите детали о первом доступном виртуальном канале CAN на устройстве.
mwvirt.ChannelInfo(1)
ans = ChannelInfo with properties: Device: 'Virtual 1' DeviceChannelIndex: 1 DeviceSerialNumber: 0 ObjectConstructor: 'canChannel('MathWorks','Virtual 1',1)'
Чтобы изменить этот пример для аппаратного устройства 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
.
Сконфигурируйте значения свойств, прежде чем вы запустите канал.
Измените скорость шины обоих каналов к 250000
, затем просмотрите свойство BusSpeed
канала проверить установку.
configBusSpeed(canch1,250000) canch1.BusSpeed
ans = 250000
Можно также видеть обновленную скорость шины в отображении канала.
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: []
Похожим способом измените скорость шины второго канала.
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
, чтобы понять больше о ее входных параметрах.
После того, как вы создаете сообщение, упаковываете его необходимыми данными.
Используйте функцию 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
.
Чтобы видеть сообщения, доступные, чтобы быть полученными на этом канале, введите:
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
.
Получите одно сообщение на 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
, чтобы понять больше о ее входных параметрах.
Чтобы проверять, получил ли канал сообщение, просмотрите отображение канала.
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 в файл с помощью функции save
в любое время во время сеанса связи CAN.
Чтобы сохранить canch1
в файл MATLAB mycanch.mat
, введите:
save mycanch.mat canch1
Если вы имеете сохраненный канал CAN в файле MATLAB, можно загрузить канал в MATLAB с помощью функции load
. Например, чтобы перезагрузить канал от mycanch.mat
, который был создан ранее, введите:
load mycanch.mat
Загруженный объект канала CAN снова соединяется с заданным оборудованием и реконфигурировал себя к спецификациям, когда канал был сохранен.
Когда вы больше не должны связываться со своей шиной CAN, используйте функцию stop
, чтобы отключить каналы CAN, которые вы сконфигурировали.
Остановите первый канал.
stop(canch1)
Проверяйте состояние канала.
canch1
. . . Status Information Running: 0 MessagesAvailable: 1 MessagesReceived: 0 MessagesTransmitted: 1
Остановите второй канал.
stop(canch2)
Проверяйте состояние канала.
canch2
. . . Status Information Running: 0 MessagesAvailable: 0 MessagesReceived: 1 MessagesTransmitted: 0
Когда вы больше не нуждаетесь в этих объектах и переменных, удаляете их из рабочего пространства MATLAB с командой clear
.
Очистите каждый канал.
clear canch1 clear canch2
Очистите сообщения CAN.
clear messageout clear messagein
Очистите распакованное значение.
clear value