Simulink通过 mex level 2 S函数传递可变尺寸的数据

前言

上接 Simulink利用共享内存读取向外发送仿真信号与运行控制这篇文章,由于利用Simulink传递数据用到了C函数操作共享内存,这样导致在每次进行Simulink仿真前,需要在Simulink的Simulink target配置上所需要的头文件和C源文件,而且每个运行前需要重复对这些C文件编译,另外如果没有安装MATLAB编译器(mex -setup 没找到编译器)时,导致不能编译这些c文件从而导致无法运行。因此这大大限制了利用C文件中的函数实现所需的功能。
在这里插入图片描述
鉴于此,有必要将所调用C函数的模块转换为S函数,从而加快模型在仿真前的编译速度,且能够在不安装编译器的电脑上实现模型的运行。

将子模块自动转换S函数

这里,介绍一种比较简便的方法实现已有的Simulink模块转换为S函数的方法。这里利用了Simulink自带的generate S function 功能。

在这里插入图片描述
注意,在生成S函数之前,需要保证模型能够运行,S函数中如果存在变量时,需要提前将变量在工作空间中初始化,这些变量初始化仅保证模型运行即可,在生成S函数的时候会自动提示是否将这些变量转换为可调节的参数。由于需要转换的子模块中存在a和b两个变量,因此在转换S函数时会让用户选择是否视为可调节的变量。当模型中存在结构体变量时,例如struct.a = 1,struct.b = 2时,将提示不能转换为S函数,因此需要在模型转换为S函数前,将结构体变量提前调节为普通的变量。
在这里插入图片描述
当转换成功后,可以在当前的MATLAB当前工作路径下生成对应生成代码的文件夹。在模型名_rtw文件夹下,存在该子模型生成的源代码。
在这里插入图片描述
至此,转换结束,前言中的问题就解决了,但是,本文需要接着深入S函数分析,达到更加高级的功能。
由于Simulink自带的S函数转换功能生成的为level 2 mex 类型的,通过查找帮助文档说该S函数可以传递可变尺寸的输入输出接口,然而生成的S函数却仅以转换前的子模块输入参数个数为准,因此需要就转换的源文件进行改编。

修改已有源码达到可变输入数据的效果

这里需要对level 2 的S函数大致熟悉,快速入门S函数可根据Simulink提供的S函数例子即可快速掌握。如下图所示,在下图中,点击C-file S function模块。
在这里插入图片描述
在C-file S -function 模块中,查找动态尺寸变换的模块进行学习。
在这里插入图片描述
通过对该demo学习,很快就能账掌握S函数的使用方法。在初步了解level 2 mex S函数的输入输出,初始化等之后,对自动生成的S函数代码改写。打开自动生成的C文件,该文件名与文件夹名称一致,直接找到Outputs函数,将自己的逻辑添加到其中。并且在初始化函数中将其改为可变输入的模式,参考Simulink中提供的可变输入尺寸的demo。下图为改写后的输出函数。
在这里插入图片描述
对比改写前的C文件,下图为自动生成的C函数,将改动的部分标记出来。
在这里插入图片描述

改动位置总结

1、将原有固定个数的输入信号数组改为动态分配类型的数组。原来是依次对每个数组元素进行赋值,现在是利用for循环对输入信号个数进行赋值,达到可灵活变化的效果。
2、将原有输入个数固定的改写为可变的情况。
3、其他逻辑最好保持原样
有兴趣的也可分析一下stateflow转换为C时的转换规则,可以很清楚的看到Simulink对模型中的逻辑转换为C文件中的逻辑。这样在改写Simulink生成的C文件时,更加有把握。
当完成修改后,调用 mex ‘文件名1.c’ ‘文件名2.c’… 这种方式对修改后的C函数重新编译,编译成功后即可生成S函数中需要的mex文件,这时直接运行该S函数所包含的Simulink模型,验证是否达到了想要的效果。

总结

在已有Simulink子模块的情况下,为了不重复写S函数中复杂的逻辑,利用Simulink 转S函数的功能,将已有的子模块中逻辑转换为S函数。当转换后的S函数与想要达到的模块效果有偏差时,可以打开转换后的S函数,并对其修改,然后调用mex命令重新编译即可。
另外,本文仅对可变尺寸这一需求进行了改写,如果想实现其他的S函数功能时,均可参考Simulink S函数中提供的例子。

附件

本文中所包含的Simulink子模块以及转换前后的代码。
本文所用的MATLAB为2021a版本。所用的编译器为vs2015。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值