您可以调用外部C代码并将其集成到Simulink中金宝app®模型使用C函数块。C函数块允许您调用外部C代码,并使用输出代码,开始代码,终止代码块参数对话框中的窗格。使用C函数块:
从外部C代码调用函数,并为您的Simulink模型定制代码。金宝app
对数据进行预处理以调用C函数,并在调用函数后对数据进行后处理。
为模拟和代码生成指定不同的代码。
调用多个函数。
初始化并使用块中缓存的持久数据。
分配和释放内存。
使用C函数块调用要修改的外部C算法到Simulink。金宝app要从Simulink模型调用单个C函数,请使用金宝appC调用者块。要集成具有连续状态或状态变化的动态系统,请使用功能块。
请注意
C99是支持自定义C代码集成到Simulink的C语言的标准版本。金宝app金宝app
下面的示例使用C函数块来计算输入的总和和平均值。
首先创建外部源文件。
创建一个名为data_array.h
.
/* Define a pointer called pData */ double* pData; /* Define a pointer called pData */ double* pData;/*定义变量长度*/ int长度;} DataArray;/*函数声明*/ double data_sum(DataArray数据);
在同一个文件夹中,创建一个新文件,data_array.c
.在这个文件中,编写一个C函数来计算输入数字的和。
#include "data_array.h" /* Define a function that takes in a struct */ double data_sum(DataArray data) {/* Define 2 local variable to use in the function */ double sum = 0.0;int我;/*计算值的总和*/ for (i = 0;我< data.length;i++) {sum = sum + data.pData[i];} /*返回结果到块*/返回sum;}
创建一个新的空白模型并添加C函数块。的C函数块在用户定义函数库浏览器的库。
双击C函数块以打开块对话框。点击打开配置参数对话框。在模拟目标窗格下定义头文件头文件.
提示
输入信息后源文件在下一步中,您可以单击从源文件自动填充使用源文件中包含的信息自动填充头文件名称。
在下定义源文件额外的构建信息>源文件.要验证您的自定义代码是否可以成功解析和构建,请单击验证.
请注意
使用一个C函数对于每个子系统,或者具有连续的采样时间,或者为了在条件输入分支执行中优化块的使用,块调用的所有自定义代码函数必须是确定性的,也就是说,总是为相同的输入产生相同的输出。属性来确定哪些自定义代码函数是确定的确定的功能和指定的功能参数模拟目标窗格。如果代码块引用任何自定义代码全局变量,则确定的功能必须设置为所有
为了使块在for Each子系统中使用,或在条件输入分支执行中,或具有连续的采样时间。
举个例子C函数For Each子系统,请参见每个子系统内部使用C函数块.
在输出代码面板的C函数块参数对话框,编写块在模拟期间执行的代码。在这个例子中,外部C函数计算一个和。在输出代码窗格,编写代码调用data_array.c
函数来计算总和,然后计算平均值。
/*声明struct dataArr */ dataArr;/*存储从输入端口传入的长度和数据*/ dataArr。pData =与数据[0];dataArr。长度=长度;/*从外部代码调用函数来计算sum */ sum = data_sum(dataArr);/*计算平均值*/ mean = sum / length;
属性中的代码可以指定在模拟开始和结束时运行的代码开始代码和终止代码窗格。
使用符号表来定义外部C代码中使用的符号。属性添加或删除符号添加和删除按钮。属性中使用的所有符号输出代码,开始代码,终止代码窗格,以确保端口正确显示。
在符号下表,定义如下:
的名字—源代码中的符号名。
范围-符号的范围和出现顺序。您可以随时更改符号的作用域。
输入
—输入符号C函数块。
输出
的输出符号C函数块。
输入输出
属性的输入和输出定义一个符号C函数块。
使用输入输出
作用域来映射C代码中通过指针传递的输入。使用输入输出
作用域对于输入端口和输出端口具有相同的名称。输入输出
作用域允许输入和输出端口的缓冲区重用。根据信号大小和块布局的不同,复用缓冲区可以优化内存使用,提高代码模拟和代码生成效率。限制包括:
输入输出
中不能使用符号开始
和终止
代码。
输入输出
端口不支持金宝appvoid *
数据类型。
输入输出
端口不支持金宝app尺寸()
表达式。
持续的
—将符号定义为持久数据。
方法定义空指针持续的
范围在C函数块。一个空指针是一个指针,它可以存储您创建或分配的任何类型的数据。
常数
-使用值大小或数字表达式将符号定义为常量。
参数
—将符号定义为参数。属性定义的参数名标签的象征。
标签—符号的标签。用于范围为的符号输入
或输出
,此标签显示为块上的端口名。用于范围为的符号参数
,此标签是出现在块参数掩码上的标签。不能为。定义标签持续的
符号。如果范围是常数
,则标签为常量表达式。
类型-符号的数据类型。从下拉列表中选择数据类型或指定自定义数据类型。
使用自定义类型,例如金宝app仿真软件。公共汽车
,金宝app仿真软件枚举或金宝app仿真软件。AliasType
没有外部头文件定义的C函数块中,将类型设置正确象征表格
大小-符号数据的大小。的C函数块只支持标量金宝app和向量。不支持矩阵和高维数组。金宝app您可以使用size表达式来定义输出的大小。使用-1
继承的大小。
港口-对于输入和输出符号,港口
表示端口在符号数据块上的索引。对参数的符号,港口
指示符号在块参数掩码中出现的顺序。
关闭块参数对话框。填好表格中的数据后,C函数块现在有一个输入端口和两个输出端口,带有表中指定的标签。
添加一个常数对象的输入金宝appC函数块。在常数块,创建一个包含100个元素的随机行数组。控件的输出附加显示块以显示结果C函数块。
的函数可以调用C数学库函数的这个子集C函数布洛克:
腹肌 |
这些“可信赖医疗组织” |
印度历的7月 |
: |
量化 |
装天花板 |
因为 |
cosh |
经验值 |
晶圆厂 |
地板上 |
在你 |
实验室 |
ldexp |
日志 |
log10 |
战俘 |
罪 |
sinh |
√6 |
棕褐色 |
双曲正切 |
当调用这些函数时,除非所有输入参数显式地为单精度,否则将应用双精度。当发生类型不匹配时,将输入参数强制转换为预期类型将替换原始参数。例如,如果你调用罪
函数具有整型参数,即将输入参数强制转换为类型为浮点数的函数双
替换原始参数。
如果您想调用上面没有列出的其他C库函数,请创建一个调用C库函数的外部包装器函数。
腹肌
,晶圆厂
,实验室
功能的解释腹肌
,晶圆厂
,实验室
函数C函数block超越了标准C版本,包含了整型和浮点型参数:
如果x
是一个整数,标准的C函数腹肌
适用于x
,或abs (x)
.
如果x
是双精度函数,标准的C函数实验室
适用于x
,或实验室(x)
.
如果x
是一个单一的,标准的C函数晶圆厂
适用于x
,或晶圆厂(x)
.
对函数的调用应该根据传入函数的数据类型调用正确的CRL。如果没有指定CRL,则对该函数的调用应该调用特定于类型的库。C99的CRL生成一个特定类型的函数。例如:
通过的类型 | 代码生成调用 |
---|---|
sin (doubleIn) |
sin (doubleIn) |
sin (floatIn) |
sinf (floatIn) |
可以为模拟和代码生成指定不同的输出代码C函数块定义MATLAB_MEX_FILE
.例如,要指定只在模型模拟期间运行的代码,请使用以下方法。
#ifdef MATLAB_MEX_FILE /*输入Sim代码*/ #else /*输入代码生成代码*/ #endif . php . php . php
出于代码生成的目的,如果您没有外部头文件,其中没有要从C函数块中,可以包含具有正确签名的声明输出代码块的窗格。当代码生成时,此操作创建对预期函数的函数调用,如下例所示:
#ifndef MATLAB_MEX_FILE extern void driverFcnCall(int16_T in, int16_T * out);driverFcnCall(阻塞、封网);# endif
在模拟包含定制C或c++代码的模型时,您可以选择在MATLAB之外的单独进程中运行定制代码®.这个选项在调试自定义代码时可能很有用。通过在单独的进程中运行,自定义代码的问题不会导致MATLAB崩溃,而且您可以更容易地调试和解决此类问题。由于自定义代码中的意外异常或Simulink与自定义代码之间的接口错误,可能会出现问题。金宝app有关更多信息,请参见在单独的进程中模拟自定义代码.