I want connect line from in1 to terminator

6 次查看(过去 30 天)
  1. I disconnect the existing line.
  2. Create Terminator
  3. Connect from input to terminator
But, Occur error add_line (Error: Invalid simulink Object name).
How to solve this Error.
mdl = "test_model";
% system load
load_system(mdl);
% IO list loads
inports = find_system(mdl, 'SearchDepth', 1, 'BlockType', 'Inport');
outports = find_system(mdl, 'SearchDepth', 1, 'BlockType', 'Outport');
% find_system Prop (model name, find type, find type select, value, value type)
inports_suffix = inports_cell(mdl, inports);
outports_suffix = inports_cell(mdl, outports);
[inport_num,] = show_prompt(inports_suffix);
terminate_inport(mdl, inport_num, inports_suffix, inports);
% IO ports name subsystem/portsname -> portsname change func.
function inports_name_cell = inports_cell(mdl, inports)
inports_name_cell = cell(1, numel(inports));
for i = 1:length(inports)
inports_name_cell{i} = erase(inports{i}, [mdl, '/']);
end
end
function [show_prompt_idx,show_prompt_tf] = show_prompt(inports_suffix) % inport block name prompt
inports_name = strrep(inports_suffix,'/1','');
[show_prompt_idx,show_prompt_tf] = listdlg("SelectionMode", "single", "ListString", inports_name); % 입력값을 텍스트로 반환
end
function terminate_inport(mdl, inport_num, inports_suffix, inports)
term_block_name = ['Terminator_', num2str(inport_num)]; % Terminator 넘버링
term_block_path = mdl + '/' + term_block_name; % Terminator 경로와 이름 합치기
if(getSimulinkBlockHandle(term_block_path) == -1) % Terminator 가 없다면
position = get_param([inports{inport_num}], 'Position'); % inport블록의 위치 반환
left = position(1); % 1은 x좌표
top = position(2); % 2는 y좌표
right = position(3);
bottom = position(4);
add_block('simulink/Sinks/Terminator', term_block_path, 'Position', [left-80, top,left-70, top+14]); % terminator블록 생성
lines = get_param(inports{inport_num}, 'LineHandles'); % inport에 연결된 line정보 반환
terminators_suffix = [strrep(term_block_path,[mdl,'/'],''),'/1']; % Terminator의 경로를 제거하고 이름만 남긴 뒤, 포트 번호 입력
delete_line(lines.Outport);
add_line(mdl, inports_suffix{inport_num}, terminators_suffix); % inport 와 Terminator 연결
else % Terminator 가 있다면
disp("Terminator already exist.");
end
end
  2 个评论
Angelo Yeo
Angelo Yeo 2024-1-8
In order to find the precise cause and solution for the issue you are currently experiencing, I believe that the following additional information would be necessary. If you could provide the following information, it would enable contributors, including myself, to assist you more effectively:
1) Detailed description of the issue
2) Example files and data files that can reproduce the issue
  • What's the "model"?
  • What's the "inports_cell"?
  • etc
3) Exact steps to reproduce the same problem using the files you provided
4) All error messages that appear when the issue occurs

请先登录,再进行评论。

采纳的回答

Angelo Yeo
Angelo Yeo 2024-1-8
编辑:Angelo Yeo 2024-1-8
I have temporarily fixed your script. You can use outport and inport handles as mentioned in add_line. Please fix the script as you need.
mdl = "test_model";
% system load
load_system(mdl);
% IO list loads
inports = find_system(mdl, 'SearchDepth', 1, 'BlockType', 'Inport');
outports = find_system(mdl, 'SearchDepth', 1, 'BlockType', 'Outport');
% find_system Prop (model name, find type, find type select, value, value type)
inports_suffix = inports_cell(mdl, inports);
outports_suffix = inports_cell(mdl, outports);
[inport_num,] = show_prompt(inports_suffix);
terminate_inport(mdl, inport_num, inports);
% IO ports name subsystem/portsname -> portsname change func.
function inports_name_cell = inports_cell(mdl, inports)
inports_name_cell = cell(1, numel(inports));
for i = 1:length(inports)
inports_name_cell{i} = erase(inports{i}, [mdl, '/']);
end
end
function [show_prompt_idx,show_prompt_tf] = show_prompt(inports_suffix) % inport block name prompt
inports_name = strrep(inports_suffix,'/1','');
[show_prompt_idx,show_prompt_tf] = listdlg("SelectionMode", "single", "ListString", inports_name); % 입력값을 텍스트로 반환
end
function terminate_inport(mdl, inport_num, inports)
term_block_name = ['Terminator_', num2str(inport_num)]; % Terminator 넘버링
term_block_path = mdl + '/' + term_block_name; % Terminator 경로와 이름 합치기
if(getSimulinkBlockHandle(term_block_path) == -1) % Terminator 가 없다면
position = get_param([inports{inport_num}], 'Position'); % inport블록의 위치 반환
left = position(1); % 1은 x좌표
top = position(2); % 2는 y좌표
right = position(3);
bottom = position(4);
add_block('simulink/Sinks/Terminator', term_block_path, 'Position', [left-80, top,left-70, top+14]); % terminator블록 생성
lines = get_param(inports{inport_num}, 'LineHandles'); % inport에 연결된 line정보 반환
delete_line(lines.Outport);
%%%%%%%%%%%%%%%%%%%%%%%%%%%% TEMPORARILY FIXED %%%%%%%%%%%%%%%%%%%%%%%%%%%%
paramOut = get_param([inports{inport_num}], 'PortHandles');
paramIn = get_param(term_block_path, 'PortHandles');
add_line(mdl, paramOut.Outport, paramIn.Inport); % inport 와 Terminator 연결
%%%%%%%%%%%%%%%%%%%%%%%% TEMPORARILY FIXED DONE %%%%%%%%%%%%%%%%%%%%%%%%%%%
else % Terminator 가 있다면
disp("Terminator already exist.");
end
end

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Programmatic Model Editing 的更多信息

产品


版本

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by