Создайте пользовательские блоки CAN

Можно создать пользовательские Receive и Transmit блоки для использования с оборудованием, в настоящее время не поддерживаемым Vehicle Network Toolbox™. Выберите один из следующих рабочих процессов.

Блоки, использующие шины Simulink

Чтобы создать пользовательские блоки для Vehicle Network Toolbox, которые используют шины Simulink CAN, можно использовать построитель S-функций. Полные инструкции по построению S-функций и блоков таким образом смотрите в Используйте сигнал шины с S-Function Builder для создания S-функции (Simulink). В следующем примере используются шаги, описанные в этой теме.

В этом примере показано, как создать два пользовательских блоков для передачи и приема сообщений CAN. Эти блоки используют шину сообщений Simulink для взаимодействия с блоками CAN Pack и CAN Unpack.

  1. Создайте шину сообщений Simulink в рабочем пространстве MATLAB для CAN или CAN FD.

    canMessageBusType

    или

    canFDMessageBusType

    Каждая из этих функций создает переменную в рабочей области с именем CAN_MESSAGE_BUS или CAN_FD_MESSAGE_BUS, соответственно. Эта переменная используется позже для создания S-функций.

  2. Откройте новую пустую модель в Simulink и добавьте к модели блок S-Function Builder (Simulink) из библиотеки блоков.

  3. Дважды кликните блок S-Function Builder, чтобы открыть его диалоговое окно. Первая функция, которую вы создаете, предназначена для передачи.

  4. Среди настроек в диалоговом окне задайте имя функции и укажите использование шины Simulink.

    • Имя S-функции: CustomCANTransmit

    • Свойства данных: Входные порты: Шина: On, Имя шины: CAN_MESSAGE_BUS, как показано на следующем рисунке.

      Port and parameter properties in the S-function builder block

      Для CAN FD установите имя шины равным CAN_FD_MESSAGE_BUS.

    В своей функции и создании блоков используйте другие вкладки в диалоговом окне, чтобы задать код для взаимодействия с драйвером устройства и удалить ненужные порты.

  5. Нажмите Build. Файлы кода помещаются в текущую рабочую папку MATLAB.

  6. Поместите новый блок S-Function Builder в модель и повторите шаги, чтобы создать S-функцию с именем CustomCANReceive. Используйте те же настройки, кроме входных и выходных портов. Выходной порт блока приема использует то же имя шины, что и входной параметр функции передачи.

  7. Создайте функцию приема и удалите оба блока S-Function Builder из вашей модели. На данной точке можно использовать файлы, сгенерированные S-Function Builder, как набор шаблонов, которые можно дополнительно отредактировать и скомпилировать собственными инструментами. Также можно использовать блоки S-Function (Simulink), чтобы запустить свои функции.

  8. Добавьте два блока S-Function к модели. Откройте каждый блок и установите его Параметры модели имя S-функции, поэтому у вас есть по одному CustomCANTransmit и CustomCANReceive.

    На данной точке можно создать маску для каждого блока, чтобы разрешить доступ к параметрам для вашего оборудования. Этот пример не нуждается в масках для этих блоков.

  9. Добавьте к своей модели другие необходимые блоки, включая:

  10. Установите параметры блоков и соединения.

    Типичная модель может выглядеть так. Здесь Constant (Simulink) блок и Display (Simulink) блок допускают верификацию соединений и поведение модели.

    Custom transmit and receive blocks in a model

Блоки, использующие типы данных сообщений CAN

Примечание

Для простоты проекта и использования преимуществ или нескольких функций Simulink рекомендуется по возможности использовать шины Simulink вместо типов данных CAN. Смотрите Блоки, использующие шины Simulink.

Чтобы создать свои собственные блоки для использования с другими блоками Vehicle Network Toolbox, можно использовать пользовательский тип данных CAN. Зарегистрируйте этот пользовательский тип данных CAN в функции C++ S.

Примечание

Вы должны использовать S-функцию типа файла C++ (.cpp) для создания пользовательских блоков, которые используют типы данных сообщений CAN. Использование S-функции типа C-файла (.c) может вызвать ошибки linker.

Чтобы зарегистрироваться и использовать пользовательский тип данных CAN, в вашей S-функции:

  1. Определите IMPORT_SCANUTIL идентификатор, который импортирует необходимые символы при компиляции S-функции:

    #define IMPORT_SCANUTIL
  2. Включите can_datatype.h заголовок, расположенный в matlabroot\ toolbox\vnt\vntblks\include\candatatype в верхней части S-функции:

    #include "can_datatype.h"

    Примечание

    Заголовок can_message.h включено в can_datatype.h расположен в matlabroot\ toolbox\shared\может\src\scanutil\. Смотрите can_message.h файл для получения информации о CAN_MESSAGE и CAN_DATATYPE структуры.

  3. Соедините свою S-функцию во время сборки с scanutil.lib расположен в matlabroot\ toolbox\vnt\vntblks\lib\ ARCH папка. Общая библиотека scanutil.dll, находится в matlabroot\ bin\ ARCH

  4. Вызовите эту функцию в mdlInitializeSizes (Simulink), чтобы инициализировать пользовательский тип данных CAN:

    mdlInitialize_CAN_datatype(S);
  5. Получите пользовательский идентификатор типа данных с помощью ssGetDataTypeId (Simulink):

    dataTypeID = ssGetDataTypeId(S,SL_CAN_MESSAGE_DTYPE_NAME);
  6. Выполните одно из следующих действий:

    • Чтобы создать блок приема, установите тип данных выходного порта равным CAN_MESSAGE:

      ssSetOutputPortDataType(S,portID,dataTypeID);
    • Чтобы создать блок передачи, установите порт входа равным CAN_MESSAGE:

      ssSetInputPortDataType(S,portID,dataTypeID);

См. также

Функции

Похожие темы