集成外部C/ c++代码金宝app使用C函数块
您可以调用外部C代码并将其集成到Simulink中金宝app®模型使用C函数块。C函数块允许您调用外部C代码并使用输出代码,开始代码,初始化条件代码,终止代码窗格中的块参数对话框。使用C函数块:
从外部C代码调用函数,并为您的Simulink模型自定义代码。金宝app
预处理数据以调用C函数,并在调用函数后处理数据。
为模拟和代码生成指定不同的代码。
调用多个函数。
初始化并使用块中缓存的持久数据。
分配和释放内存。
使用C函数块调用要修改的Simulink中的外部C算法。金宝app要从Simulink模型调用单个C函数,请使用金宝appC调用者块。要集成具有连续状态或状态变化的动态系统,请使用功能块。
请注意
C99是C语言的标准版本,支持自定义C代码集成到Simulink中。金宝app金宝app
下面的例子使用C函数块来计算输入的和和平均值。
写入外部源文件
首先创建外部源文件。
创建名为
data_array.h
./*定义一个struct DataArray */ typedef struct DataArray_tag{/*定义一个指针pData */ double* pData;/*定义变量长度*/ int长度;} DataArray;/*函数声明*/ double data_sum(DataArray数据);
在同一个文件夹中,创建一个新文件,
data_array.c
.在这个文件中,编写一个C函数来计算输入数字的和。#include "data_array.h" /*定义一个接受结构的函数*/ double data_sum(DataArray数据){/*定义两个局部变量*/ double sum = 0.0;int我;/*计算(i = 0;I < data.length;i++) {sum = sum + data.pData[i];} /*返回结果到block */返回sum;}
输入外部代码进入金宝app
创建一个新的空白模型并添加C函数块。的C函数块在用户定义函数库浏览器。
双击C函数块打开块对话框。点击打开“模型配置参数”对话框。在模拟目标窗格下定义头文件包括头信息在代码信息选项卡。
提示
在您输入信息之后源文件下一步,您可以单击从源文件自动填充要使用源文件中包含的信息自动填充头文件名。
下定义源文件源文件在代码信息选项卡。要验证可以成功解析和构建自定义代码,请单击验证自定义代码.
请注意
使用C函数对于每个子系统或具有连续采样时间,或优化块在条件输入分支执行中的使用,所有由块调用的自定义代码函数必须是确定性的,也就是说,总是为相同的输入产生相同的输出。属性确定哪些自定义代码函数是确定的确定的功能而且由函数指定参数模拟目标窗格。如果块引用任何自定义代码全局变量,则确定的功能必须设置为
所有
为了使块用于for Each子系统,在条件输入分支执行,或连续采样时间。举个例子来说明C函数对于每个子系统,请参见在每个子系统中使用C函数块.
在输出代码面板C函数块参数对话框,编写块在模拟期间执行的代码。在这个例子中,外部C函数计算一个和。在输出代码窗格中,编写调用
data_array.c
函数来计算和,然后计算平均值。/* declare struct dataArr */ DataArray dataArr;/*存储从输入端口*/ dataArr输入的长度和数据。pData = &data[0];dataArr。长度=长度;/*从外部代码调用函数来计算sum */ sum = data_sum(dataArr);/*计算平均数*/平均数=总和/长度;
控件中,可以指定在模拟开始时和模拟结束时运行的代码开始代码而且终止代码窗格。
使用符号表中定义在代码块中使用的符号。属性添加或删除符号添加而且删除按钮。定义中使用的所有符号输出代码,开始代码,初始化条件代码,终止代码窗格,以确保端口正确显示。
在符号表中,对于在代码块中使用的每个符号,定义的名字,范围,标签,类型,大小,港口。
关闭块参数对话框。填写完表中的数据后,将C函数Block现在有一个输入端口和两个输出端口,标签在表中指定。
添加一个常数控件的输入金宝appC函数块。在常数块,创建100个元素的随机行数组。控件的输出附加显示块,以显示结果C函数块。
指定模拟或代码生成代码
你可以指定不同的输出代码用于仿真和代码生成C函数通过定义MATLAB_MEX_FILE
.例如,要指定仅在模型模拟期间运行的代码,请使用以下方法。
#ifdef MATLAB_MEX_FILE /*输入模拟代码*/ #else /*输入代码生成代码*/ #endif . #
为代码生成指定目标特定函数的声明
用于代码生成的目的,如果没有带有要从C函数块中包含具有正确签名的声明输出代码方块的窗格。该操作在生成代码时创建对预期函数的函数调用,如下例所示:
#ifndef MATLAB_MEX_FILE extern void driverFcnCall(int16_T in, int16_T * out);driverFcnCall(阻塞、封网);# endif