Программно открыть код функционального блока 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
, что дает большую гибкость, но может быть немного сложнее в настройке.