Simulink自动代码生成5——控制函数原型(control function prototype)

直流无刷电机控制系统设计与Simulink仿真实践 直流无刷电机(BLDC)作为现代工业自动化的核心驱动元件,通过电子换相技术实现了高效率与长寿命。其控制核心在于三闭环架构(电流环、速度环、位置环)的协同优化,其中电流环设计需考虑电磁方程与PI调节器参数整定,速度环需平衡动态响应与抗扰性,位置环则根据应用场景采用S曲线或前馈策略。Simulink作为多物理场仿真平台,可通过模块化建模实现从电机本体到控制算法的全系统仿真,显著降低开发风险。在工程实践中,PWM调制策略、热补偿机制和代码生成优化是确保系统可靠性的关键要素,特别适用于无人机推进、机器人关节等高精度 阅读详情
AI摘要

本文详细介绍Simulink如何通过定制函数原型、管理接口和数据存储来提升代码灵活性。涉及控制函数原型修改、返回值与形参设定,以及函数接口的复用策略,帮助用户避免全局变量冲突,实现代码高效复用和内存精准管理。

simulink可对生成的代码做深度定制化,主要从以下几个方面:

  1. 控制函数原型(function prototypes)
  2. 函数接口复用(reuse function interface)
  3. 数据存储管理(storage class & memory section)
  4. 函数模板(function templates)

下面一一说明:

控制函数原型(function prototypes)

默认设置下,3个入口函数和为以下形式
在这里插入图片描述

且输入输出和非内联变量会以全局结构体的形式被函数访问。
在这里插入图片描述
函数名管理

但我们可以对此进行管理:在模型的code mapping - c的界面中(序号1)点击function(序号2),我们可以在function name(序号3)处对3个入口函数的名字进行修改(图中已经做了修改),并且可以点击4修改model_step的函数原型(初始化函数和终止函数的原型不可修改,只能改函数名)。
在这里插入图片描述
我们点击上图4修改step函数的原型,在下图勾选3然后点击4会出现详细设置,如下图
1是step函数原型的预览
2是函数名
5是设置step函数的返回值,可以返回指针也可以返回变量
6是step函数的返回值和形参设置
7是初步校验
在这里插入图片描述
函数返回值管理

3处如果选择void,函数声明里的形参有一个指针,指向输出值。此时该step函数为无返回值(return),而生成了一个指针,指向本该输出的数据:静态变量FQF_arg_ETC_output_scaled
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3处如果不选择void而是选择响应的信号标签(ETC_output_scaled),意思是:以数值方式返回计算结果(此时2出会改变)
在这里插入图片描述
代码如下,可着重对比一下”C return arguement“选项的影响,step函数的原型有变化:形参及返回值均变化。

extern void FQF_Step(real_T FQF_arg_pedal_scaled, real_T FQF_arg_angle_scaled, real_T *FQF_arg_ETC_output_scaled);	// 选择void的代码
extern real_T FQF_Step(real_T FQF_arg_pedal_scaled, real_T FQF_arg_angle_scaled);	// 选择信号标签(ETC_output_scaled)的代码

在这里插入图片描述
用return返回计算结果的值
在这里插入图片描述
在这里插入图片描述
函数形参管理
函数的形参也可以用指针传递,比如当输入信号为一个结构体时(vector),此时需要在形参的设置处选择为pointer即可。
在这里插入图片描述
总结一下:

  • simulink仅允许用户在step函数上进行函数原型控制,但是可以对初始化函数和终止函数崇明ing
  • 可以控制函数的形参和返回值(值和指针)

函数接口复用

一般来讲,函数的形参和返回值(输入和输出)都是以全局变量结构体的形式存在:
在这里插入图片描述
在这里插入图片描述

当需要对model_step函数进行多测调用时,全局变量结构体就会导致冲突:model_step.c中直接操作全局变量。
在这里插入图片描述

