当前位置: 首页 > 科技观察

如何通过Simulink实现数据滚动刷新

时间:2023-03-14 17:59:58 科技观察

最近有足友问如何在Simulink中实现数据的实时滚动?今天我就用这篇文章来解答。对于这个问题,大家可能都知道用C代码或者m语言怎么实现,就是对数据进行右移赋值。用Simulink基础模块搭建,对于没有接触过的人来说可能会比较吃力。因此,本文将介绍如何通过Simulink实现数据滚动。Simulink建模思路与C代码实现方法基本相同,主要分为右移和赋值两部分。最终构建的模块如下图所示。上图红框中的右移子系统需要使用迭代器和分配器,如下图所示。迭代器用于一步内连续输出N个值,可用于访问数组内部的数据。非常适合做数组索引,是处理数组类型数据的神器。分配器用于将数据分配到数组的指定位置。Y0为当前待处理的数组,Idx1为数组某位的索引,U为数组某位的具体值。假设Idx1=a,U=b,表达式的意思是用b代替数组Y0的第a位数值。因此,在上图中,通过迭代器和分配器的配合,在每一步仿真时,数组的每一位都被赋值给下一位,从而实现子系统右移的功能。上图绿框中的赋值部分比较简单。只有一个分配器,将实时刷新的值分配到第一位,实现数据更新。下面是一个简单的仿真验证,先进行模块的基本设置。这里滚动数组的长度设置为5,初始值为0,所以给Delay模块一个数组[00000]。模型中迭代器的长度设置为4,因为我们只需要处理数组的第一位。两个分配器都可以设置为基于One的Indexvector(port)。实时更新的数据我们给出一个初始值为0、斜率为1的线性递增的斜坡,然后进行步长为1s的定步长仿真,结果如下图所示。从图中可以看出:数组的第一到第五位在初始时刻全为0,即[00000];在1s内,数组的第一位刷新为1,即[10000];在2s时,数组的第一位刷新为2,第二位在1s时被第一位1覆盖,即[21000];在3s时,数组的第一位刷新为3,第二位在2s时被第一位的2覆盖,第三位在2s时被第二位的1覆盖,即[32100];...实现数据的实时滚动刷新。以上通过Simulink实现了数据的滚动刷新,在MBD开发过程中还是有很大的应用前景的。无论是车辆能耗的计算,还是动态规划等算法的实现,都可能用到滚动刷新的实时数据。