Программно открыть код функционального блока Simulink MATLAB - PullRequest
0 голосов
/ 13 ноября 2018

Можно ли открыть код локального функционального блока Simulink MATLAB в редакторе MATLAB с помощью какой-либо команды?

Например, допустим, у меня есть модель Simulink с именем mainModel.slx .

В нем есть функциональный блок MATLAB с именем localFunction .Это не определено в .m-файле.

Я мог бы редактировать функцию, путь которой равен mainModel/localFunction, без необходимости открывать окно simulink и дважды щелкать функциональный блок.Возможно ли это?

Я, конечно, уже пробовал open mainModel/localFunction и edit mainModel/localFunction.У меня есть доступ к дескриптору для его StateFlow.EMChart объекта.


РЕДАКТИРОВАТЬ: минимальный, (надеюсь) полный и проверяемый пример

Моя минимальная модель Simulinkпоказано на рисунке ниже.Код присутствует под ним.Для удобства чтения я не обращался к ошибкам или глюкам.Это не для общего использования.

enter image description here

Функциональный код для функционального блока MATLAB localFunction равен

function y = fcn(u)
   y = 'findThis'; % I want to end up here, in the MATLAB editor!
end

Я использую следующий код для загрузки модели, поиска по всем функциональным блокам MATLAB и нахождения блоков, содержащих строку 'findThis'.Затем должен быть найден функциональный блок MATLAB с именем 'localFunction'.Опять же, игнорируйте ошибки.Код сохраняется в скрипте с именем tmpScript.m.

% User set
model       = 'mainModel';
expression  = 'findThis';
blockType   = 'Stateflow.EMChart'; % MATLAB function block, right?

% Load model
load_system(model)

% Find all MATLAB function block handles
blockHandles = find(slroot, '-isa', blockType);

% Find first block containing the defined expression
for iHandle = 1:numel(blockHandles)
   tmpFind = strfind(blockHandles(iHandle).Script, expression);
   if ~isempty(tmpFind)
      break
   end
end
foundBlockPath = blockHandles(iHandle ).Path; % Function block path
foundCharIdx   = tmpFind;                     % Character index

% Print results in command window
fprintf('Function path: %s\n', foundBlockPath)
fprintf('Character index: %d\n', foundCharIdx)

. В этом примере путь должен быть mainModel/localFunction и индекс символа 29 (обратите внимание на три первых пробела на втором месте функциии разрыв строки '\n' стоит одного символа).Командное окно показывает

>> tmpScript
Function path: mainModel/localFunction
Character index: 29
>>

. Таким образом, я могу загружать модели и искать в их функциональных блоках MATLAB конкретные строки.Когда я нашел эту функцию, я хотел бы иметь возможность открыть ее в редакторе Matlab.Что называется, когда я дважды щелкаю на блоке в окне Simulink?

Это делает НЕ работа

open(foundBlockPath)
edit(foundBlockPath)
blockHandles(iHandle).openEditor

Я не могу изменить саму модель Simulink,Я не хочу изменить скрипт функции.Я просто хочу иметь возможность открыть его в редакторе MATLAB.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы можете открыть код в редакторе, используя,

view(blockHandles(iHandle))
0 голосов
/ 13 ноября 2018

Вы можете изменить блок Matlab function на блок Interpreted Matlab function.

Это имеет ограничение, что он может иметь только один вход и один выход (которые могут быть векторами), поэтому в зависимости от вашей проблемы вам может потребоваться мультиплексировать / демультиплексировать некоторые данные.

В качестве альтернативы вы можете изменить на S-function, что дает большую гибкость, но может быть немного сложнее в настройке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...