具体如下,下拉菜单选择“reusable function”和“individual arguments”。代码体现为:把全局变量改成独立的函数形参传进函数内部。(选择individual arguments时(code interface packaging会和控制函数原型里的configure arguments for steps function prototype冲突,需要取消configure arguments for steps function prototype的选择对勾))
在这里插入图片描述
代码如下,model_step形参里多了1个状态"RT_MODEL_piCtrl_prototype_sta_T *const piCtrl_prototype_start_M",2个输入“real_T piCtrl_prototype_start_U_pedal_scaled”、“real_T piCtrl_prototype_start_U_angle_scaled”,1个输出“real_T *piCtrl_prototype_start_Y_ETC_output_scaled”,此时该step函数就不是直接操作全局变量,而是操作函数内部变量(形参),不会出现数据冲突,此时函数便可复用。
在这里插入图片描述
model_step函数形参里的状态量的定义如下:
在这里插入图片描述

选择structure reference时
在这里插入图片描述
代码如下,1个状态“RT_MODEL_piCtrl_prototype_sta_T *const piCtrl_prototype_start_M”(同上),一个输入“ExtU_piCtrl_prototype_start_T *piCtrl_prototype_start_U”,1个输出“ExtY_piCtrl_prototype_start_T *piCtrl_prototype_start_Y”。
在这里插入图片描述
为何2个输入变成了1个输入?原因是把输入输入变成了结构体,2个输入信号被封装在一个结构体里。但本质是一样的,都是step函数对形参操作而不对全局变量操作。
在这里插入图片描述

选择为part of model data structure时,
在这里插入图片描述
代码如下,
在这里插入图片描述
model_step函数的形参超级简单,只有一个“RT_MODEL_piCtrl_prototype_sta_T *const piCtrl_prototype_start_M”。但是我们看下这个“piCtrl_prototype_start_M”里有什么。和model.c的赋值对比一下,其实本质也一样,把step函数对形参操作而不对全局变量操作,只不过函数接口的封装形式不同。
在这里插入图片描述

数据存储管理

下面这东西叫embedded coder dictionary,听起来有点像数据字典,用处也比较相似,用来管理data access formats,function templates,memory sections等。在1中点击2会弹出3,embedded coder dictionary中有3个主要界面:storage classes(很重要,数据字典必用)、function customization templates和memory section。其中storage classes和memory section配合使用,memory section用于精确管理变量的声明和定义,storage classes相当于对memory section进行了一次扩充和更多特性管理的封装。
在这里插入图片描述
storage classes可通过变量声明&定义对内存进行精确管理,此处也可定义关键字#pragma:
在这里插入图片描述

函数模板

上面说的embedded coder dictionary定义函数模板function templates,和C++里的函数模板不是一个意思,此处的函数模板有点类似于函数命名规则,见下图3,$R和N是命名规则缩写,鼠标放在上面就会弹出所代表的意思,比如代表模型名字等。
在这里插入图片描述

Matlab Simulink 常用快捷操作和功能(1) 1.快速查找library里面的模块:双击左键,然后输入要查询的模块名称。 -----> 2.block 和 signal 的命名修改 单击block,显示 修改名字 3.Simulink支持从块参数对话框中创建变量。 可以在Simulink中创建MATLAB变量,并在其他块中重用它们的值。 4.MATLAB Function Block IMATLAB Func... 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化 第二百零一十一 软件开发模型01

