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