Программно открыть код функционального блока Simulink MATLAB

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

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

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

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

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


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

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

Функциональный код для функционального блока 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 ответа

Решение

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

view(blockHandles(iHandle))

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

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

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

Другие вопросы по тегам