2015-06-29 1 views
-2

Ну, у меня возникла проблема, что я должен получить содержимое ячейки в Matlab. Но это не обычная ячейка. В ячейке может быть ячейка. И я не знаю, сколько уровней имеет первая ячейка.получить количество уровней ячейки

Все клетки имеют размерность (1, х)

так что это может быть mycell{cell1{cell11{char1, char2}}, char3, cell2{char4, char5, char6}}

я должен получить переменные полукокса, и я должен знать, где они находятся.

этого типа клетки возвращаются, когда я это сделать

get_param(path_to_busselector, 'Inputsignals') 

path_to_busselector это путь к селектору шины в Simulink.

Я могу жестко его кодировать, но тогда я могу обрабатывать только фиксированное количество уровней ячеек, и это проблема.

Мои идеи заключаются в том, что я создаю что-то с циклом while и, вероятно, с командой eval.

здесь у меня есть пример модели Matlab example model и skript, который дает имена сигналов. если вы запустите команду signalnames = get_param(BlockPaths(Cellofbusselector)), тогда есть ячейка, как у меня. теперь я хочу получить доступ к сигналам в селекторе шины, но я не хочу этого делать вручную. Если я хочу получить сигнал в skript, я должен знать имя для дополнения сигнала. это ясно или я просто не могу сказать, что хочу. извините, если второе утверждение верно, я попробую еще раз

так после того, как я получить имя сигнала я могу сделать что-то вроде этого set_param(outporthandle_of_busselector, 'Outport', fullsignalname)

и для этого я должен знать точное имя сигнала.

Спасибо за ваше время и ваши идеи

+1

Какой будет желаемый выход? Произнесите строку со всеми этими «символами» contacatenated? Можем ли мы считать, что 'char1' и т. Д. Являются единственными символами? –

+0

нет, они представляют собой строку символов. Мне нужно точное имя сигнала на шине, и в шине может быть вложенная шина. имя сигнала объединяется с разными символами. поэтому имя может быть «busname.nestedbusname».signalname', но я не знаю, сколько вложенных систем шины вложены друг в друга. то есть, откуда происходят клетки в клетках. –

+2

Так, например, 'myCell = {'aa', {'bb' 'cccc'}, {'d' 'ee'; 'ff' 'ggg'}, {'h', {'iii', 'jj' }}} '? Опять же, каков был бы желаемый результат? –

ответ

0

Ну, я нашел решение. Это не очень приятно, но это работает.

Все файлы могут быть downloded here from dropbox

К сожалению, мне бы хотелось, чтобы разместить изображение, но я не имею 10 репутации. Таким образом, вы должны загрузить его по ссылке выше.

Здесь главный скиф, а дальше вниз - рекурсивная функция. Skript также должен работать для всех других моделей Simulin с шиной. Но сейчас это просто работает, если есть только один busselector. Но не так много программ для нескольких шинных систем и селекторов шин.

% Name_Signals_after_Blocknames 
format compact, clear all, clc 

cd(''); % Directory where the simulink model is safed 

Simulink_Model = ('linearGuide_model.slx'); 
Simulink_Model = ('Verbindung.slx'); 
Simulink_Model = ('bus_system.slx'); 
% Simulink_Model = ('singlebus.slx'); 

[path, Model_name, ext] = fileparts(Simulink_Model); 

BlockPaths = find_system(Model_name,'LookUnderMasks', 'all' ,'Type','Block'); 
length_Model_name = length(Model_name); 

Cellofbusselector = []; 
jj = 0; 

for ii = 1:length(BlockPaths) 
    disp(BlockPaths{ii}) 
    porthandles = get_param(BlockPaths{ii}, 'PortHandles'); 
    outporthandles = get_param(porthandles.Outport, 'Line'); 

    Block_Name = BlockPaths{ii}; 

    %  if length(outporthandles) > 1    % only give names to outputs of a subsystem, they are also listed in the BlockPaths cell 
    %   warning ('more than one signal wants to get the same name, might be a Subsystem') 
    %  else 

    if strcmp(BlockPaths{ii}(end-7:end), 'Selector') % you can not change the name of a line connecting a Bus Selector 
     disp('Here we have a Bus selector') 
     jj = 1+jj; 
     Cellofbusselector(jj) = ii; 
    else 
     if isempty(outporthandles) 
      warning(['Block ', Block_Name, ' has no Output']) 
     elseif length(outporthandles) == 1 
      if outporthandles == -1  % outporthanldes == 1, when there is no signal attachet to the outport of the block 
       warning(['Block ', Block_Name, ' has no Output-Signal attached']) 
      else 
       Signal_name = BlockPaths{ii}((length_Model_name+2):end); 
       set_param(outporthandles, 'Name', Signal_name); 
      end 
     elseif length(outporthandles) > 1 
      for jj = 1:length(outporthandles) 
       if outporthandles{jj} == -1  % outporthanldes == 1, when there is no signal attachet to the outport of the block 
        Block_Name = BlockPaths{ii}; 
        warning(['Block ', Block_Name, ' has no Output-Signal attached']) 
       else 
        Signal_name = [BlockPaths{ii}((length_Model_name+2):end), '_out', num2str(jj)]; 
        set_param(outporthandles{jj}, 'Name', Signal_name); 
       end 
      end 
     end 
    end 
    %  end 

end   % for ii = 1:length(BlockPaths) 



buscell = get_param(BlockPaths{Cellofbusselector}, 'InputSignals'); 


[signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell) 


%% 

signalnamesize = size(signalname); 
for ii = 1:signalnamesize(1) 
    for kk = 1:signalnamesize(2) 
     if isempty(signalname{ii,kk}) 
     else 
      nrofbusnames = kk-1; 
      fullbusname = ''; 
      for i = 1:nrofbusnames 
       fullbusname = [fullbusname '.' busname{i}]; 
      end    
      fullsignames{ii,1} = [fullbusname(2:end) '.' signalname{ii,kk}] 
     end 
    end 
end 

Вот код из функции recursiv

function [signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell, buslevel, numofsig, signalname, busname) 
%% Description 
% This function returns the complete signal names which are stored in a 
% bus. The name looks something like bus1.bus2.signal1. 


if nargin < 2; buslevel = 1; end 
if nargin < 3; numofsig = 0; end 
if nargin < 4; signalname = {}; end 
if nargin < 5; busname = {}; end 


buscellsize = size(buscell); 

buscellsize(1);    % busvert is the vertical dimension of buscell 
for kk = 1:buscellsize(1) 
    if ischar(buscell{kk,1}) && buscellsize(2) == 1 
     numofsig = numofsig + 1; 
     signalname{numofsig, buslevel} = buscell{kk,1}; 

    elseif ischar(buscell{kk,1}) && buscellsize(2) == 2 
     busname{buslevel-1} = buscell{kk,1}; 
     [signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell{kk,2}, buslevel, numofsig, signalname, busname); 

    elseif iscell(buscell{kk,1}) && buscellsize(2) == 1 
     buslevel = buslevel+1; 
     [signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell{kk,1}, buslevel, numofsig, signalname, busname); 
     buslevel = buslevel-1; 
    end 
end 

end 

Я надеюсь, что я сделал это право. И это помогает кому-то.

Смежные вопросы