在使用了模型引用的模型中使用Data Store Read/Data Store Write时的问题

本文总结了一种非常令人迷惑的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迷惑性报错现象有感悟的读者们,欢迎留言交流。

### Simulink中Data Store与总线的使用方法 在Simulink环境中,`Data Store` 和 `Bus` 是两种重要的机制,分别用于存储和传递数据。以下是关于它们的具体用法以及常见错误的解决方案。 #### 数据存储 (`Data Store`) 的基本概念 `Data Store` 可以用来记录某个局部或全局的数据变量在整个仿真过程中所有间步中的值[^1]。通过这种方式,可以在多个模块之间共享数据而无需显式的信号连接。为了实现这一功能,通常会配合使用 `Data Store Write` 和 `Data Store Read` 模块来完成写入和读取操作[^2]。 #### 创建并配置 Data Store 要创建一个新的 `Data Store`,可以通过以下方式设置其属性: - 打开 **Model Explorer** 工具窗口,在其中定义新的 `Data Store Memory` 对象。 - 设置该对象的作用域(Scope),可以选择为当前子系统或者整个模型范围内的其他部分可见。 - 配置初始条件和其他参数以便满足特定需求。 当需要调试涉及复杂逻辑控制流的应用场景,可以利用 **Model Data Editor** 来进一步管理这些信号及其关联特性[^3]。 #### 总线 (Bus) 结构简介 对于多路输入输出的情况,采用总线结构能够有效简化设计布局。具体做法如下: ##### 构建 Bus Signal 1. 将若干条独立路径组合成单一复合形式; 2. 利用专门提供的工具箱组件如 `Bus Creator` 实现上述目标; ##### 处理嵌套关系 如果存在层次化的组织模式,则允许建立更深层次上的封装——即所谓的“nested buses”。此需要注意的是必须正确指定各层之间的映射规则以免发生冲突现象。 #### 解决常见的兼容性问题可能会遇到因类型不匹配而导致无法正常运行的现象。针对这种情况可采取下列措施之一加以修正: - 明确声明每一个端口所期望接收的内容格式; - 运用转换器(`Converters`)调整实际传输过来的信息使之符合预期标准。 ```matlab % 示例代码展示如何验证 bus element 是否一致 function checkBusCompatibility(busObj, signalName) % 获取bus object下的element列表 elements = getElements(busObj); % 查找对应名称的element是否存在 matchFound = false; for i=1:length(elements) if strcmp(elements(i).Name, signalName) disp('Signal matches with an existing bus element.'); matchFound = true; break; end end if ~matchFound error(['No matching bus element found for ', signalName]); end end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值