创建自定义 CAN 模块
您可以创建自定义 Receive
和 Transmit
模块,以用于 Vehicle Network Toolbox™ 当前不支持的硬件。选择以下工作流之一。
使用 Simulink 总线的模块(推荐)- 使用 Simulink® 总线信号连接模块。使用 S-Function Builder 和 S-Function 模块创建函数和模块。
使用 CAN 报文数据类型的模块 - 使用 CAN 报文数据类型来共享信息。编写和编译自己的 C++ 代码以定义函数,并使用 MATLAB® 代码创建模块。
使用 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 模块进行交互。
在 MATLAB 工作区中为 CAN 或 CAN FD 创建一条 Simulink 报文总线。
canMessageBusType
或
canFDMessageBusType
这两个函数会在工作区中分别创建名为
CAN_MESSAGE_BUS
或CAN_FD_MESSAGE_BUS
的变量。稍后您将使用此变量来构建您的 S-Function。在 Simulink 中打开一个新空白模型,并从模块库中将一个 S-Function Builder (Simulink) 模块添加到模型中。
双击 S-Function Builder 模块以打开其对话框。您构建的第一个函数用于传输。
在对话框的设置中,定义一个函数名称并指定 Simulink 总线的用法。
S-function 名称:
CustomCANTransmit
数据属性:输入端口:总线:
On
,总线名称:CAN_MESSAGE_BUS
,如下图所示。对于 CAN FD,请将总线名称设置为
CAN_FD_MESSAGE_BUS
。
在函数和模块构建中,使用对话框中的其他选项卡定义与设备驱动程序交互的代码,并删除不必要的端口。
点击编译。代码文件放在 MATLAB 的当前工作文件夹中。
在模型中放置一个新 S-Function Builder 模块,并重复上述步骤以构建一个名为 CustomCANReceive 的 S-Function。除输入和输出端口外,其他选项均使用相同的设置。接收模块输出端口使用与传递函数输入端口相同的总线名称。
构建接收函数,并从模型中删除这两个 S-Function Builder 模块。现在,您可以将 S-Function Builder 生成的文件用作一组模板,以便您使用自己的工具进一步编辑和编译这些模板。您也可以使用 S-Function (Simulink) 模块来运行您的函数。
向模型中添加两个 S-Function 模块。打开每个模块,并设置其模型参数 S-Function 名称字段,以便 CustomCANTransmit 和 CustomCANReceive 都有对应的名称。
现在,您可以为每个模块创建一个封装,以允许访问针对您的硬件的参数。此示例不需要这些模块的封装。
在模型中添加其他必要的模块,包括:
设置模块参数和连接。
典型的模型类似于如下所示。此处 Constant (Simulink) 模块和 Display (Simulink) 模块允许验证连接和模型行为。
使用 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 中执行以下操作:
定义在编译 S-Function 时导入所需符号的
IMPORT_SCANUTIL
标识符:#define IMPORT_SCANUTIL
在 S-Function 顶部包含位于
中的matlabroot
\toolbox\vnt\vntblks\include\candatatypecan_datatype.h
标头:#include "can_datatype.h"
注意
can_datatype.h
包含的标头can_message.h
位于
中。有关matlabroot
\toolbox\shared\can\src\scanutil\CAN_MESSAGE
和CAN_DATATYPE
结构体的信息,请参阅can_message.h
文件。在编译时将 S-Function 链接到位于
文件夹中的matlabroot
\toolbox\vnt\vntblks\lib\ARCH
scanutil.lib
。共享库scanutil.dll
位于
中。matlabroot
\bin\ARCH
在
mdlInitializeSizes
(Simulink) 中调用此函数以初始化自定义 CAN 数据类型:mdlInitialize_CAN_datatype(S);
使用
ssGetDataTypeId
(Simulink) 获取自定义数据类型 ID:dataTypeID = ssGetDataTypeId(S,SL_CAN_MESSAGE_DTYPE_NAME);
执行以下操作之一:
要创建接收模块,请将输出端口数据类型设置为
CAN_MESSAGE
:ssSetOutputPortDataType(S,portID,dataTypeID);
要创建传输模块,请将输入端口类型设置为
CAN_MESSAGE
:ssSetInputPortDataType(S,portID,dataTypeID);
另请参阅
函数
相关主题
- C/C++ S-Function Basics (Simulink)
- Use a Bus with S-Function Builder to Create an S-Function (Simulink)