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