以编程方式打开 Simulink MATLAB 功能块的代码
Programmatically open a Simulink MATLAB function block's code
我可以通过一些命令在 MATLAB 编辑器中打开本地 Simulink MATLAB 功能块的代码吗?
例如,假设我有一个名为 mainModel.slx.
的 Simulink 模型
其中有一个名为localFunction的MATLAB函数块。
这未在 .m 文件中定义。
我可以编辑路径为 mainModel/localFunction
的函数,而无需打开 simulink window 并双击函数块。这可能吗?
我当然已经尝试过 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'
的功能块。然后应找到名为 'localFunction'
的 MATLAB 功能块。再次,忽略错误。代码保存在名为 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'
值一个字符)。命令 window 显示
>> tmpScript
Function path: mainModel/localFunction
Character index: 29
>>
因此,我可以加载模型并在其 MATLAB 函数块中搜索特定字符串。当我找到这个函数时,我希望能够在 matlab 编辑器中打开它。当我双击 Simulink 中的块时调用什么 window?
这些没有工作
open(foundBlockPath)
edit(foundBlockPath)
blockHandles(iHandle).openEditor
我无法更改 Simulink 模型本身。我不想要更改功能脚本。我只是希望能够在 MATLAB 编辑器中打开它。
您可以将 Matlab function
块更改为 Interpreted Matlab function
块。
这确实有一个限制,即它只能有一个输入和一个输出(可以是向量),因此根据您的问题,您可能需要 mux/demux 一些数据。
或者,您可以更改为 S-function
,这提供了更大的灵活性,但设置起来可能有点复杂。
您可以使用
在编辑器中打开代码
view(blockHandles(iHandle))
我可以通过一些命令在 MATLAB 编辑器中打开本地 Simulink MATLAB 功能块的代码吗?
例如,假设我有一个名为 mainModel.slx.
的 Simulink 模型其中有一个名为localFunction的MATLAB函数块。 这未在 .m 文件中定义。
我可以编辑路径为 mainModel/localFunction
的函数,而无需打开 simulink window 并双击函数块。这可能吗?
我当然已经尝试过 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'
的功能块。然后应找到名为 'localFunction'
的 MATLAB 功能块。再次,忽略错误。代码保存在名为 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'
值一个字符)。命令 window 显示
>> tmpScript
Function path: mainModel/localFunction
Character index: 29
>>
因此,我可以加载模型并在其 MATLAB 函数块中搜索特定字符串。当我找到这个函数时,我希望能够在 matlab 编辑器中打开它。当我双击 Simulink 中的块时调用什么 window?
这些没有工作
open(foundBlockPath)
edit(foundBlockPath)
blockHandles(iHandle).openEditor
我无法更改 Simulink 模型本身。我不想要更改功能脚本。我只是希望能够在 MATLAB 编辑器中打开它。
您可以将 Matlab function
块更改为 Interpreted Matlab function
块。
这确实有一个限制,即它只能有一个输入和一个输出(可以是向量),因此根据您的问题,您可能需要 mux/demux 一些数据。
或者,您可以更改为 S-function
,这提供了更大的灵活性,但设置起来可能有点复杂。
您可以使用
在编辑器中打开代码view(blockHandles(iHandle))