确保输出端口是虚拟的
在某些情况下,Simulink®控件之前添加一个“隐藏信号缓冲区”外港块在条件子系统中或在外港块在模型的顶层。实际上,Simulink插入一个信号复制块,尽管该块不会出现在画布上。对象的一致初始化外港块的信号。
在某些情况下,将此信号缓冲区与条件输出信号或部分写信号一起添加会导致不同的模拟结果。的参数确保输出端口是虚拟的期权是外港块来删除缓冲区。当您关心条件或部分写信号时,选择此选项。
条件输出信号
考虑下面的模型。要打开模型,请参见ex_conditional_write
.
的合并块将其输入组合成一个信号,该信号在任何时候的值都等于其驱动块最近计算的输出。
对于大多数模型的情况,清除确保输出端口是虚拟的的复选框。外港连接到的块已启用的子系统C
.
的外港块遵循非虚语义。方法之前,如果需要,则插入隐藏缓冲区外港块。
对象的一致初始化外港块的信号。
0:一个
运行时,C
不运行,但因为缓冲区在吗一个
,它运行并将初始值0复制到外港块。B不运行。的输出,合并信号为零一个
.
时间0.5:A不运行。B运行并输出正弦波。合并信号是正弦波来自B
.
时间1。一个
运行时,C不会运行,但缓冲区再次运行,并将初始值0复制到外港块。B不运行。的初始值一个
,不是最后一个值B
.
用固定步长模拟该模型,得到如下结果。
对于关心条件和部分写入的情况,选择(选中)确保输出端口是虚拟的复选框。外港block连接到Enabled子系统C。
的外港块遵循虚拟语义。
对象之前没有插入隐藏缓冲区外港子系统的块。
如果Simulink确定需要缓冲区,则会显示错误。
0:一个
运行时,C不运行。B不运行。合并信号是信号的初始值。
时间0.5秒:A不运行。B运行并输出正弦波。合并信号是来自B的正弦波的值。
时间1:一个
运行时,C不运行。B不运行。合并信号是最近计算的输出,是来自B的正弦波。
用合并块部分写信号
典型的建模模式是,您希望初始化一个矢量信号,然后根据某些条件或输入定期更新信号的部分元素。对该模式建模的一种方法是使用合并块,它的输入来自两个函数调用子系统块。一个子系统是初始化任务,而另一个子系统是周期性写任务。
下面的模型演示了这种模式。的Initialize_Process_Subsystem在模拟开始时调用一次,以初始化矢量信号。的Run_Process_Subsystem调用,以对向量的元素进行部分写入。的输出赋值块需要一个隐藏缓冲区不会复制该向量的路径。选择确保输出端口是虚拟的的复选框。外港块删除一个隐藏缓冲区。如果Simulink确定缓冲区是需要的,则会显示错误。要打开模型,请参见ex_partial_write_single_merge
.
的Initialize_Process_SubSystem
初始化2元素向量的每个元素,其值为
7
.输出矢量
7 [7]
.
的Run_Process_Subsystem
输入索引值为1,但由于索引模式参数。选择器Blocks被设置为
从零开始的
,它们从输入向量中选择第二个元素。控件的输出标量值选择器的结果
4
.因为赋值块索引模式参数设置为
从零开始的
输入索引Idx1为1
,输出信号需要是一个长度为2的向量。设置完成后输出的大小参数2
, assign块就可以写第2个元素。选择确保输出端口是虚拟的复选框将删除隐藏缓冲区。
从这个模型生成的代码包含两个函数。Init_Proc
而且Run_Proc
.
/*模型步长函数*/ void Init_Proc(void) {int32_T s3_iter;/*用7.0 */初始化信号向量元素(s3_iter = 0;S3_iter < 2;s3_iter++) {PartialWriteSingleMerge_DW。赋值[s3_iter] = 7.0;} for (s3_iter = 0;S3_iter < 2;s3_iter++) {PartialWriteSingleMerge_Y。Out4[s3_iter] = partialwritesinglemerge_dww . assignment [s3_iter];}} /*模型步长函数*/ void Run_Proc(void){/*写入输出信号向量的元素1 */ PartialWriteSingleMerge_Y。Out4[1] = 4.0;}