本文总结了一种非常令人迷惑的Simulink仿真时的报错,并提供了解决方法。
仿真模型使用了模型引用,并在workspace中通过Simulink.Signal的形式定义了一个全局变量,在父级模型和子级模型中都通过Data Store Read/Data Store Write使用了这个Simulink.Signal。
仿真时,模型报错信息如下:
Global Simulink.Signal object 'buff01' implies a global Data Store Memory block for the reference model 'child', so the property 'Complexity' must not be set to 'auto'
报错的模型如下:
父级模型
通过Data Store Write对全局变量赋值,并引用了child模型
子级模型
通过Data Store Read读取全局变量的值并参与运算
全局变量buff01(Simulink.Signal)的定义如下:
buff01 = Simulink.Signal;
buff01.InitialValue = '0';
buff01.DataType = 'uint16';
buff01.Dimensions = 1;
buff01.Complexity = 'auto';
buff01.Unit = '';
buff01.StorageClass = 'Auto';
这个报错的解决方案是将全局变量buff01的Simulink.Signal的定义中的Complexity改为real:
buff01.Complexity = 'real';
做了这项更改后,模型就可以正常仿真运行。
这个报错的迷惑之处在于,simulink提示Complexity属性必须被设置成auto,但设置成auto并不能解决问题,或者说本来就设置成了auto,但是依然报错。
而解决该问题的方法恰恰与报错提示信息相违背,将Complexity属性改成real,这就相当的迷惑了。
至于为什么改成real可以解决问题,以及为什么应该改成real,就不得而知了。作为被simulink的各种报错长年折磨的开发人员来说,可以用就行啦,并不想过度的去深究,毕竟matlab/simulink也是有不少的bug,比如本文提到的这个场景,也算是simulink的一个小bug了吧。
读者们觉得此文有用,欢迎点赞留言。
对于simulink迷惑性报错现象有感悟的读者们,欢迎留言交流。