zl程序教程

您现在的位置是:首页 >  其他

当前栏目

使用 M 脚本更改 Simulink 信号线名称

2023-04-18 14:10:30 时间

目录

1. 思路

2. 举例:为选中子系统的信号输出线自动命名

3. 举例:自动将 CAN Unpack 输出信号线命名为 CAN Msg 名称


1. 思路

本质上分为两步:

  1. 找到信号线
  2. 更改信号线的“Name”属性

其中第 2 点参考以前的博文《Simulink批量更改模块属性

那么重点就是如何找到信号线

这里和 Block 不同,无法通过“Name”找到信号线,因为信号线还没有命名(狗头)。

而信号线前序模块Outport 句柄,就是信号线本身句柄,这样一来,信号线就通过句柄来找到了。

2. 举例:为选中子系统的信号输出线自动命名

Ops =  get(gcbh,'PortHandl');
hds = Ops.Outport; % 获得 In1 输出端口的句柄,也就是信号线的句柄
[~,hd_num] = size(hds); % size 函数返回的是选中模块输出句柄的大小 [1 3],这里只用第二维数字
for i = 1:hd_num
    set(hds(i),'Name',['test',num2str(i)])
end

 执行完以上脚本后,效果如下:

思考:如何将子系统的输出信号名称自动命名为子系统的输出端口名,就如上图的 AAA BBB CCC

思路:首先要获得子系统的输出端口,可获得进入到子系统,根据 BlockType 获得所有 Output 的序列号和名称,按顺序将 Output 的名称命名到子系统输出信号线上。

3. 举例:自动将 CAN Unpack 输出信号线命名为 CAN Msg 名称

image.png

 CAN Unpack 配置如下:

image.png

M 脚本如下:

Sgnls =  get(gcbh,'SignalInfo'); 
% 获得所有信号的所有信息:'CANInfo01$0$4$2$2$1$0$1$-10$0$15$#CANInfo02$4$4$2$2$1$0$2$0$0$15$#'
% 可以看出,Msg由#分割,每个Msg有11个元素,各元素由$分割,元素内容和Block Parameters中的一一对应
Sgnls_array = split(Sgnls,'#'); % 将每条Msg分割,关键字用的#,所以末尾会多出一个空元素
[Sgnls_size,~] = size(Sgnls_array); % 获得的信号数量多了1,原因如上
PHs = get(gcbh,'PortHandles'); % 获得CAN Unpack的端口句柄
hds = PHs.Outport; % 获得输出端口句柄
for i = 1:Sgnls_size - 1
    Items_array = split(Sgnls_array{i},'$');
    set(hds(i),'Name',Items_array{1});
end

 效果如下:

image.png