本文研究Assignment模块的用法和该模块生成的代码。
文章目录
1 Simulink中的Assignment模块
最近在建模地时候遇到一种需求,在控制器运行的过程中需要更新某个Vector信号中的某个元素。从C语言的角度去理解,就是将一个变量赋值给数组中的某个元素。
博主研究后认为可以通过Assignment模块实现这个需求。Assignment有分配、指派的含义,在建模中这么理解也是很贴切的。相对应的,从一个Vector信号中提取某个元素可以用Selector模块,博主以前的博客也写过。
2 Assignment模块的模型和参数
本章会用Assignment模块建一个简单的模型,来体会一下这个模块的用法。
1)在Simulink中拖出一个Assignment模块,并将其参数配置如下。注意不同的参数配置后,模块的外观和端口会有所变化。
其中比较重要的参数及其含义如下:
- Number of output dimensions设置为1,指的是需要修改的元素个数,而不是输出信号的元素个数。该参数设为几,下面的窗口就有几个序号需要分别配置;
- Index mode设置为Zero-based,也就是索引从0开始;
- Index Option设置为Index vector(port),表示索引号从外部端口输入,对应的是模块中的Idx1_0;
- Initialize output (Y)设为Specify size for each dimension in table,这样上面会激活Output Size
- Output Size设为3,表示输出信号有三个元素;
2)给模块加上输入输出如下:
- 输入端U指的是需要分配的数值,这里写4;
- 输入端Idx1_0指的是输出信号的那个元素赋值,这里的1代表第二个元素,因为上文配置了Zero-based;
3)仿真一下模型可以看到输出的数组是[0,4,0],也就是将第二个元素分配了4这个数值。
3 Assignment模块的代码
通过生成代码,可以更好的理解Assignment模块的机制,并且不同的参数对应的代码会是完全不同的含义。
1)将第2章的输入输出都替换成Inport或者Outport,然后Ctrl + D仿真以下,输出port会自动继承dimensions为3.
2)Ctrl + B生成代码如下
从step函数可以看出,In2是作为Out1的索引,In1赋值给Out1[In2]这个元素了,和模型的逻辑相符合。然后再去头文件中可以看到Out1的类型定义,是三个元素的数组。
4 Assignment模块的其他配置
4.1 Index mode配置
把Assignment模块的Index mode设置为One-based如下:
重新生成代码后,代码中的索引会多出一个减1的运算。
博主还是比较喜欢选择Zero-based,因为和C语言的语法习惯比较符合。
4.2 Initialize output (Y)配置
这个配置会影响输出数组的初始化,博主认为会有很大差别。将Initialize output (Y)配置成默认的Initialize using input port 后,模块就会多出一个Y0的输入端口。
将Y0初始值设为[0,0,0]表示数组的Dimesion是3,以及初始值。
重新Ctrl + B生成代码如下:
可以看出,在step函数中会对Out1做一个0初始化操作。这样的话,每个周期运行一次step函数就会清空数组再给数组赋值了,没法保持以前的赋值。
所以在大多数情况下,应该是不会采用这种配置的。
5 总结
Assignment模块的使用方法比较简单,也可以和循环子系统配合使用。