Vehicle Network Toolbox™ позволяет вам использовать базу данных Vector CAN. База данных .dbc
файл содержит определения сообщений CAN и сигналов. Используя информацию, заданную в файле базы данных, можно искать сообщение и предупредить об информации и создать сообщения. Можно также представлять сообщение и предупредить об информации в технических модулях так, чтобы вы не должны были управлять байтами необработанных данных.
Чтобы использовать файл базы данных CAN, загрузите базу данных в свой сеанс MATLAB®. В командной строке MATLAB введите:
db = canDatabase('filename.dbc')
Здесь db
переменная, которую вы выбрали для своего указателя базы данных и filename.dbc
фактическое имя файла вашей базы данных CAN. Если ваша база данных CAN не находится в текущей рабочей директории, введите путь к базе данных:
db = canDatabase('path\filename.dbc')
Имена файлов базы данных CAN, содержащие неалфавитно-цифровые символы, такие как знаки "равно", амперсанды, и т.д несовместимы с Vehicle Network Toolbox. Можно использовать периоды на имя базы данных. Переименуйте любые файлы базы данных CAN с неалфавитно-цифровыми символами, прежде чем вы будете использовать их.
Эта команда возвращает объект базы данных, который можно использовать, чтобы создать и интерпретировать сообщения CAN с помощью информации, хранившей в базе данных. Обратитесь к canDatabase
функция для получения дополнительной информации.
Этот пример показывает вам, как создать сообщение с помощью базы данных, созданной специально для этого примера. Можно получить доступ к этой базе данных в подпапке Toolbox> VNT> VNTDemos в папке установки MATLAB. Эта база данных имеет сообщение, EngineMsg
. Чтобы попробовать этот пример, создайте сообщения и сигналы с помощью определений в собственной базе данных.
Создайте объект базы данных CAN.
cd ([matlabroot '\examples\vnt']) d = canDatabase('demoVNT_CANdbFiles.dbc');
Создайте сообщение CAN с помощью имени сообщения в базе данных.
message = canMessage(d,'EngineMsg');
Можно получить доступ к двум сигналам, заданным для сообщения, которое вы создали в базе данных в качестве примера, message
. Можно также изменить значения для некоторых сигналов.
Чтобы отобразить сигналы в вашем сообщении, введите:
sig = message.Signals
sig = struct with fields: VehicleSpeed: 0 EngineRPM: 250
Измените значение EngineRPM
сигнал:
message.Signals.EngineRPM = 300;
Повторно присвойте сигналы и отобразите их снова, чтобы видеть изменение.
sig = message.Signals
sig = struct with fields: VehicleSpeed: 0 EngineRPM: 300
Добавить базу данных в канал CAN canch
Ввод:
canch.Database = canDatabase('Mux.dbc')
Для получения дополнительной информации смотрите Database
свойство.
Когда вы вносите изменения в файл базы данных:
Перезагрузите файл базы данных в свой сеанс работы с MATLAB с помощью canDatabase
функция.
Повторно прикрепите базу данных к сообщениям с помощью attachDatabase
функция.
Этот пример показывает вам, как создать, получить и обработать сообщения с помощью информации, хранившей в файлах базы данных CAN. Этот пример использует файл базы данных CAN, demoVNT_CANdbFiles.dbc
.
Откройте файл базы данных
Откройте файл базы данных и исследуйте Messages
свойство видеть имена всего сообщения, заданного в этой базе данных.
db = canDatabase('demoVNT_CANdbFiles.dbc')
db.Messages
db = Database with properties: Name: 'demoVNT_CANdbFiles' Path: '/tmp/BR2019bd_1170825_64229/publish_examples1/tp48a35494/ex80654288/demoVNT_CANdbFiles.dbc' Nodes: {} NodeInfo: [0x0 struct] Messages: {5x1 cell} MessageInfo: [5x1 struct] Attributes: {} AttributeInfo: [0x0 struct] UserData: [] ans = 5x1 cell array {'DoorControlMsg' } {'EngineMsg' } {'SunroofControlMsg'} {'TransmissionMsg' } {'WindowControlMsg' }
Просмотрите информацию о сообщении
Используйте messageInfo
просмотреть информацию о сообщении, включая идентификатор, длину данных и список сигнала.
messageInfo(db, 'EngineMsg')
ans = struct with fields: Name: 'EngineMsg' ProtocolMode: 'CAN' Comment: '' ID: 100 Extended: 0 J1939: [] Length: 8 DLC: 8 BRS: 0 Signals: {2x1 cell} SignalInfo: [2x1 struct] TxNodes: {0x1 cell} Attributes: {} AttributeInfo: [0x0 struct]
Можно также запросить для получения информации обо всех сообщениях целиком.
messageInfo(db)
ans = 5x1 struct array with fields: Name ProtocolMode Comment ID Extended J1939 Length DLC BRS Signals SignalInfo TxNodes Attributes AttributeInfo
Просмотрите информацию сигнала
Используйте signalInfo
просмотреть информацию об определении сигнала, включая тип, порядок байтов, размер и масштабирующиеся значения, которые переводят необработанные сигналы в физические значения.
signalInfo(db, 'EngineMsg', 'EngineRPM')
ans = struct with fields: Name: 'EngineRPM' Comment: '' StartBit: 0 SignalSize: 32 ByteOrder: 'LittleEndian' Signed: 0 ValueType: 'Integer' Class: 'uint32' Factor: 0.1000 Offset: 250 Minimum: 250 Maximum: 9500 Units: 'rpm' ValueTable: [0x1 struct] Multiplexor: 0 Multiplexed: 0 MultiplexMode: 0 RxNodes: {0x1 cell} Attributes: {} AttributeInfo: [0x0 struct]
Можно также запросить для получения информации обо всех сигналах в сообщении целиком.
signalInfo(db, 'EngineMsg')
ans = 2x1 struct array with fields: Name Comment StartBit SignalSize ByteOrder Signed ValueType Class Factor Offset Minimum Maximum Units ValueTable Multiplexor Multiplexed MultiplexMode RxNodes Attributes AttributeInfo
Создайте сообщение Используя определения базы данных
Задайте имя сообщения, когда вы создадите новое сообщение, чтобы применить определение базы данных. Сигналы CAN в этом обмениваются сообщениями, представлены в технических модулях в дополнение к байтам необработанных данных.
msgEngineInfo = canMessage(db, 'EngineMsg')
msgEngineInfo = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: 'EngineMsg' Data Details Timestamp: 0 Data: [0 0 0 0 0 0 0 0] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 can.Database] UserData: []
Просмотрите информацию сигнала
Используйте Signals
свойство видеть значения сигналов для этого сообщения. Можно непосредственно записать в и читать из этих сигналов упаковать или распаковать данные из сообщения.
msgEngineInfo.Signals
ans = struct with fields: VehicleSpeed: 0 EngineRPM: 250
Измените информацию сигнала
Запишите непосредственно в сигнал изменить значение и считать его текущее значение назад.
msgEngineInfo.Signals.EngineRPM = 5500.25 msgEngineInfo.Signals
msgEngineInfo = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: 'EngineMsg' Data Details Timestamp: 0 Data: [23 205 0 0 0 0 0 0] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 can.Database] UserData: [] ans = struct with fields: VehicleSpeed: 0 EngineRPM: 5.5003e+03
Когда вы пишете непосредственно в сигнал, значение переводится, масштабируется и упаковывается в данные о сообщении с помощью определения базы данных.
msgEngineInfo.Signals.VehicleSpeed = 70.81 msgEngineInfo.Signals
msgEngineInfo = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: 'EngineMsg' Data Details Timestamp: 0 Data: [23 205 0 0 71 0 0 0] Signals: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 can.Database] UserData: [] ans = struct with fields: VehicleSpeed: 71 EngineRPM: 5.5003e+03
Получите сообщения с информацией о базе данных
Присоедините базу данных к каналу CAN, который получает сообщения, чтобы применить определения базы данных входящим сообщениям автоматически. База данных декодирует только сообщения, которые заданы. Все другие сообщения получены в их необработанной форме.
rxCh = canChannel('MathWorks', 'Virtual 1', 2); rxCh.Database = db
rxCh = 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: [0x0 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: [1x1 can.Database] UserData: []
Получите сообщения
Запустите канал, генерируйте некоторый трафик сообщения и получите сообщения с физическим декодированием сообщений.
start(rxCh); generateMsgsDb(); rxMsg = receive(rxCh, Inf, 'OutputFormat', 'timetable'); rxMsg(1:15, :)
ans = 15x8 timetable Time ID Extended Name Data Length Signals Error Remote _____________ ___ ________ _____________________ ___________ ______ ____________ _____ ______ 0.0022697 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.0022759 sec 200 false {'TransmissionMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.0022788 sec 400 false {'DoorControlMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.0022816 sec 600 false {'WindowControlMsg' } {1x4 uint8} 4 {1x1 struct} false false 0.0022824 sec 800 false {'SunroofControlMsg'} {1x2 uint8} 2 {1x1 struct} false false 0.027271 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.052268 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.052269 sec 200 false {'TransmissionMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.077274 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.10227 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.10227 sec 200 false {'TransmissionMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.12727 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.12727 sec 400 false {'DoorControlMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.15228 sec 100 false {'EngineMsg' } {1x8 uint8} 8 {1x1 struct} false false 0.15228 sec 200 false {'TransmissionMsg' } {1x8 uint8} 8 {1x1 struct} false false
Остановите канал и очистите его от рабочей области.
stop(rxCh);
clear rxCh
Исследуйте полученное сообщение
Смотрите полученное сообщение, чтобы видеть, что прикладная база данных декодирует.
rxMsg(10, :) rxMsg.Signals{10}
ans = 1x8 timetable Time ID Extended Name Data Length Signals Error Remote ___________ ___ ________ _____________ ___________ ______ ____________ _____ ______ 0.10227 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false ans = struct with fields: VehicleSpeed: 50 EngineRPM: 3.5696e+03
Извлеките все экземпляры заданного сообщения
Используйте обозначение MATLAB, чтобы извлечь все экземпляры заданного сообщения по наименованию.
allMsgEngine = rxMsg(strcmpi('EngineMsg', rxMsg.Name), :);
allMsgEngine(1:15, :)
ans = 15x8 timetable Time ID Extended Name Data Length Signals Error Remote _____________ ___ ________ _____________ ___________ ______ ____________ _____ ______ 0.0022697 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.027271 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.052268 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.077274 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.10227 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.12727 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.15228 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.17727 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.20227 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.22727 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.25229 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.27728 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.30227 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.32731 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false 0.35228 sec 100 false {'EngineMsg'} {1x8 uint8} 8 {1x1 struct} false false
Постройте значения физического сигнала
Постройте значения декодируемых сигналов базы данных в зависимости от времени. Сошлитесь на метки времени сообщения и значения сигналов в переменных.
signalTimetable = canSignalTimetable(rxMsg, 'EngineMsg'); signalTimetable(1:15, :) plot(signalTimetable.Time, signalTimetable.VehicleSpeed) title('Vehicle Speed from EngineMsg', 'FontWeight', 'bold') xlabel('Timestamp') ylabel('Vehicle Speed')
ans = 15x2 timetable Time VehicleSpeed EngineRPM _____________ ____________ _________ 0.0022697 sec 0 250 0.027271 sec 0 250 0.052268 sec 50 3569.6 0.077274 sec 50 3569.6 0.10227 sec 50 3569.6 0.12727 sec 50 3569.6 0.15228 sec 55 3621.3 0.17727 sec 55 3621.3 0.20227 sec 55 3621.3 0.22727 sec 55 3621.3 0.25229 sec 55 3621.3 0.27728 sec 55 3663.9 0.30227 sec 55 3663.9 0.32731 sec 55 3663.9 0.35228 sec 55 3663.9