MBD的Simulink使用技巧——(1)

1.一个模型要能生成嵌入式代码,至少需要满足以下两个要求:

  • Simulink求解器设置为定步长;
  • 选择代码生成的系统目标文件ert.tlc

实际中,生成嵌入式代码几乎不会使用Simulink模型库中的连续模型,往往需要通过最简单的离散模块来实现算法模型。

2.生成的代码文件位于模型同级目录下“模型名_ert_rtw”文件夹内,这六个文件的作用分别是:

  • ert_main.c:该文件是一个样例文件,向用户展示主程序如何调用模型代码,在代码集成时可以参考该文件;
  • 模型名.c:该文件包含模型的全部实现方法,包含变量的声明和定义,Step函数、初始化函数、终止函数等的定义和实现,即“模型的本身”;
  • 模型名.h:该文件包含模型所依赖的数据结构、数据类型的定义和声明,以及模型变量、模型算法函数的外部声明;
  • 模型名_private.h:包含模型本地的宏和数据类型定义,有定义才会生成相关内容;
  • 模型名_types.h:该文件包含模块参数(Parameters)和模型数据(Model Data)的数据结构的向前声明,在一些可重用函数中可能会被使用;
  • rtwtypes.h:定义了基本的数据类型和宏,大部分的生成代码可能会依赖该文件;
  • 模型名_data.c:上图中没有生成,但在某些情况下会生成该文件,其中包含模型中的模块参数(Parameters)、常数模块和I/O的数据结构的定义和声明。

算法模型的核心应用代码是在“模型名.c”中实现的,其他文件更多的是实现数据结构定义、数据类型定义、变量声明、函数声明等功能。

ert_main.c中给出是Step函数的一种使用示范,它将Step函数进行了一层封装形ert_OneStep()函数,添加了错误状态检查功能。用户可以参考它,也可以不参考,直接使用Step函数。

对于代码集成来说,用户只需要在主函数代码中,添加下面这个语句,即可使用模型生成的代码,实现相关的算法和功能: 

#inlcude "模型名.h"

3.模型中的数据

3.1 信号(Signals),即模型中不同模块之间的数据传递线,有两种:外部信号内部信号。其中外部信号又分为外部输入信号和外部输出信号

保持默认设置情况下生成代码,外部信号会生成全局变量,其中输入变量为“模型名_U”,而输出变量为“模型名_Y”;对于内部信号,只有具有分叉点的信号线会生成局部变量,变量名为“rtb_信号名”。由于是局部变量,它会随着Step函数的出栈而被释放。其他不具备分叉点的内部信号,不会生成任何变量,而是隐含在算法的运算过程当中

3.2参数(Parameters)指的是模块的参数,例如:本文PI控制器模型中的PI增益模块,它们的参数分别实现Kp和Ki。保持默认设置情况下,模块的参数会作为数值常数,直接用于算法的运算过程。有的时候,我们不希望模块参数是一个数值常量,而是一个可以修改的变量。让模型参数是可调(Tunable)的,这样便会生成一个新的变量来保存模型中所有模块的参数。修改模块参数的生成方式后,重新生成代码。可以看到,在“模型名.h”中会生成一个新的数据结构体,包含了所有模块的全部可调参数,用于存储模块参数的变量名为“模型名_P”。

3.3状态(States)是离散系统运算过程中必不可少的元素。离散系统是在每一个离散的时间点上, 运行一次Step函数。某一时刻运行一次Step函数,除了需要输入数据(通过外部输入信号输入)以外,往往还需要上一个时刻的运算结果,甚至之前连续几个时刻的运算结果。在嵌入式系统中,这些结果需要一个变量来存储,这个变量即为状态变量。在Simulink模型库中,凡是包含离散因子“z”的模块,全部具有状态变量。这些模块在生成代码时,都会生成一个名为“模型名_DW”的变量来保存状态变量。

用户还可以定义自己的“状态变量”,通过Data Store Memory模块即可实现。Data Store Memory模块与离散模块一样,被当作状态变量,生成在变量“模型名_DW”当中。虽然我们称它为状态变量,但对于Data Store Memory模块,把它当作普通的变量来使用也是可以的。

3.4模型数据是Simulink为模型定义的一个数据类型,它保存了模型的部分信息。默认情况下,模型数据只包含了一个表示错误状态的字符串,他的变量名为“模型名_M”。在实际中,很少会使用Simulink默认的模型数据定义

4.规范建模过程

  • 为端口、信号线、子系统、模块等命有意义的名字,而不是空着,或命名无意义;
  • 建模时,遵循信号从上到下、从左到右的传递顺序,而不是杂乱无章的到处飞线,尽量避免信号逆向传递,无法避免时尽量少而清晰。
  • 合理使用子系统模块、参考子系统模块、参考模型,构建合理的模型框架和层级;
  • 一个功能的模型不要太复杂,复杂的模型可以考虑分层简化,子系统模型不要嵌套太多层;
  • 建模的过程,要考虑模型的可重用性、模型的独立性;
  • 可以使用脚本来定义模型数据,这样可以扩展模型的功能。

5.生成代码结构

模型生成的应用代码,其结构由三部分组成,这三部分代码也被称为模型入口函数(Model Entry-Point Functions),具体如下:

  • 模型初始化函数
  • 模型Step函数
  • 模型终止函数

5.1 模型初始化函数是用来初始化模型中的数据的,大多数情况下指的是状态变量的初始化。初始化函数在调用Step函数之前调用一次,以完数据的初始化。如果没有数据需要初始化,则可以不调用。

5.2 Step函数即模型本身,Step函数实现模型算法的一个步长运算。由于嵌入式系统一般是实时系统,且步长固定,所以Step函数要放在一个周期中断ISR里,被周期性的调用运算。

调用Step函数的周期中断ISR要满足以下两点:

  • 周期中断ISR的步长要和模型中设置的步长保存一致;
  • 在一个周期内,必须保证所有的运算任务能够完成。

5.3 模型终止函数完全退出Step函数后,调用一次。但终止函数在绝大多数情况下都是空的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值