Simulink.importExternalCTypes
生成由 C 或 C++ 代码定义的自定义数据类型的 Simulink 表示
语法
说明
解析由 importInfo = Simulink.importExternalCTypes(headerFiles)typedef、struct 和 enum 类型定义的 headerFiles 标识的 C 或 C++ 头文件(.h 或 .hpp),并生成类型的 Simulink® 表示。输出 importInfo 标识已成功和未成功导入的类型。
您可以使用 Simulink 表示实现以下目的:
重用现有算法 C 代码,并通过仿真测试它与 Simulink 控制算法的交互。有关说明如何使用代码继承工具的示例,请参阅Integrate C Function Whose Arguments Are Pointers to Structures。
生成重用您的现有代码定义的类型和数据的代码 (Simulink Coder™)。然后,您可以将生成的和现有的代码进行集成并编译到一个单独的应用程序中。有关示例,请参阅Exchange Structured and Enumerated Data Between Generated and External Code (Embedded Coder)。
通过使用您的组织在 C 代码中定义的标准数据类型,在模型中创建和组织数据(信号、参数和状态)。
要在 Simulink 中创建信号的结构体,请使用非虚拟总线。请参阅将信号或消息组合到虚拟总线中。
要创建参数的结构体,请使用 MATLAB® 结构体和
Simulink.Parameter对象。请参阅在结构体中组织相关的模块参数定义。要创建枚举数据,请参阅在 Simulink 模型中使用枚举数据。
要匹配原始
typedef语句,请使用Simulink.AliasType对象在模型中设置参数和信号数据类型。
默认情况下,该函数:
通过生成从
Simulink.IntEnumType派生枚举类的脚本文件来导入枚举类型,如定义 Simulink 枚举中所述。然后,如有必要,可以编辑类定义进行自定义(例如,通过实现addClassNameToEnumNames方法)。通过在基础工作区中生成
Simulink.Bus对象来导入结构体类型。通过在基础工作区中生成
Simulink.AliasType对象来导入原始typedef语句。根据主机的字长解释泛型 C 数据类型,如
int或short。例如,对于大多数现代计算机,int具有 32 位字长,因此函数将int结构体字段表示为使用 Simulink 数据类型int32的总线元素。要覆盖此默认行为,请使用
HardwareImplementation对组参量标识目标硬件板。
有关默认行为的详细信息,请参阅提示。
通过分析您用 importInfo = Simulink.importExternalCTypes(modelName)modelName 标识的模型,生成自定义 C 数据类型的 Simulink 表示。当您在模型中使用仿真目标配置参数来标识要包含在仿真中的头文件时,请使用此语法导入类型,以便在主机上对模型进行仿真。函数根据主机的字长解释泛型 C 数据类型。
使用此语法时,请勿使用可能与目标模型的配置参数冲突的对组参量,如 HardwareImplementation。当您将此类对组参量与此语法结合使用时,函数会生成警告。
使用一个或多个名称-值对组参量指定其他选项。您可以使用此语法实现以下目的:importInfo = Simulink.importExternalCTypes(___,Name,Value)
使用
Names对组参量指定要导入的类型的名称。控制 Simulink 存储导入的类型的方式,例如,通过在 Simulink 数据字典中生成类型。使用
MATFile和DataDictionary对组参量。控制函数解释泛型 C 数据类型的方式。使用
HardwareImplementation对组参量。通过尝试再次导入更新后的 C 代码定义,保持 C 代码定义与 Simulink 表示之间的同步。您可以选择是否覆盖现有 Simulink 表示。使用
Overwrite和Verbose对组参量。
示例
输入参数
名称-值参数
输出参量
限制
该函数不支持:
在 Simulink 支持的类型中没有对应类型的 C 数据类型。例如,Simulink 不能识别
long double的等效类型。有关 Simulink 支持的数据类型的信息,请参阅 Simulink 支持的数据类型。指针类型,例如字段值为指针的结构体,或基类型为指针类型的
typedef语句。并集。
如果某结构体字段表示定点数据,或者某
typedef语句映射到一个定点基类型,则函数会将对应总线元素或Simulink.AliasType对象的数据类型设置为相关 Simulink 整数类型(例如int16)。导入程序不能通过解析 C 代码来确定定点定标。使用该函数后,必须使用fixdt函数手动指定总线元素的数据类型或Simulink.AliasType对象的基类型。
提示
在以下情况下,您必须为您的模型配置仿真目标配置参数,以包含 (
#include) 定义导入的枚举或结构体类型的头文件:您在 MATLAB Function 模块中使用该类型。请参阅控制导入的总线和枚举类型定义。
您在 Stateflow® 图中使用该类型。请参阅访问 Stateflow 图中的自定义代码变量和函数 (Stateflow)和在 Stateflow 图中集成自定义结构体 (Stateflow)。
您在 C Function 或 C Caller 模块中使用该类型。
该类型不是使用
typedef语句声明的。
注意
要导入未在
typedef语句中命名的类型,请确保仿真目标配置参数导入自定义代码处于选中状态。默认情况下,此参数处于选中状态。默认情况下:
对于导入的枚举,由于 Simulink 枚举类派生自
Simulink.IntEnumType,因此当您从模型中进行仿真或生成代码时,枚举将使用目标硬件的本机整数大小。您可以使用模型配置参数(如生产设备供应商和类型和生产硬件中的原生字长)指定目标硬件的特性。对于导入的结构体类型:
仅当某结构体字段使用一个对应的 Simulink Coder 结构体类型作为数据类型时,函数才会将该字段作为复数导入。例如,如果外部代码中的某结构体字段使用数据类型
cint8_T,则函数将该字段导入为总线元素(Simulink.BusElement对象),该总线元素的数据类型为int8且其Complexity属性设置为'complex'。对于嵌套的结构体,该函数为每个唯一结构体类型生成一个总线对象。
对于导入的结构体或枚举类型,如果外部代码使用
typedef语句来命名该类型,则生成的总线对象或 Simulink 枚举类的名称与typedef名称匹配。如果您的代码不使用typedef语句来命名该类型,则对象或类的名称就是该类型的标记名称,除非该名称与头文件中其他位置的typedef语句中定义的类型名称冲突,在这种情况下,该类型不会导入 Simulink 中。如果您未指定标记名称或应用了typedef的名称,则 Simulink 会为该对象或类生成任意名称。函数会对生成的 Simulink 表示进行配置,指明它们是从外部导入的,以进行仿真和代码生成。例如,对于总线对象,该函数会将
DataScope属性设置为'Imported',将HeaderFile属性设置为外部头文件的名称。要从使用这些 Simulink 表示之一的模型进行仿真或生成代码,必须使头文件对该模型可用。
当您为
Simulink.importExternalCTypes指定要使用或生成的文件(例如,通过使用DataDictionary对组参量)时:如果要使用的现有文件位于当前文件夹或 MATLAB 路径中,则不需要指定文件路径。您可以自行指定文件名。
要控制生成的文件的文件夹位置,您可以指定路径以及文件名。您也可以使用
OutputDir对组参量。