在MATLAB function 块中直接用persistent定义变量即可实现有记忆的变量。
以下为原贴。
一、fcn函数
MATLAB Fcn模块的作用是将一个函数插入Simulink中作为一个模块使用。类似C/C++中函数封装,可以通过在封装中手动设置输入输出值实现多输入多输出函数。这实际上比C/C++的函数来得强大(C中函数只能返回一个值,要实现多输出需借助数组等工具),但是会增加仿真到实验平台的移植难度。如果在设计中大量用到多输出函数,最好提前规划好移植到单片机等C语言开发平台的方式。调用步骤:
①
②
③
二、全局变量
在C/C++中,如果需要一个有记忆的变量并通过调用函数对其进行不断的加工处理,可以通过在函数外定义全局变量实现。但Simulink是一个图形化的仿真平台,代码部分只存在于fcn中,不能在fcn之外定义变量。
一个实现方法是利用Data Store模块(或许有更方便的实现方法,欢迎赐教)。
Data Store模块分为三类:
①Data Store Memory ①定义变量
②Data Store Read 顾名思义,其作用分别为: ②对变量进行读操作
③Data Store Write ③对变量进行写操作
实现方法有两个:
2.1 通过图形编辑的方式
举例:获取输出电压上一时刻的值并在函数中进行相关处理。步骤:
①利用 Data Store Memory定义全局变量。
②定义相关读写模块
③通过图形化编程得到所需变量。如本例中,通过延时模块可将此刻测量值保存到下一次采集使用,实现了获取上一时刻输出电压的目的。将其输入Data Store Write模块:
④将Data Store Read模块加入fcn函数。
fcn函数输出为此刻电压减去上次电压值,过程中对电压进行扰动,仿真如图,成功实现。
2.2 通过fcn函数编程实现
①与2.1相同。为避免混淆,全局变量更名为“v2_last”
②在fcn函数中添加全局变量
将变量类型选为Data Store Memory,此时已经将变量添加到fcn中。
③定义全局变量
在fcn中将全局变量声明为global类型,即可使用。函数实现:
得到的结果与第一种方法一致。
过程中可能会出现数据类型报错:
在Data Store Memory模块中对数据类型进行修改即可。
个人推荐第二种方法。一是有些数据操作用图形编程的方式实现起来会有难度,二是图形编程移植为C代码不一定简单,三是线少,仿真更整洁。
其实实现起来非常简单,第一次实现后根本没想到需要发教程。但时隔两个月再去使用修改,过程中出现了一些遗忘和bug,浪费了时间。所以以教程的形式记录下来,以备自己遗忘,以及分享给需要的朋友。