add_line connection for to column cells

11 vues (au cours des 30 derniers jours)
Tommy
Tommy le 7 Mar 2025
Commenté : Tommy le 28 Mar 2025
Hi there,
While creating column Cells connections, last cell in each column still not connected...stayed unconnected.
I wonder if someone can assist to solve this problem.
please see shared Matlab code (file.m) and picture (marked in red line)
Thanks for help
Tommy
open_system('Module_arc')
mdl = 'Module_arc';
bat_rec_model = find_system(mdl,'FindAll','on','Name','Module_arc');
%%% add Cell - basic CELL_unit:
for i=1:2 %% set two columns
colPos = 200; %% spaces between columns
for v=1:4 %% loop for 13 cells per column
nl=num2str(v + 4*(i-1));
if i==1
AddCell(v) = add_block('CELL_Unit/CELL 1', [mdl,'/CELL ',nl]);
else
AddCell(v) = add_block('CELL_Unit2/CELL 1', [mdl,'/CELL ',nl]);
end
posc = get(AddCell(v),'Position');
set(AddCell(v),'Position',posc + [100+(i-1)*colPos 120*(v-1)-45 100+(i-1)*colPos 120*(v-1)-45])
PH_AddCell{v}=get(AddCell(v),'PortHandles');
%%% connect minus to plus ports:
if v>1
add_line(mdl,PH_AddCell{v-1}.LConn(2),PH_AddCell{v}.LConn(1),'Autorouting','on');
end
end
switch i
case 2
Minus_2_Cell = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','NEG');
PH_minus2Cell=get(Minus_2_Cell,'PortHandles');
Neg_port= add_line(mdl,PH_minus2Cell.RConn,PH_AddCell{1}.LConn(1),'Autorouting','on');
case 1
Plus_2_Cell = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','POS');
PH_plus2Cell=get(Plus_2_Cell,'PortHandles');
Pos_port= add_line(mdl,PH_plus2Cell.RConn,PH_AddCell{1}.LConn(1), 'Autorouting','on');
end
end
  3 commentaires
Tommy
Tommy le 8 Mar 2025
Hi,
Module_arc.slx is just blanc canvas with 2 PCM_port:
Tommy
Tommy le 8 Mar 2025
please, see attached CELL.slx

Connectez-vous pour commenter.

Réponse acceptée

Altaïr
Altaïr le 21 Mar 2025
Modifié(e) : Altaïr le 21 Mar 2025
Hey @Tommy,
Similar to your question at https://www.mathworks.com/matlabcentral/answers/2174846, I would like to modify my answer present there with the file you have attached.
The line PH_AddCell{v}=get(AddCell(v),'PortHandles'); in the code only retains port handles for blocks in the current column, which gets replaced with each iteration as i changes. To maintain a matrix of handles, the following approach can be used:
PH_AddCell{v,i}=get(AddCell(v),'PortHandles');
This method ensures that handles to all the blocks are retained by the end of the nested loop, allowing for additional connections to POS and NEG ports, as well as the connection between CELL 4 and CELL 8, using their respective handles. Here's the complete code with the final result:
open_system('Module_arc')
mdl = 'Module_arc';
bat_rec_model = find_system(mdl,'FindAll','on','Name','Module_arc');
numRows = 4;
%%% add Cell - basic CELL_unit:
for i=1:2 %% set two columns
colPos = 200; %% spaces between columns
for v=1:numRows %% loop for 13 cells per column
nl=num2str(v + numRows*(i-1));
if i==1
AddCell(v) = add_block('CELL_Unit/CELL 1', [mdl,'/CELL ',nl]);
else
AddCell(v) = add_block('CELL_Unit2/CELL 1', [mdl,'/CELL ',nl]);
end
posc = get(AddCell(v),'Position');
set(AddCell(v),'Position',posc + [100+(i-1)*colPos 120*(v-1)-45 100+(i-1)*colPos 120*(v-1)-45])
PH_AddCell{v,i}=get(AddCell(v),'PortHandles');
%%% connect minus to plus ports:
if v>1
add_line(mdl,PH_AddCell{v-1,i}.LConn(2),PH_AddCell{v,i}.LConn(1),'Autorouting','on');
end
end
end
% connect the POS port to first CELL (Cell 1):
Plus_2_Cell = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','POS');
PH_plus2Cell=get(Plus_2_Cell,'PortHandles');
Pos_port= add_line(mdl,PH_plus2Cell.RConn,PH_AddCell{1,1}.LConn(1,1), 'Autorouting','on');
% connect the NEG port to last CELL (Cell 8):
Minus_2_Cell = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','NEG');
PH_minus2Cell=get(Minus_2_Cell,'PortHandles');
Neg_port= add_line(mdl,PH_minus2Cell.RConn,PH_AddCell{1,2}.LConn(1),'Autorouting','on');
% connect positive and negative of the two cells in last row
CELL_4_8_connect = add_line(mdl,PH_AddCell{numRows,1}.LConn(1,2),PH_AddCell{numRows,2}.LConn(1,2), 'Autorouting','on');
For a quick start guide on programmatically modeling, visit:
  9 commentaires
