Simulink建模助手系列-5【批量对齐模块】

Simulink建模助手系列-5

功能介绍

  Simulink建模有时为了美观,需要批量对齐多个单端口模块,例如《Simulink建模助手系列-4》中的Goto模块。

实现效果分别如下:

批量对齐模块

实现方法

  实现批量对齐选中模块功能,涉及的内容主要有:

  • 获取选中的指定类型的模块。
  • 通过选中模块的信号线获取两端的位置。
  • 计算垂向移动量,调整选中模块的位置。

实现该功能的主要流程如下:

主要代码

  对于输出端口模块(如From)和输入端口模块(如Goto)的代码细节略有不同,以对齐Goto模块为例介绍主要代码。

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

1)获取选中的指定类型的模块

matlab 复制代码
% 获取具有输入端口的模块,即信号线右边的模块
block_types = {'Outport','Goto','Terminator'};
blocks = [];
for i = 1:length(block_types)
    btmps  = find_system(currentSystem, ...
        'SearchDepth', 1, ...
        'Selected', 'on', ...
        'BlockType', block_types{i});
    blocks = [blocks;btmps];
end

通过预设模块的类型,明确可以处理的模块类型有哪些,单个输入端口的模块主要包括:'Outport','Goto','Terminator'。利用find_system()分别获取选中状态的这些类型的模块。

单个输出端口的模块主要包括:'Inport','From','Constant'。

2)获取信号线两端的位置

matlab 复制代码
% 逐个进行处理
blocki = blocks{i};

% 获取端口句柄,没有则跳过
myPorts = get_param(blocki, 'PortHandles');
myPortHandle = myPorts.Inport; % 关键词
if isempty(myPortHandle)
    continue;
end

% 获取信号线句柄,没有则跳过
lineHandle = get_param(myPortHandle, 'Line');
if lineHandle==-1
    continue
end

% 获取信号线两端的位置
linePoints = get_param(lineHandle, 'Points');
y_old = linePoints(end,2);
y_new = linePoints(1,2);

对于输入模块,对应的端口句柄用关键词Inport;对于输出模块,用关键词Outport。

与模块的位置信息不同,信号线的位置信息通过点坐标的形式存在,如果是折线,则会多于两个点。第一个点是信号线左侧端点的位置,最后一个是信号线右侧端点的位置。对于输入模块,右侧点是当前的位置,即old;左侧点是需要对齐的位置,即new。而对于输出模块,则相反。

因为只需要进行垂向的对齐,所以只需要信号线两端y向的坐标。

3)计算垂向位移量,修改选中模块的位置

matlab 复制代码
% 计算垂向位移位移量
y_move = y_new-y_old;

% 修改模块的位置
blockPos = get_param(blocki, 'Position');
blockPos(2) = blockPos(2)+y_move ;
blockPos(4) = blockPos(4)+y_move ;
set_param(blocki, 'Position',blockPos);

通过信号线左右端的高度差计算模块的位移量,依次调整模块的位置。

系列文章

Simulink建模助手系列-1【批量创建Goto和From】
Simulink建模助手系列-2【自动创建缺失的Goto】
Simulink建模助手系列-3【批量创建Inport和Outport】
Simulink建模助手系列-4【批量添加信号线】

相关推荐
Evand J2 天前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
星夜离尘563 天前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Evand J5 天前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
严肃小白兔6 天前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图
严肃小白兔7 天前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
Evand J8 天前
【PMSM例程】(14)永磁同步电机无迹卡尔曼滤波(UKF)定子电阻在线辨识与补偿。电阻变化跟踪及预测误差对比仿真。附完整代码的下载链接
matlab·电机·滤波·卡尔曼滤波·永磁同步电机·无迹卡尔曼滤波·pmsm
爱喝雪碧的可乐8 天前
MATLAB
开发语言·算法·matlab
严肃小白兔8 天前
MATLAB 优秀开源项目与工具箱推荐:涵盖通信、图像处理、脑机接口等九大领域
图像处理·matlab·信息与通信·开源项目
Evand J10 天前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
分享资料11 天前
MATLAB 中分号 (;)的作用
matlab