是否将外部代码导入Simulink金宝app®模型(例如,通过使用遗留代码工具)或将生成的代码导出到外部环境,模型或生成的代码通常与代码交换数据(信号,状态和参数)。
C或C ++代码中的功能,包括外部函数,可以通过调用者或呼叫函数交换数据:
函数的参数(形式参数)。当函数通过参数交换数据时,应用程序可以多次调用该函数。被叫功能的每个实例都可以操纵自己的独立数据集,以便该实例不会相互干扰。
直接访问全局变量。全局变量可以:
启用相同算法的不同算法和实例以共享数据,例如校准参数和错误状态。
启用多任务系统的不同速率(函数)以交换数据。
启用不同的算法以异步交换数据。
在Si金宝appmulink中,您可以组织和配置数据,以便模型使用这些Exchange机制提供,提取和与代码共享数据。
在尝试匹配数据界面之前,选择整体集成方法,请参阅选择外部代码集成工作流程。
要在模型和外部功能之间交换数据,请根据您选择集成功能的技术选择一个Exchange机制。
要通过外部函数的参数交换数据,构造和配置模型以根据参数的数据类型创建和包装数据。然后,您可以连接和配置调用或表示函数以接受,生成或从模型中引用数据的块。
例如,如果您使用遗留代码工具生成一个S函数调用函数的块,块的端口和参数对应于函数的参数。您将上游块的输出信号连接到输入端口并在块掩码中设置参数值。然后,您可以从块的输出端口创建信号线,并将这些信号连接到下游块。
要通过全局变量交换数据,即您的外部代码已经定义,最好的做法是使用状态流®调用函数并访问变量的图表。您在图表中编写算法C代码,以便在模拟或执行生成的代码期间,模型读取并写入变量。
要在模型中的其他位置使用这样的全局变量作为参数数据(不是信号或状态数据),您可以创建一个数字MATLAB®变量或金宝appSimulink.Parameter.
代表变量的对象。如果在模拟运行之间更改C代码变量的值,则必须手动同步Simulink变量或对象的值。金宝app如果您的算法代码(函数)在模拟期间更改C代码变量的值,则相应的Simulink变量或对象不会改变。金宝app
如果选择创建C代码变量的Simulink表示,则可以金宝app配置Simulink表示,以便生成的代码读取并写入变量但不复制变量定义。将存储类应用于Simulink表示。金宝app
集成外部功能的技术 | 用模型交换数据的机制 | 示例和更多信息 |
---|---|---|
S函数块 | 函数参数 |
要通过使用遗留代码工具创建的S函数来调用函数,请参阅将C功能集成到具有遗留代码工具的Simulink模型中金宝app。 |
stateflow图表 | 函数参数并直接访问全局变量 |
调用您的函数并在StateFlow Chart中访问全局变量,请参阅访问定制代码变量和函数在endyflow图表中(州流)。有关在图表中创建数据项的信息(您可以将其作为参数传递给您的函数),请参阅添加状态流数据(州流)。 |
编码器.CEVAL. in.Matlab功能块 |
函数参数 |
在a中调用您的功能Matlab功能通过使用阻止 |
要将生成的代码导出到外部代码中,请参阅在外部调用代码和生成的代码之间交换数据。
模拟并重用您的自定义C数据,如结构,枚举和typedef.
别名,使用这些表中的信息。
用于匹配外部C代码中数据的建模模式
C数据类型或构造 | 示例C代码 | 金宝appSimulink等价物 | 更多信息 |
---|---|---|---|
原始别名( |
typedef float mysingleprec_t; |
创建A.
生成使用别名数据类型的代码需要嵌入式编码器®。 |
有关定义模型定义自定义数据类型的信息,请参阅 有关显示如何将生成的代码导出到外部代码的示例,请参阅替换并重命名数据类型以符合编码标准(嵌入式编码器)。 |
阵列 |
int myArray [6]; |
指定如上所述的信号和参数尺寸确定信号尺寸。 生成的代码定义并访问多维数据,包括矩阵,作为列主要序列化向量。如果外部代码使用不同的格式,请考虑使用替代技术来集成生成的代码。看代码生成矩阵和数组。 |
有关生成的代码如何存储Nonscalar数据(包括限制)的信息,请参阅代码生成矩阵和数组。 有关显示如何将生成的代码导出到外部代码的示例,请参阅在生成的代码中重用来自外部代码的参数数据(嵌入式编码器)。 要模拟查找表,请参阅 |
枚举 |
typedef枚举mycolorstype {red = 0,黄色,蓝色} mycolorstype; |
定义与枚举定义对应金宝app的Simulink枚举。使用Simuli金宝appnk枚举在模型中设置数据类型。 |
要在Simulink模型中使用枚举数据,请参阅金宝app在Simulink模型中使用枚举数据金宝app。 有关显示如何生成枚举参数数据的示例,请参阅枚举(嵌入式编码器)。 有关显示如何通过交换枚举数据将生成的代码导出到外部代码的示例,请参阅在生成和外部代码之间交换结构化和枚举数据(嵌入式编码器)。 |
结构 |
typedef struct mystructtype {int count;双Coeff;mystructype; |
创建A. 要创建结构化信号或状态数据,将模型中的多个信号线封装成单个非传真总线信号。 要创建结构化参数数据,请创建参数对象(例如 将查找表数据包装成结构,使用 |
有关总线信号的信息,请参阅将信号线组分为虚拟总线。有关参数结构的信息,请参阅组织结构中的相关块参数定义。 有关示出如何通过使用遗留代码工具将外部代码导入模型的示例,请参阅集成C功能,其参数是指向结构的指针。 有关显示如何将生成的代码导出到外部代码的示例,请参阅在生成和外部代码之间交换结构化和枚举数据(嵌入式编码器)和通过外部代码定义的指针访问结构化数据(嵌入式编码器)。 将查找表数据包装为结构, 有关在生成的代码中创建结构的一般信息,请参阅将数据组织到生成代码中的结构中。 |
用于代码生成的其他建模模式(嵌入式编码器)
C数据类型或构造 | 示例C代码 | 金宝appSimulink等价物 | 更多信息 |
---|---|---|---|
宏 |
#define myparam 9.8. |
应用存储类 该技术需要嵌入式编码器。 |
宏定义(#define)(嵌入式编码器) |
存储类型限定符如const 和挥发性 |
Const MyParam = 9.8; |
应用存储类 |
使用关键字const和volatile保护全局数据 |
比特领域 |
typedef struct mybitfield {无符号短int模式:1;unsigned短int失败:1;unsigned短int确定:1;mybitfield. |
这些技术需要嵌入式编码器。 |
位菲尔德(嵌入式编码器) 通过将布尔数据包装到位域中优化生成的代码(嵌入式编码器) |
调用自定义外部函数读取或写入数据 |
外部代码: / *调用此功能以获取信号的值。* / double get_insig(void){return mybigglobalstruct.insig;} 生成的算法代码: algorithminput = get_insig(); |
应用存储类 该技术需要嵌入式编码器。 |
通过使用存储类GetSet的函数访问数据(嵌入式编码器) |
进球 | 考虑和更多信息 |
---|---|
使用Si金宝appmulink运行并与生成的代码交互 | 您可以使用SIL,PIL和外部模式模拟将模型连接到相应的生成的模拟应用程序。从外部代码导入参数数据时:
有关SIL和PIL的信息,请参阅选择SIL或PIL方法(嵌入式编码器)。有关外部模式仿真的信息,请参阅用于参数调谐和信号监控的外部模式模拟。 |
生成描述导出数据的属性的代码注释,包括物理单位,现实世界初始值和数据类型 | 生成这些评论可以帮助您在手写集成代码时匹配数据接口。看为生成的代码中的变量添加自定义注释(嵌入式编码器)。 |