Altaïr
Altaïr le 28 Mar 2025
Modifié(e) : Altaïr le 28 Mar 2025
Here's the modified code!
open_system('String_arc')
mdl = 'String_arc';
Cube_model = find_system(mdl,'FindAll','on','Name','String_arc');
no_cells = 2;
% Get handle to existing (external) POS and NEG ports
Plus_str = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','POS');
Minus_str = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','NEG');
%%% add basic Module:
for v=1:no_cells %% loop for no_cells Modules
nl=num2str(v);
Add_module(v) = add_block('Mod_26_cells/Module_MC 1', [mdl,'/Module_MC ',nl]);
posc = get(Add_module(v),'Position');
set(Add_module(v),'Position',posc + [20 120*(v-1)+180 20 120*(v-1)+180])
PH_Add_module{v}=get(Add_module(v),'PortHandles');
%%% connect minus to plus ports:
if v>1
add_line(mdl,PH_Add_module{v-1}.LConn(2),PH_Add_module{v}.LConn(1),'Autorouting','on');
end
end
% connect the external POS port to first CELL (Cell 1):
PH_plus2str=get(Plus_str,'PortHandles');
add_line(mdl,PH_plus2str.RConn,PH_Add_module{1}.LConn(1), 'Autorouting','on');
% connect the external NEG port to last CELL (Cell no_cells):
PH_minus2str=get(Minus_str,'PortHandles');
add_line(mdl,PH_minus2str.RConn,PH_Add_module{no_cells}.LConn(2), 'Autorouting','on');
And this is the resulting String_arc.slx model:
For no_cells = 2
For no_cells = 5
I have attached the String_arc.slx and Mod_26_cells.slx models I used as well.
Tommy
Tommy le 28 Mar 2025
Hi @Altaïr :-)
great!, works perfect.
Thanks a lot.
Tommy

Connectez-vous pour commenter.

Plus de réponses (1)

TED MOSBY
TED MOSBY le 21 Mar 2025
Modifié(e) : TED MOSBY le 21 Mar 2025
Hi Tommy,
The last cells are not connected as you want as shown in the image because you have not added it in your code. The key is simply:
  1. Store the handle of the bottom cell in each column (AddCell(4)) when you finish creating that column.
  2. After the loop, use one add_line to connect the negative port of column1’s bottom cell to the positive port of column2’s bottom cell.
open_system('Module_arc')
mdl = 'Module_arc';
bat_rec_model = find_system(mdl,'FindAll','on','Name','Module_arc');
% keep track of the bottom cell in each column:
bottomCellCol1 = [];
bottomCellCol2 = [];
%%% add Cell - basic CELL_unit:
% your code...................
switch i
case 2
Minus_2_Cell = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','NEG');
PH_minus2Cell=get(Minus_2_Cell,'PortHandles');
Neg_port= add_line(mdl,PH_minus2Cell.RConn,PH_AddCell{1}.LConn(1),'Autorouting','on');
bottomCellCol1 = AddCell(4); % "CELL 4"
case 1
Plus_2_Cell = find_system(mdl,'LookUnderMasks','All','FindAll','on','Name','POS');
PH_plus2Cell=get(Plus_2_Cell,'PortHandles');
Pos_port= add_line(mdl,PH_plus2Cell.RConn,PH_AddCell{1}.LConn(1), 'Autorouting','on');
bottomCellCol2 = AddCell(4); % "CELL 8"
end
end
% Connect NEG port of CELL 4 to POS port of CELL 8
PH_col1Cell4 = get(bottomCellCol1, 'PortHandles'); % bottom of column 1
PH_col2Cell4 = get(bottomCellCol2, 'PortHandles'); % bottom of column 2
add_line(mdl, PH_col1Cell4.LConn(2), PH_col2Cell4.LConn(1), 'Autorouting','on');
  1 commentaire
Tommy
Tommy le 22 Mar 2025
great Ted,
a very good approach.
It realy works...:-)
Now I need to figure out how to connet "go" and "from" tags for each column.
Thanks a lot

Connectez-vous pour commenter.

Catégories

En savoir plus sur Additional Math and Discrete dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by