外部C/ c++代码之间的数据交换金宝app模型或生成的代码
是否将外部代码导入到Simulink中金宝app®模型(例如,通过使用遗留代码工具)或将生成的代码导出到外部环境,模型或生成的代码通常与您的代码交换数据(信号、状态和参数)。
C或c++代码中的函数,包括你的外部函数,可以通过以下方式与调用者或被调用函数交换数据:
函数的参数(形式形参)。当函数通过参数交换数据时,应用程序可以多次调用该函数。被调用函数的每个实例都可以操作自己的独立数据集,这样实例之间就不会相互干扰。
直接访问全局变量。全局变量可以:
允许不同算法(函数)和同一算法的实例共享校准参数和错误状态等数据。
使多任务系统的不同速率(功能)能够交换数据。
支持不同算法异步交换数据。
在Si金宝appmulink中,您可以组织和配置数据,以便模型使用这些交换机制来提供、提取数据,并与您的代码共享数据。
在尝试匹配数据接口之前,要选择整体集成方法,请参见选择外部代码集成工作流.
将外部代码导入模型
要在模型和外部函数之间交换数据,请基于您选择的集成函数的技术来选择交换机制。
要通过外部函数的参数交换数据,可以根据参数的数据类型构造和配置模型来创建和打包数据。然后,连接和配置调用或表示函数的块,以接受、产生或引用来自模型的数据。
例如,如果您使用遗留代码工具生成功能块调用你的函数,块的端口和参数对应函数的参数。将上行块的输出信号连接到输入端口,并在块掩码中设置参数值。然后,您可以从块的输出端口创建信号线,并将这些信号连接到下游块。
要通过外部代码已经定义的全局变量交换数据,最佳实践是使用Stateflow®图表来调用函数并访问变量。在图表中编写算法C代码,以便在模拟或执行生成的代码期间,模型对变量进行读写。
要在模型的其他地方使用这样一个全局变量作为参数数据(不是信号或状态数据)的项,您可以创建一个数值MATLAB®变量或
金宝app仿真软件。参数
对象,表示变量。如果您在两次模拟运行之间更改了C-code变量的值,则必须手动同步Simulink变量或对象的值。金宝app如果你的算法代码(函数)在模拟过程中改变了C-code变量的值,相应的Simulink变量或对象不会改变。金宝app如果您选择创建C-code变量的Simulink表示金宝app,您可以配置Simulink表示,以便生成的代码读取和写入变量,但不复制变量定义。将存储类应用到Simulink表示中。金宝app
外部功能整合技术 | 与模型交换数据的机制 | 示例和更多信息 |
---|---|---|
功能块 | 函数参数 |
要通过使用遗留代码工具创建的s函数调用函数,请参见用遗留代码工具将C函数集成到Simulink模型中金宝app(金宝app模型)。 |
Stateflow图表 | 函数参数和对全局变量的直接访问 |
要在状态流图中调用函数并访问全局变量,请参见在状态流图中访问自定义代码变量和函数(Stateflow)。有关在图表中创建数据项(可以将其作为参数传递给函数)的信息,请参见添加Stateflow数据(Stateflow)。 |
coder.ceval 在MATLAB函数块 |
函数参数 |
在a中调用函数MATLAB函数块用 |
导出生成的代码到外部环境
若要将生成的代码导出到外部代码中,请参见外部调用代码与生成代码之间的数据交换(金宝app仿真软件编码器)。
金宝appC数据类型和结构的表示
建模和重用自定义C数据,如结构、枚举和类型定义
别名,使用这些表中的信息。
外部C代码中数据匹配的建模模式
C数据类型或结构 | 示例C代码 | 金宝app等效模型 | 更多的信息 |
---|---|---|---|
基元类型别名( |
typedef mySinglePrec_T浮动; |
创建一个
生成使用别名数据类型的代码需要嵌入式Coder®. |
有关为模型定义自定义数据类型的信息,请参见 有关演示如何将生成的代码导出到外部代码的示例,请参见替换和重命名数据类型以符合编码标准. |
数组 |
int myArray [6]; |
请指定信号和参数尺寸信号的维度(金宝app模型)。 生成的代码将多维数据(包括矩阵)定义和访问为列为主的序列化向量。如果您的外部代码使用不同的格式,请考虑使用替代技术来集成生成的代码。看到矩阵和数组的代码生成. |
有关生成的代码如何存储非标量数据(包括限制)的信息,请参见矩阵和数组的代码生成(金宝app仿真软件编码器)。 有关演示如何将生成的代码导出到外部代码的示例,请参见在生成的代码中重用外部代码中的参数数据. 要建模查找表,请参见 |
枚举 |
typedef enum myColorsType{红= 0,黄,蓝}myColorsType; |
定义一个与枚举定义金宝app相对应的Simulink枚举。使用Simuli金宝appnk枚举来设置模型中的数据类型。 |
要在Simulink模型中使用枚举数据,请参见金宝app在Simulink模型中使用枚举数据金宝app(金宝app模型)。 有关显示如何生成枚举参数数据的示例,请参见枚举. 有关演示如何通过交换枚举数据将生成的代码导出到外部代码的示例,请参见在生成代码和外部代码之间交换结构化和枚举数据. |
结构 |
typedef struct myStructType {int count;双多项式系数;} myStructType; |
创建一个 若要创建结构化信号或状态数据,请将模型中的多条信号线打包为单个非虚拟总线信号。 要创建结构化参数数据,请创建一个参数对象(例如 若要将查找表数据打包到结构中,请使用 |
有关总线信号的信息,请参见巴士入门(金宝app模型)。有关参数结构的信息,请参见在结构中组织相关块参数定义(金宝app模型)。 有关展示如何通过使用遗留代码工具将外部代码导入模型的示例,请参见集成参数是指向结构指针的C函数(金宝app模型)。 有关展示如何将生成的代码导出到外部代码的示例,请参见在生成代码和外部代码之间交换结构化和枚举数据而且通过外部代码定义的指针访问结构化数据. 要将查找表数据打包到一个结构中, 有关在生成的代码中创建结构的一般信息,请参见在生成的代码中将数据组织成结构(金宝app仿真软件编码器)。 |
用于代码生成的其他建模模式(嵌入式编码器)
C数据类型或结构 | 示例C代码 | 金宝app等效模型 | 更多的信息 |
---|---|---|---|
宏 |
#定义myParam 9.8 |
应用存储类 这种技术需要嵌入式编码器。 |
|
存储类型限定符,例如常量 而且挥发性 |
const myParam = 9.8; |
应用存储类 |
使用关键字const和volatile保护全局数据(金宝app仿真软件编码器) |
位域 |
typedef结构myBitField {unsigned short int MODE: 1;unsigned short int FAIL: 1;无符号短int OK: 1;} myBitField |
这些技术需要嵌入式编码器。 |
|
调用读取或写入数据的自定义外部函数 |
外部代码: /*调用此函数获取信号的值。*/ double get_sising (void){返回mybigglobalstruct . sising;} 生成的算法代码: algorithmInput = get_inSig (); |
应用存储类 这种技术需要嵌入式编码器。 |
对其他建模目标的考虑
目标 | 注意事项和更多信息 |
---|---|
使用Si金宝appmulink运行生成的代码并与之交互 | 您可以使用SIL、PIL和外部模式模拟将您的模型连接到相应生成的应用程序进行模拟。当你从外部代码导入参数数据时:
有关SIL和PIL的信息,请参见选择SIL或PIL方法.有关外部模式模拟的信息,请参见外部模式模拟的主机-目标通信(金宝app仿真软件编码器)。 |
生成描述导出数据属性(包括物理单元、实际初始值和数据类型)的代码注释 | 生成这些注释可以帮助您在编写集成代码时匹配数据接口。看到在生成的代码中为变量添加自定义注释. |