Можно создать пользовательские Receive
и Transmit
блоки для использования с оборудованием, в настоящее время не поддерживаемым Vehicle Network Toolbox™. Выберите один из следующих рабочих процессов.
Блоки, использующие шины Simulink (рекомендуемые) - Используйте Simulink® шинные сигналы для соединения блоков. Создайте функции и блоки с блоками S-Function Builder и S-Function.
Блоки с использованием типов данных сообщений CAN - Используйте типы данных сообщений CAN для обмена информацией. Напишите и скомпилируйте свой собственный код С++, чтобы задать функции, и MATLAB® код для создания блоков.
Чтобы создать пользовательские блоки для Vehicle Network Toolbox, которые используют шины Simulink CAN, можно использовать построитель S-функций. Полные инструкции по построению S-функций и блоков таким образом смотрите в Используйте сигнал шины с S-Function Builder для создания S-функции (Simulink). В следующем примере используются шаги, описанные в этой теме.
В этом примере показано, как создать два пользовательских блоков для передачи и приема сообщений CAN. Эти блоки используют шину сообщений Simulink для взаимодействия с блоками CAN Pack и CAN Unpack.
Создайте шину сообщений Simulink в рабочем пространстве MATLAB для CAN или CAN FD.
canMessageBusType
или
canFDMessageBusType
Каждая из этих функций создает переменную в рабочей области с именем CAN_MESSAGE_BUS
или CAN_FD_MESSAGE_BUS
, соответственно. Эта переменная используется позже для создания S-функций.
Откройте новую пустую модель в Simulink и добавьте к модели блок S-Function Builder (Simulink) из библиотеки блоков.
Дважды кликните блок S-Function Builder, чтобы открыть его диалоговое окно. Первая функция, которую вы создаете, предназначена для передачи.
Среди настроек в диалоговом окне задайте имя функции и укажите использование шины Simulink.
Имя S-функции: CustomCANTransmit
Свойства данных: Входные порты: Шина: On
, Имя шины: CAN_MESSAGE_BUS
, как показано на следующем рисунке.
Для CAN FD установите имя шины равным CAN_FD_MESSAGE_BUS
.
В своей функции и создании блоков используйте другие вкладки в диалоговом окне, чтобы задать код для взаимодействия с драйвером устройства и удалить ненужные порты.
Нажмите Build. Файлы кода помещаются в текущую рабочую папку MATLAB.
Поместите новый блок S-Function Builder в модель и повторите шаги, чтобы создать S-функцию с именем CustomCANReceive. Используйте те же настройки, кроме входных и выходных портов. Выходной порт блока приема использует то же имя шины, что и входной параметр функции передачи.
Создайте функцию приема и удалите оба блока S-Function Builder из вашей модели. На данной точке можно использовать файлы, сгенерированные S-Function Builder, как набор шаблонов, которые можно дополнительно отредактировать и скомпилировать собственными инструментами. Также можно использовать блоки S-Function (Simulink), чтобы запустить свои функции.
Добавьте два блока S-Function к модели. Откройте каждый блок и установите его Параметры модели имя S-функции, поэтому у вас есть по одному CustomCANTransmit и CustomCANReceive.
На данной точке можно создать маску для каждого блока, чтобы разрешить доступ к параметрам для вашего оборудования. Этот пример не нуждается в масках для этих блоков.
Добавьте к своей модели другие необходимые блоки, включая:
Установите параметры блоков и соединения.
Типичная модель может выглядеть так. Здесь Constant (Simulink) блок и Display (Simulink) блок допускают верификацию соединений и поведение модели.
Примечание
Для простоты проекта и использования преимуществ или нескольких функций Simulink рекомендуется по возможности использовать шины Simulink вместо типов данных CAN. Смотрите Блоки, использующие шины Simulink.
Чтобы создать свои собственные блоки для использования с другими блоками Vehicle Network Toolbox, можно использовать пользовательский тип данных CAN. Зарегистрируйте этот пользовательский тип данных CAN в функции C++ S.
Примечание
Вы должны использовать S-функцию типа файла C++ (.cpp
) для создания пользовательских блоков, которые используют типы данных сообщений CAN. Использование S-функции типа C-файла (.c
) может вызвать ошибки linker.
Чтобы зарегистрироваться и использовать пользовательский тип данных CAN, в вашей S-функции:
Определите IMPORT_SCANUTIL
идентификатор, который импортирует необходимые символы при компиляции S-функции:
#define IMPORT_SCANUTIL
Включите can_datatype.h
заголовок, расположенный в
в верхней части S-функции:matlabroot
\ toolbox\vnt\vntblks\include\candatatype
#include "can_datatype.h"
Примечание
Заголовок can_message.h
включено в can_datatype.h
расположен в
. Смотрите matlabroot
\ toolbox\shared\может\src\scanutil\can_message.h
файл для получения информации о CAN_MESSAGE
и CAN_DATATYPE
структуры.
Соедините свою S-функцию во время сборки с scanutil.lib
расположен в
папка. Общая библиотека matlabroot
\ toolbox\vnt\vntblks\lib\ ARCH
scanutil.dll
, находится в matlabroot
\ bin\ ARCH
Вызовите эту функцию в mdlInitializeSizes
(Simulink), чтобы инициализировать пользовательский тип данных CAN:
mdlInitialize_CAN_datatype(S);
Получите пользовательский идентификатор типа данных с помощью ssGetDataTypeId
(Simulink):
dataTypeID = ssGetDataTypeId(S,SL_CAN_MESSAGE_DTYPE_NAME);
Выполните одно из следующих действий:
Чтобы создать блок приема, установите тип данных выходного порта равным CAN_MESSAGE
:
ssSetOutputPortDataType(S,portID,dataTypeID);
Чтобы создать блок передачи, установите порт входа равным CAN_MESSAGE
:
ssSetInputPortDataType(S,portID,dataTypeID);