编号类型模型领域模型中的知识点/因素/参数关联知识和法律法规1传统顺序模型瀑布模型 (Waterfall)通用软件开发、硬件紧密耦合系统、政府/军工项目、需求稳定的传统信息系统严格线性阶段:可行性研究→需求分析(SRS,含功能/非功能/接口/约束,使用IEEE 830模板)→系统设计(概要设计HLD:架构、模块划分、数据库ER图;详细设计LLD:伪代码、类图、接口定义)→实现(编码规范、代码审查、静态分析工具SonarQube)→测试(单元测试JUnit、集成测试、系统测试、验收测试UAT,测试计划提前编写

weixin_49199313的博客 159

新版本simulink中配置函数原型为指定形式的configure model functions命令问题

当我们在新版本的simulink中需要配置函数原型为指定形式中,可以在一些教程中发现如下的命令 但是当我们使用新版本的simulink时,却发现找不到这一个命令 在新版本中找到对应的设置位置如下,在仿真界面左下角 ...

weixin_42031364的博客 2223

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3127

Simulink代码生成: #pragma section 自定义Storage Class

1. 问题引入 1. 定义变量到指定的段 开发过程中,需要把标定量放到指定的段中并生成代码,代码效果如下,在应用层都是基于模型开发的前提下,如果手动添加#pragma section 这种预编译指令是不现实的,本文记录一下代码生成的配置过程。 2. 批量把SLDD里面定义的变量放到指定的段 如果已经定义了数据字典,并定义了很多变量需要放到特定的段中 #pragma section ".rodata.Calib_32" a 4 /* Definition for custom sto...

weixin_42665184的博客 7199

【SAP GUI 脚本 VBA】实战:构建Excel驱动的SAP自动化操作平台

本文详细介绍了如何利用VBA和SAP GUI脚本构建Excel驱动的SAP自动化操作平台,实现高频事务码的标准化封装和批量处理。通过实战案例展示物料主数据查询(MM03)、会计凭证修改(FB02)等场景的自动化实现,帮助用户提升10倍+操作效率,同时确保数据可追溯性和操作安全性。

weixin_33748818的博客 504

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7736

simulink代码生成主动生成子函数

文章目录背景1 针对matlab function 代码生成,使用子函数的方法:2 针对block 的代码生成,使用子函数的方法:输入参数为结构体参考 背景 使用代码生成时,生成为一整块代码,考虑到减小栈空间消耗, 思考的两种方法 1、希望使用子函数的形式。 2、存在临时变量拷贝的,均改写成结构体/数组的指针 1 针对matlab function 代码生成,使用子函数的方法: 创建子系统时,设置为原子子系统,否则只是将系统进行简单的组合(group),在创建原子子系统之后,对代码生成项进行设置: 2

AbiUni(YY熊) 2798

Python-OpenCV及cv2,numpy库最新安装教程[最全步骤]

安装教程目录前言OpenCV-Python安装教程报错解决cv2安装numpy安装opencv安装(附加)总结 前言 首先,我知道一些看到我的Blog的人已经在网上找了很多歪路子,现在已经火冒三丈了(我也是这样过来的hhhh),那么现在,深呼吸,跟着我的教程,不要着急,每一步都要读一遍。完整安装过程需要1个小时左右(仅供参考,本人第一次安装python花了一天(确信)) OpenCV-Python...

qq_45425286的博客 7432

函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)

函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)在C和C++等编程语言中扮演着不同的角色,但它们有时在概念上可能会有些重叠。

HYPERRION的博客 3366

LeGO-LOAM相对LOAM的改进---地面分离的方法-算法原理+代码讲解

实际上此种地⾯分离算法有⼀些简单,我们可以结合激光雷达安装⾼度等其他先验信息进⾏优化,避免将桌子这些当作地面点。LeGO-LOAM中前端改进中很重要的⼀点就是充分利⽤了地⾯点,那⾸先⾃然是提取对地⾯点的提取。理想情况下, 应该接近0,考虑到⼀⽅⾯激光雷达安装也⽆法做到绝对⽔平,另⼀⽅⾯,地⾯也不是绝。对⽔平,因此,这个⾓度会略微⼤于0,考虑到作者实际在草坪之类的场景下运动,因此这个值被设置成。如上图,相邻的两个扫描线束的同⼀列打在地⾯上如AB点所⽰,他们的垂直⾼度差。,计算垂直⾼度差和⽔平⾼度差的⾓度。..

zysss_的博客 775

dht11在oled上显示温度 stm32l432kc,如何实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1202

Simulink建模基础:Simulink Function子系统及其代码

本文研究Simulink Function子系统的用法和该模块生成的代码。 文章目录1 问题引入2 Simulink Function子系统建模2.1 Simulink Function子系统2.2 Function Caller模块 1 问题引入 博主在其他的博客中研究了许多模块和子系统,以及它们生成的代码。通常来说,博主研究的方法是建立一个Inport,一个outport,以及两者之间的控制逻辑,譬如如下的Gain模块。 配置好该模型,并生成代码如下。 其中的step函数就可以反映出模型的算法,输入

