文档

调用外部C函数

关于这个例子

学习目标

  • 评估C函数作为模型仿真的一部分。

  • 调用从生成的代码的外部的C函数。

先决条件

  • 能够打开和修改Simulink金宝app®模型和子系统。

  • 能够设置模型配置参数。

  • 能够阅读C语言代码。

  • 安装一个,金宝app支持C编译器

所需的文件

  • rtwdemo_throttlecntrl_extfunccall模型文件

  • rtwdemo_ValidateLegacyCodeVrsSim模型文件

  • /工具箱/ rtw / rtwdemos EmbeddedCoderOverview / stage_4_files / SimpleTable.c

  • /工具箱/ rtw / rtwdemos EmbeddedCoderOverview / stage_4_files / SimpleTable.h

包括在模型外部C函数

金宝appSimulink模型是基于模型的设计的一部分。对于许多应用,一个设计还包括创建一组预先存在的C函数,测试(认证),和验证以外的MATLAB的®和仿真软金宝app件环境。您可以轻松地将这些函数集成到模型和生成的代码中。在快速模拟运行期间,可以在生成的代码中使用外部C代码访问硬件设备和外部数据文件。

这个例子说明了如何创建调用外部C函数的自定义块。当块是模型的一部分,你可以采取模拟环境的优势,进一步测试该系统。

创建一个调用C函数的块

要指定对外部C函数的调用,请使用功能块。您可以自动创建功能通过使用Simulink的遗留代码工具金宝app滑块。使用该工具,指定您的外部C函数的接口。然后利用该接口来自动创建一个功能块。

  1. 文件的制作副本SimpleTable.cSimpleTable.h,所在的文件夹中matlabroot/工具箱/ rtw / rtwdemos / EmbeddedCoderOverview / stage_4_files开放).把副本放在你的工作文件夹中。

  2. 创建一个功能块调用在仿真期间每个时间步长对指定的函数:

    1. 在MATLAB命令窗口中,创建一个函数接口定义结构:

      def = legacy_code(初始化)

      数据结构def定义了功能接口到外部的C代码。

      DEF = SFunctionName: '' InitializeConditionsFcnSpec: '' OutputFcnSpec: '' StartFcnSpec: '' TerminateFcnSpec: '' HeaderFiles:{} SourceFiles:{} HostLibFiles:{} TargetLibFiles:{} IncPaths:{} SrcPaths:{} LibPaths:{}SampleTime: '继承' 选项:[1x1的结构]
    2. 通过输入以下命令填充函数接口定义结构:

      def.OutputFcnSpec=['double y1 = SimpleTable(double u1,',…'double p1[], double p2[], int16 p3)'];def.HeaderFiles = {' SimpleTable.h '};def.SourceFiles = {' SimpleTable.c '};def.SFunctionName =“SimpTableWrap”;
    3. 创建一个函数:

      legacy_code( 'sfcn_cmex_generate',DEF)
    4. 编译S-功能:

      legacy_code( '编译',DEF)
    5. 创建功能布洛克:

      legacy_code (slblock_generate, def)

      将打开一个新的模型窗口,其中包含SimpTableWrap块。

      提示

      创建功能块是一次性任务。一旦块存在,您就可以在多个模型中重用它。

  3. 模型保存到工作文件夹为:s_func_simptablewrap

  4. 对象创建目标语言编译器(TLC)文件功能布洛克:

    legacy_code( 'sfcn_tlc_generate',DEF)

    TLC文件是S-function的组件,它指定代码生成器如何为一个块生成代码。

有关使用遗留代码工具的更多信息,请参见:

验证外部代码在金宝app环境

当您使用Simulink模型集成外部的C代码,使用代码之前,验证外部C函数代码作为独金宝app立组件的功能。

  1. 打开模型rtwdemo_ValidateLegacyCodeVrsSim.该模型验证了S-功能块,你创建的。

    • 正弦波块从[:2 -2]产生输出值。

    • 所述查找表的输入范围是从[-1:1]。

    • 查找表的输出是输入的绝对值。

    • 所述查找表输出的剪辑在输入限制的输出。

  2. 模拟模型。

  3. 通过打开查看验证结果验证子系统,该子系统,单击范围块。

    下图显示了验证结果。外部C代码和Simulink Lookup表块提供相同的金宝app输出值。

  4. 关闭验证模型。

验证C代码的部分产品型号

在您验证外部C函数代码作为独立组件的功能之后,请验证模型中的s函数。使用测试工具模型来完成验证。

请注意

下面的过程需要Stateflow的®许可证。

  1. 开放rtwdemo_throttlecntrl_extfunccall并保存副本throttlecntrl_extfunccall在MATLAB路径上的可写文件夹。

  2. 检查PI_ctrl_1PI_ctrl_2子系统。

    1. 抬头块已被替换为您使用旧代码的工具创建的块。

    2. 检查块参数设置SimpTableWrapSimpTableWrap1

    3. 关闭“阻断参数”对话框和PI子系统窗口。

  3. 打开测试工具模型,请右键单击Unit_Under_Test模型块,并选择块参数(ModelReference)

  4. 型号名称throttlecntrl_extfunccall.点击好的

  5. 更新测试工具模型图。

  6. 模拟测试工具。

    仿真结果符合预期的黄金价值。

  7. 保存并关闭throttlecntrl_extfunccallthrottlecntrl_testharness

从生成的代码调用C函数。

代码生成器使用TLC文件处理功能块。函数中嵌入的C代码调用功能布洛克:

  • 可以使用数据对象。

  • 表达折叠,一种将多个计算组合成单个输出计算的操作。

  1. 开放throttlecntrl_extfunccall

  2. 为模型生成代码。

  3. 检查文件中生成的代码throttlecntrl_extfunccall.c

  4. 关闭throttlecntrl_extfunccallthrottlecntrl_testharness

关键点

  • 通过使用遗留代码工具,您可以轻松地将外部函数集成到模型和生成的代码中。

  • 验证外部C函数代码的功能,将其作为独立组件集成到模型中。

  • 在您验证外部C函数代码作为独立组件的功能之后,请验证模型中的s函数。

相关话题