如何在simulink中嵌入c语言模块

本文详细介绍了如何在Simulink中利用S-FunctionBuilder构建并设置S-Function模块,包括设置文件名、添加输入输出变量、编辑C语言程序。重点讲解了sfunc.c和sfunc_wrapper.c文件的源码分析,以及如何在MATLAB环境中编译生成MEX文件。最后,文章总结了整个过程,为读者提供了清晰的步骤指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在simulink中打开Library

选择S-Function Builder模块,拖拽出来。在这里插入图片描述

2、设置S-Function模块

双击S-Function Builder模块,在这里插入图片描述

属性:
(1)S-Function Name:设置c语言文件名。
(2)Insert Ports:添加输入输出变量。
(3)Ports And Parameters:设置输入以及输出变量名称、类型、数据类型、维度。
(4)Build:构建c语言文件

2.1、设置文件名

在S-Function Name处填写,注意不能有中文,本列设置为sfunc

2.2、添加变量

首先要选中Port And Parameters,点击Insert Ports,选择要添加的输入还是输出变量
在这里插入图片描述

2.3、设置输入输出

首先要选中Port And Parameters,然后修改输入输出选项下有关窗口属性:

  • Name:输入输出变量(端口)名称,用户自己设置即可;
  • Scope:变量类型;
  • Data Type: 数据类型
  • Dimensions:数据的维度,这里有两种选项,分别是1-D和2-D;如果是1-D则表示输入向量,2-D则表示输入为矩阵;
  • Complexity:输入的数据是实数还是复数,这里有real(实数)和complex(复数)这两个选项;

2.4、构建

最后,设置完成后,点击Build按钮即可构建c语言文件,提示S-function ‘sfunc.mexw64’ created successfully后说明构建成功。

3、编辑c语言程序

3.1、源码分析

当Build后,会再matlab当前的目录下生成sfunc.csfunc_wrapper.c两个c语言文件以及一个.mexw64文件。在这里插入图片描述

  • .mexw64:文件是供matlab使用的动态链接库;
  • sfunc.c:可在此文件中修改输入输出;
  • sfunc_wrapper.c:主要修改这个文件,来实现c语言功能,下面具体再分析;

3.1.1、sfunc.c

此文件是自动生成的文件,源码比较多,这里就看看主要的mdlOutputs函数即可:

static void mdlOutputs(SimStruct *S, int_T tid)
{
    const real_T *u1 = (real_T *) ssGetInputPortRealSignal(S, 0);
    const real_T *u0 = (real_T *) ssGetInputPortRealSignal(S, 1);
    real_T *y0 = (real_T *) ssGetOutputPortRealSignal(S, 0);
    real_T *y1 = (real_T *) ssGetOutputPortRealSignal(S, 1);

    sfunc_Outputs_wrapper(u1, u0, y0, y1);

}

simulink每通过一个采样点就会调用一次函数mdlOutputs,在函数mdlOutputs中首先定义了两个输入两个输出变量,和我们之前在ui界面配置的相同,紧接着就是调用sfunc_Outputs_wrapper函数。

3.1.2、sfunc_wrapper.c

再此文件中,源码页比较长,我们只要看主要的sfunc_Outputs_wrapper函数即可:

void sfunc_Outputs_wrapper(const real_T *u1,
			const real_T *u0,
			real_T *y0,
			real_T *y1)
{
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */
/* This sample sets the output equal to the input
      y0[0] = u0[0]; 
 For complex signals use: y0[0].re = u0[0].re; 
      y0[0].im = u0[0].im;
      y1[0].re = u1[0].re;
      y1[0].im = u1[0].im;
 */
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */
}

这里可以看到函数的参数为我们之前定义的两个输入以及两个输出,都是通过指针的形式传入函数。
由于之前我们定义的是一行一列的一维数组,这里传入的指针就是代表了数组的首地址,我们只需要对指针进行解引用,即可对变量进行操作。
例:

void sfunc_Outputs_wrapper(const real_T *u1,
			const real_T *u0,
			real_T *y0,
			real_T *y1)
{
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */
/* This sample sets the output equal to the input
      y0[0] = u0[0]; 
 For complex signals use: y0[0].re = u0[0].re; 
      y0[0].im = u0[0].im;
      y1[0].re = u1[0].re;
      y1[0].im = u1[0].im;
 */
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */
	y0[0] = u0[0];
	y1[0] = u1[0];
}

3.2 编译

在matlab终端输入:
mex sfunc.c sfunc_wrapper.c
注:如果没安装编译器则需要先安装编译器编译器安装

4、结果

在这里插入图片描述
结果为:
在这里插入图片描述

5、总结

本文简单介绍了如何使用simulink中的S-Function模块调用c语言来实现我们想要的功能,有的地方是我自己的理解如果有错误,希望大家海涵并且指正,谢谢大家。

### 在Simulink中集成C语言函数 #### 使用S-Function模块嵌入自定义C代码 为了在Simulink环境中利用已有的C语言函数,通常采用S-Function机制。S-function允许用户创建自定义的动态系统模型组件,并支持多种编程语言,包括C/C++。当使用C语言开发时,可以通过编写特定格式的接口函数来定义系统的输入输出行为以及状态更新逻辑。 对于希望直接调用外部C库的情况,应当构建一个遵循S-function API规范的封装层[^2]: ```c // 定义 S 函数入口点 #define S_FUNCTION_NAME my_custom_function #define S_FUNCTION_LEVEL 2 #include "simstruc.h" void mdlInitializeSizes(SimStruct *S){ // 初始化参数... } void mdlOutputs(SimStruct *S, int_T tid){ real_T* y = ssGetOutputPortSignal(S,0); // 调用 C 库中的功能函数计算输出值 } ``` 上述模板展示了最基本的框架结构;实际应用过程中还需要根据具体需求补充更多细节处理部分,例如初始化设置、离散/连续时间管理等。 #### 创建MATLAB MEX文件作为中介桥梁 另一种方式则是借助于MATLAB提供的MEX技术——这是一种能够让Matlab/Simulink执行由其他高级语言(如C/C++)编写的子程序的技术手段。这种方式特别适合那些已经具备成熟算法实现但又期望快速验证效果的情形下使用[^4]。 首先,在本地计算机上准备好待引入的目标C源码片段之后,按照官方文档指导完成相应平台下的编译链接操作,从而得到可被即时加载使用的`.mexw64`二进制扩展件。接着便可在脚本里通过简单的命令行指令来进行交互测试或是进一步组装成更复杂的控制流图样。 最后一步就是把生成好的Mex对象注册给目标Simulink项目里的某个合适位置处,使之成为整个仿线程的一部分参与运算流程之中去。 #### 利用Embedded Coder工具自动化转换过程 如果手头拥有一份完整的C工程并且想要尽可能减少手动干预程度的话,则不妨考虑尝试MathWorks推出的专门用于辅助工程师们开展此类工作的Embedded Coder附加包服务[^3]。该软件能自动解析指定路径内的所有关联资源文件,识别出潜在可用作插件式的单元体,进而导出适配当前工作环境的标准构件供后续选用部署。 综上所述,无论是基于传统意义上的S-functions还是现代化的跨平台互操作解决方案,亦或者是高度定制化的编码迁移策略,都能有效地帮助开发者实现在Simulink内部无缝接入第三方C级API的目的。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值