В примере вы обнаруживаете свои системные устройства CAN с canChannelList, затем создайте два канала CAN с помощью canChannel. Позже, вы редактируете свойства первого канала и создаете сообщение с помощью canMessage, затем передайте сообщение от первого канала с помощью transmit, и получите его на другом канале с помощью receive.
Получите информацию об аппаратных устройствах 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, установите петлевую связь между двумя каналами.
Создайте два 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: 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 функция, чтобы понять больше о ее входных параметрах.
После того, как вы создаете сообщение, упаковываете его необходимыми данными.
Используйте 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.
Чтобы видеть сообщения, доступные, чтобы быть полученными на этом канале, введите:
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.
Получите одно сообщение на 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 функция, чтобы понять больше о ее входных параметрах.
Чтобы проверять, получил ли канал сообщение, просмотрите отображение канала.
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 в файл с помощью 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