Main Content

创建自定义 CAN 模块

您可以创建自定义 ReceiveTransmit 模块,以用于 Vehicle Network Toolbox™ 当前不支持的硬件。选择以下工作流之一。

使用 Simulink 总线的模块

要为使用 Simulink CAN 总线的 Vehicle Network Toolbox 创建自定义模块,您可以使用 S-Function Builder。有关以这种方式构建 S-Function 和模块的完整说明,请参阅Use a Bus with S-Function Builder to Create an S-Function (Simulink)。以下示例使用的是该主题中概述的步骤。

以下示例说明如何构建两个自定义模块以用于传输和接收 CAN 报文。这些模块使用 Simulink 报文总线与 CAN Pack 和 CAN Unpack 模块进行交互。

  1. 在 MATLAB 工作区中为 CAN 或 CAN FD 创建一条 Simulink 报文总线。

    canMessageBusType

    canFDMessageBusType

    这两个函数会在工作区中分别创建名为 CAN_MESSAGE_BUSCAN_FD_MESSAGE_BUS 的变量。稍后您将使用此变量来构建您的 S-Function。

  2. 在 Simulink 中打开一个新空白模型,并从模块库中将一个 S-Function Builder (Simulink) 模块添加到模型中。

  3. 双击 S-Function Builder 模块以打开其对话框。您构建的第一个函数用于传输。

  4. 在对话框的设置中,定义一个函数名称并指定 Simulink 总线的用法。

    • S-function 名称:CustomCANTransmit

    • 数据属性:输入端口:总线:On,总线名称:CAN_MESSAGE_BUS,如下图所示。

      Port and parameter properties in the S-function builder block

      对于 CAN FD,请将总线名称设置为 CAN_FD_MESSAGE_BUS

    在函数和模块构建中,使用对话框中的其他选项卡定义与设备驱动程序交互的代码,并删除不必要的端口。

  5. 点击编译。代码文件放在 MATLAB 的当前工作文件夹中。

  6. 在模型中放置一个新 S-Function Builder 模块,并重复上述步骤以构建一个名为 CustomCANReceive 的 S-Function。除输入和输出端口外,其他选项均使用相同的设置。接收模块输出端口使用与传递函数输入端口相同的总线名称。

  7. 构建接收函数,并从模型中删除这两个 S-Function Builder 模块。现在,您可以将 S-Function Builder 生成的文件用作一组模板,以便您使用自己的工具进一步编辑和编译这些模板。您也可以使用 S-Function (Simulink) 模块来运行您的函数。

  8. 向模型中添加两个 S-Function 模块。打开每个模块,并设置其模型参数 S-Function 名称字段,以便 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 数据类型。在 C++ S-Function 中注册此自定义 CAN 数据类型。

注意

您必须使用 C++ 文件类型 S-Function (.cpp) 来创建使用 CAN 报文数据类型的自定义模块。使用 C 文件类型 S-Function (.c) 可能会导致链接器错误。

要注册和使用自定义 CAN 数据类型,请在 S-Function 中执行以下操作:

  1. 定义在编译 S-Function 时导入所需符号的 IMPORT_SCANUTIL 标识符:

    #define IMPORT_SCANUTIL
  2. 在 S-Function 顶部包含位于 matlabroot\toolbox\vnt\vntblks\include\candatatype 中的 can_datatype.h 标头:

    #include "can_datatype.h"

    注意

    can_datatype.h 包含的标头 can_message.h 位于 matlabroot\toolbox\shared\can\src\scanutil\ 中。有关 CAN_MESSAGECAN_DATATYPE 结构体的信息,请参阅 can_message.h 文件。

  3. 在编译时将 S-Function 链接到位于 matlabroot\toolbox\vnt\vntblks\lib\ARCH 文件夹中的 scanutil.lib。共享库 scanutil.dll 位于 matlabroot\bin\ARCH 中。

  4. mdlInitializeSizes (Simulink) 中调用此函数以初始化自定义 CAN 数据类型:

    mdlInitialize_CAN_datatype(S);
  5. 使用 ssGetDataTypeId (Simulink) 获取自定义数据类型 ID:

    dataTypeID = ssGetDataTypeId(S,SL_CAN_MESSAGE_DTYPE_NAME);
  6. 执行以下操作之一:

    • 要创建接收模块,请将输出端口数据类型设置为 CAN_MESSAGE

      ssSetOutputPortDataType(S,portID,dataTypeID);
    • 要创建传输模块,请将输入端口类型设置为 CAN_MESSAGE

      ssSetInputPortDataType(S,portID,dataTypeID);

另请参阅

函数

相关主题