Simulink建模助手系列-2【自动创建缺失的Goto】

Simulink建模助手系列-2

功能介绍

Simulink建模有时会出现From没有对应Goto的情况,而且这种情况默认不会报错,没有Goto的From会被设置为0,从而导致模型运行结果不对。此功能是为了解决这个问题:检测模型当前路径的From是否都有对应的Goto,如果没有则自动创建缺失的Goto。实现效果如下:

自动创建缺失的Goto模块

实现方法

为了实现这个功能,涉及的内容主要有:

  • 获取模型当前路径下所有From模块对应的GotoTag标记集合。
  • 判断是否存在相应的Goto模块。
  • 创建缺失的Goto模块,并修改其属性(标记、位置、大小等)。
    此外, 为了凸显新建的Goto模块,可以选择通过选中,或高亮的方式突出自动创建的Goto模块。
    实现该功能的主要流程如下:

主要代码

有些函数如果在之前的文章中已经进行了介绍,这里就仅简单说明下用来干什么。

1)获取所有的From模块的GotoTag集合

matlab 复制代码
% 获取From
blocks = find_system(gcs, ...
    'SearchDepth', 1, ...
    'BlockType', 'From');
% 获取GotoTag集合,去除重复项
gotoTags = unique(get_param(blocks,'GotoTag'));

利用find_system()函数获取模型当前路径下的所有From模块;利用get_param()函数获取From模块的GotoTag属性;利用unique()函数去重。

2)逐个创建缺失的Goto模块

matlab 复制代码
% 逐个查找对应的Goto模块
gotoTag = gotoTags{i};
gotoi = find_system(gcs, ...
            'SearchDepth',1, ...
            'BlockType', 'Goto', ...
            'GotoTag',gotoTag);
% 如果已有,跳过该项
if ~isempty(gotoi)
    continue;
end
% 没有则创建新的Goto模块,并设置相应的GotoTag
blockName = [gcs,'/','Goto'];
blockObj = add_block(['simulink/Signal Routing/','Goto'], ...
            blockName, 'MakeNameUnique','on');
set_param(blockObj, 'GotoTag', gotoTag);

这部分利用find_system()查找指定GotoTag属性的Goto模块;利用add_block()函数创建新的Goto模块;利用set_param()函数设置新建Goto的GotoTag属性。

3)修改新建Goto模块的属性

matlab 复制代码
% 获取第一个from的位置,用于定位新建的Goto模块
fromi = find_system(myBlock,'SearchDepth',1, ...
    'BlockType', 'From', ...
    'GotoTag',gotoTag);
gotoPath = fromi{1};
gotoPos = get_param(gotoPath, 'Position');
% 新建的Goto位于From的左侧
x_move = 20;
x1 = gotoPos(1)-x_move-gotoPos(3)-gotoPos(1);
x2 = x1+x_w;
blockPos = [x1, gotoPos(2), x2, gotoPos(4)];
% 修改新建Goto的位置和大小
set_param(blockObj, 'Position', blockPos);

利用find_system()查找指定GotoTag属性的From模块,并取出第一个用于定位新建的Goto模块;利用get_param()函数获取该From模块的位置属性,并计算新建Goto模块的位置和大小,根据习惯Goto位于From的左侧;利用set_param()函数设置新建Goto的Position属性。

4)突出显示新建的Goto模块

matlab 复制代码
% 将新建的Goto设置为选中
set_param(blockObj, 'Selected', 'on'); 
% 将新建的Goto设置为高亮
hilite_system(blockObj); 

利用set_param()修改Goto模块的Selected属性,使其处于被选中的状态;利用hilite_system()函数可以将Goto模块的设置为高亮,该函数还可以进行高亮样式的自定义,我一般都是只用默认的样式(偷懒🐶),关于该函数更详细的介绍可以看Matlab的帮助,里面还是比较详细的。

选中和高亮一般选一个就可以了,个人推荐用选中,这样可以一次性移动所有新建的Goto模块。

完整代码

完整代码主要是加个循环,这里就不重复写代码了,避免有水字数的嫌疑(😝)。

系列文章

Simulink建模助手系列-1【批量创建Goto和From】

相关推荐
guygg881 天前
极化码(Polar Codes)的MATLAB实现
开发语言·数据结构·matlab
机器学习之心1 天前
电池SOH估计和RUL预测,基于BiLSTM神经网络的锂电池健康状态估计和剩余寿命预测,MATLAB代码
人工智能·神经网络·matlab·电池soh估计·rul预测·bilstm神经网络
ghie90901 天前
MATLAB 解线性方程组的迭代法
开发语言·算法·matlab
简简单单做算法2 天前
基于Qlearning强化学习的免授权频谱下NR-U与WiFi共存资源最优分配策略matlab仿真
matlab·wifi·qlearning·免授权频谱·nr-u·资源最优分配
wearegogog1232 天前
光伏发电系统最大功率跟踪(MPPT)算法 Matlab 实现指南
开发语言·算法·matlab
slandarer2 天前
MATLAB | R2026a 更新了哪些有趣的新东西?
开发语言·数据库·matlab
gihigo19982 天前
MATLAB地震面波数值模拟方案
开发语言·matlab
可编程芯片开发2 天前
基于Voronoi自适应分区的Qlearning强化学习粒子群算法的海上风电场电气系统拓扑优化matlab仿真
matlab·voronoi·qlearning·拓扑优化·自适应分区·海上风电场
关岭风尘2 天前
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(九) - BLDC电机滑行状态低占空比启动波形分析
matlab·电机控制·bldc仿真·电机续流·滑行启动
Not Dr.Wang4222 天前
基于matlab的控制系统奈氏图及其稳定性分析
数据结构·算法·matlab