u013288925的博客 1万+

挖矿病毒解决实例(隐藏进程,文章较好)(入侵)

CPU起飞了 最近有朋友在群里反馈,自己服务器的CPU一直处于高占用状态,但用top、ps等命令却一直找不到是哪个进程在占用,怀疑中了挖矿病毒,急的团团转。 根据经验,我赶紧让他看一下当前服务器的网络连接,看看有没有可疑连接,果然发现了有点东西: 上Shodan查一下这IP地址: 反向查找,发现有诸多域名曾经解析到这个IP地址: 这是一个位于德国的IP地址,开放了4444,5555,7777等数个特殊的服务端口: 其中这位朋友服务器上发现的连接到的是7777端口,

墨痕诉清风的博客 1万+

Function Prototypes

[b]Adding a prototyped method to a function.[/b] [code="java"] function Ninja(){} Ninja.prototype.swingSword = function(){ return true; }; var ninjaA = Ninja(); assert( !ninjaA, "Is...

jardownload的博客 594

Node-RED教程(二):Node-RED的面板的操作

Node-RED系列(二):Node-RED的面板的操作 要使用Node-RED去搭建一个物联网平台,链接设备,设备通信,就必须要先熟悉Node-RED的这种面板,对于一个新的项目,在动手做之前一点想对这个的技术的文档有足够的了解做起来才能游刃有余。本期我给大家介绍一下Node-RED的各种面板,熟悉这些面板后,在后续的搭建Iot服务中,会举重若轻,同时该系列的文档,难度会逐步加深,知道了本章解释的名称后对后续文章的理解有很大帮助。 面板1:默认节点选项列表 安装Node-RED后默认的节点分为这5大类

知无涯 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MATLAB R2026a新特性解析:代码生成、硬件部署与大型项目管理实战

在科学计算与工程仿真领域,代码生成与硬件部署是将算法模型转化为实际生产力的关键环节。其核心原理在于通过专用工具链,将高级语言描述的模型自动转换为可在特定硬件上高效运行的底层代码,从而打通从设计到实现的壁垒。这项技术的核心价值在于大幅提升了开发效率、保证了代码质量与一致性,并降低了手动移植带来的错误风险。它广泛应用于嵌入式系统开发、快速控制原型、硬件在环测试等场景。MATLAB/Simulink作为该领域的集成平台,其新版本R2026a在**代码生成**与**硬件部署**方面进行了显著增强,例如提升了Embe

weixin_30315435的博客 325

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Simulink与AUTOSAR RTE配置失效的根因分析与协同实践

AUTOSAR是一种面向汽车电子的分层软件架构标准,其核心在于严格定义运行时环境(RTE)、基础软件(BSW)与应用组件(SWC)之间的契约关系。RTE并非普通中间件,而是强制执行接口映射、内存段分配、调度周期约束和初始化顺序的运行时铁律。当Simulink建模未同步体现这些语义——如Sender-Receiver接口类型误配、数据类型缩放因子不一致、Runnable调度周期与OS Task冲突——生成代码虽能编译,却在ECU上触发RTE初始化失败、事件丢失或核间通信异常等典型问题。本文聚焦RTE配置失效的

weixin_34331102的博客 379

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

simulink stateflow 状态机

在tooltrip中选择DEBUG,通过Animation Speed可更改动画的播放速度。添加状态机的快捷操作transition上的数字代表执行顺序,选中transition后在toolstrip -> Execution Order可更改执行顺序在transition上可进行的操作下图的状态机中junction不属于状态,只负责条件的跳转,可用于实现类似if-else的结构after(N, sec)为EventNameDefault transition不能有任何的。

surfaceyan的博客 1万+

simulink中使用memory模块实现变量的累加和

在离散系统中,我们经常会遇到需要存储上一时刻的变量。比如y(k-1),然后用在当前时刻的运算里,这个时候我们就需要一个模块能够存储上一时刻的y(k-1),这个模块就是memory模块。一个很典型的例子就是用memory模块实现一个离散变量从初始时刻到现在时刻的累加和: 说明:这个模型的memory模块在第一时刻存储的为0,在第二时刻存储的是y(1),在第三时刻存储的是y(2)+y(1),。。。。。。这样结合求和模块就实现了累加和功能。 补充,我们可以用这个模块模拟simulink中的离散积分器模块: 上

zouxu634866的博客 3万+

佐治亚理工学院 计算投资公开课第六周作业 投资策略分析平台

策略分析平台 在前两周的工作中,实现了股票价格低于门限值这一策略的event study,即根据门限值来看事件发生前后股票的价格。同时,完成了根据下单的指令来进行回测,计算策略执行期间每一天的价值,以及对投资结果的分析。这一周,要求把这三部分结合起来,能够实现根据门限值直接回测生成过去时间段的下单指令,并进行计算分析。 工具和方法 编程工具 编程语言是python,用到的开源量化分

Focustc 5226

Simulink相关配置:Step函数接口配置

本文研究Simulink生成代码时的step函数的名称和参数。 文章目录1 问题引入2 配置过程3 代码生成4 总结 1 问题引入 在之前的一篇博客《Simulink代码生成:Simulink Function子系统及其代码》中,博主为了满足生成带有非空参数的函数这个需求,使用了Simulink Function子系统,基本上解决了问题。 但是这样的方案将Simulink Function子系统作为顶层模型,完全不符合一般的建模方式。通过更多的研究后,发现保持以前的建模方案,也可以通过配置生成特定接口的St

u013288925的博客 1万+

Simulink代码生成(二)——代码生成时模型的配置方法及操作流程

Simulink代码生成

Rlover_star的博客 5366

Simulink模型子系统单独文件代码自动代码生成

右键子系统-->Block parameter-->勾选“Treat as atomic unit”,然后在“Code Generation”选项卡中选择子系统的文件名称就可以了。答:simulink中有个概念叫做原子子系统(Atomic Subsystem),就是这个模型可以被别的模型无限次调用。因此只需要把你的子系统做成原子子系统就可以了。1、如何在生成代码时,生成不同的子模型单独代码文件,而不是全部在一个文件中?

weixin_40076423的博客 1239

simulink模块的回调函数

ParentCloseFcn:父层被关闭时,打开当前模块时触发。ContinueFcn:仿真时从pause状态继续仿真时触发。DestroyFcn:当前模块所占用的空间被释放时触发。ModelCloseFcn:当前所在的模型关闭时触发。NameChangeFcn:名字被改变时触发。DeleteFcn:本身模块被删除时触发。MoveFcn:当前模块被拖动时触发。InitFcn:该模块被仿真时触发。OpenFcn:双击模块打开时触发。PauseFcn:仿真暂停时触发。StartFcn:仿真启动时触发。

kaixuanji的博客 1217

Simulink的回调函数

在模型打开之前读取当前时间信息,并把时间信息赋值到基础工作区的current_date变量,如果没有则新建变量,'dase'表示基础工作区。如果需要在ModelWorkspace中修改或创建变量则需要先创建一个表示当前模型工作区的对象。模型初始化,每次打开模型的时候加载变量、每次打开模型的时候更新一些变量值;在Simulink模型的空白区域右键选择Model Properties。表示的模型工作区中的 MATLAB 变量。在弹出的窗口中选择Callbacks。仿真时执行一些脚本;

ArytonSenna的博客 1577

函数的复用

函数的复用可以通过以下几种方式实现: 1. 添加到lib库中 建立一个lib库,用来存放经常使用的模块,使用的时候直接从lib里边copy,生成的函数就是可以复用的。 2. chart默认可复用 嵌套在simulink模型中的chart模块是auto可reusable的,为了确保复用成功,可将Code Generation中Function packing 由默认的auto模式改为Reus

modolllee的博客 2899
上一篇: Simulink自动代码生成4——集成生成代码和外部代码(integrating generated code with external code)
下一篇: 控制算法简析1——PID和负反馈的数学原理
IHTY_NUI
博客等级 码龄9年 606粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值