Matlab/Simulink几个开发小工具
1.数据记录功能实现
提供两个函数SgnDataLogOn和SgnDataLogOff用于控制Simulink模型中所有信号线的数据记录状态。SgnDataLogOn通过find_system查找当前系统中的所有信号线,使用循环将每条线的DataLogging属性设置为1(启用)。SgnDataLogOff执行相反操作,将属性设置为0(禁用)。这种功能特别适用于仿真过程中需要观测特定信号数据时快速切换记录状态。
%%%%%%将当前页面的dataloging打开,可用于仿真观测数据 function SgnDataLogOn line = find_system(gcs,'FindAll','on','SearchDepth','1','Type','line'); for i=1:length(line) set(line(i),'DataLogging',1); end%%%%%%将当前页面的dataloging打开,可用于仿真观测数据 function SgnDataLogOff line = find_system(gcs,'FindAll','on','SearchDepth','1','Type','line'); for i=1:length(line) set(line(i),'DataLogging',0); end2.模块标准化
From/Goto模块标准化处理
通过BlockStandardization函数对模型中的From/Goto标签模块进行尺寸规范化。函数会获取所有From和Goto模块的位置信息,统一设置为宽度30像素、高度12像素的矩形区域。处理逻辑考虑了单模块和多模块的不同情况:当存在多个同类型模块时使用循环处理,单个模块时直接设置参数。这种标准化使得模型布局更加整洁统一。
端口模块视觉优化
对模型中的输入/输出端口进行视觉区分处理。将所有内层Inport和Outport模块尺寸固定为20x20像素的正方形,并将背景色设置为黑色,形成圆形外观。这种设计实现了层次化视觉区分:外层端口保持默认样式,内层端口通过黑色圆形标记,显著提升模型可读性。代码同样处理了单端口和多端口的差异情况。
输出端口自动命名
智能同步输出端口名称与连接信号线名称。通过获取输出端口连接线的名称,自动将端口名称更新为信号线名称。实现逻辑包括:获取端口句柄、定位连接线对象、比较名称差异等步骤。该功能确保端口名称始终与传输信号保持一致,避免人工命名可能产生的错误,特别适用于大型模型中频繁的信号传递场景。
function BlockStandardization(~) %FromGoto大小设置 FromBlock= find_system(gcs,'FindAll','on','SearchDepth','1','BlockType','From'); FromBlockPos=get_param(FromBlock,'Position'); GotoBlock= find_system(gcs,'FindAll','on','SearchDepth','1','BlockType','Goto'); GotoBlockPos=get_param(GotoBlock,'Position'); FromBlock_Length=length(FromBlock); GotoBlock_Length=length(GotoBlock); if FromBlock_Length>1 for i=1:length(FromBlock) set_param(FromBlock(i),'Position',[FromBlockPos{i}(1) FromBlockPos{i}(2) FromBlockPos{i}(1)+30 FromBlockPos{i}(2)+12]); end elseif FromBlock_Length==1 set_param(FromBlock,'Position',[FromBlockPos(1) FromBlockPos(2) FromBlockPos(1)+30 FromBlockPos(2)+12]); end if GotoBlock_Length>1 for i=1:length(GotoBlock) set_param(GotoBlock(i),'Position',[GotoBlockPos{i}(1) GotoBlockPos{i}(2) GotoBlockPos{i}(1)+30 GotoBlockPos{i}(2)+12]); end elseif GotoBlock_Length==1 set_param(GotoBlock,'Position',[GotoBlockPos(1) GotoBlockPos(2) GotoBlockPos(1)+30 GotoBlockPos(2)+12]); end %内层port规范化,小圆形黑色底,与最外层Port区分开 InportBlock=find_system(gcs,'FindAll','on','SearchDepth','1','BlockType','Inport'); OutportBlock=find_system(gcs,'FindAll','on','SearchDepth','1','BlockType','Outport'); InportBlockPos=get_param(InportBlock,'Position'); OutportBlockPos=get_param(OutportBlock,'Position'); InportBlock_Length=length(InportBlock); OutportBlock_Length=length(OutportBlock); if InportBlock_Length>1 for i=1:length(InportBlock) set_param(InportBlock(i),'Position',[InportBlockPos{i}(1) InportBlockPos{i}(2) InportBlockPos{i}(1)+20 InportBlockPos{i}(2)+20]); set_param(InportBlock(i),'BackgroundColor','black'); end elseif InportBlock_Length==1 set_param(InportBlock,'Position',[InportBlockPos(1) InportBlockPos(2) InportBlockPos(1)+20 InportBlockPos(2)+20]); set_param(InportBlock,'BackgroundColor','black'); end if OutportBlock_Length>1 for i=1:length(OutportBlock) set_param(OutportBlock(i),'Position',[OutportBlockPos{i}(1) OutportBlockPos{i}(2) OutportBlockPos{i}(1)+20 OutportBlockPos{i}(2)+20]); set_param(OutportBlock(i),'BackgroundColor','black'); end elseif OutportBlock_Length==1 set_param(OutportBlock,'Position',[OutportBlockPos(1) OutportBlockPos(2) OutportBlockPos(1)+20 OutportBlockPos(2)+20]); set_param(OutportBlock,'BackgroundColor','black'); end %将输出port名字自动改为线上的名字 for i=1:length(OutportBlock) OutportName = get_param(OutportBlock(i),'Name'); OutportHandle = get_param(OutportBlock(i),'Handle'); PortHandle = get(OutportHandle,'PortHandles'); OutputHandle = PortHandle.Inport; LineHandele = find_system(gcs,'SearchDepth',1,'FindAll','on','Type','Line','DstPortHandle',OutputHandle); LineName=get_param(LineHandele,'Name') if ~strcmp(OutportName,LineName) if ~isempty(LineName) set(OutportBlock(i),'Name',LineName); end end end后面会将这些小的功能集成到一个app里面,更加方便快捷~
