0
点赞
收藏
分享

微信扫一扫

Simulink标定量的自动赋值

星河出山 2022-04-20 阅读 19
matlab汽车

问题描述


工作中遇到对一些信号的处理,要用到大量同一封装模块,见图

上图中,名为signIn的信号从Inport输入,封装系统端口2、3、4、5均连接Constant模块,值为外部定义的标定量。这表定量的命名特点是:前缀+Port1端口输入信号名或其部分+后缀。比如端口1输入信号名为qwer,端口2、3分别命名为qianzhui2_er_houzhui2,qianzhui3_er_houzhui3,中间er为输入信号名的最后两位,前缀后缀则均不同。需要说明的是,对于不同封装模块的相同端口,其前缀和后缀又是相同的。

解决思路


  1. 通过名称找到我们需要的封装模块,并遍历。
  2. 在找到封装模块后,通过端口句柄寻找输入信号,并获取输入信号名称。
  3. 取2步骤中获得的信号名加以处理,形成端口2、3、4所需要的信号名,作为Constant模块的Value赋值。

Matlab脚本实现


clear;
subsys_cell = find_system(gcs,'SearchDepth',1,'BlockType','SubSystem');
% 找到当前SYSTEM下所有子系统,SearchDepth可更改

for i = 1:length(subsys_cell)
  subsys_handle = get_param(subsys_cell{i},'Handle');
  subsys_name = get_parm(subsys_cell{i},'Name');
  pre_name = subsys_name(1:7); % 取子系统名字前七位,用于选取目标封装模块
  if strcmp(pre_name,'aaaaaaa') % 假定目标封装模块命名为aaaaaaa1,aaaaaaa2....
     port_handle = get_param(subsys_handle,'PortHandles');
     preline_handle = get_param(port_handle.Inport(1),'Line') % 获取输入端口1信号线句柄
     presrc_handle = get_param(preline_handle,'SrcBlockHandle');\
     port1_name = get_param(persrc_handle,'InputSgnalNames');
     strpotr1_name = char(port1_name); % 获取端口1输入信号名称并转化为char类型

     pre_name = strport1_name(2:end); 
% 对信号名进行处理,我需要从第2位开始到结束的字符段,比如qwer,我需要的是er;
     preport2_name = strcat('qianzhui1_',pre_name,'_houzhui1');
% 处理端口2输入信号的变量名,最终形式为qianzhui1_er_houzhui1;
     preport3_name = strcat('qianzhui2_',pre_name,'_houzhui2');

     port2_name = char(perport2_name);
     port3_name = cahr(perport3_name); 
% 将元胞数转化为char,这样才能作为变量写入Constant的Value
     
     for j = 2:3
       line_handel = get_param(port_handle.Inpotr(j),'Line');
       src_handle = get_param(line_handle,'SrcBlockHandle');
       if j == 2
         set_param(src_handle,'Value',potr2_name);
       else
         set_param(src_handle,'Value',port3_name);
       end
     end
   end
end

如需转载,请注明出处。

举报

相关推荐

0 条评论