1. 思路
本质上分为两步:
- 找到信号线
- 更改信号线的“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 名称
CAN Unpack 配置如下:
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
效果如下:
版权归原作者 驼房营木匠 所有, 如有侵权,请联系我们删除。