3

我可以通过一些命令在 MATLAB 编辑器中打开本地 Simulink MATLAB 功能块的代码吗?

例如,假设我有一个名为mainModel.slx的 Simulink 模型。

其中有一个名为localFunction的 MATLAB 功能块。这未在 .m 文件中定义。

我将能够编辑路径是的函数mainModel/localFunction,而无需打开 simulink 窗口并双击功能块。这可能吗?

我当然已经尝试过open mainModel/localFunctionedit 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'值一个字符)。命令窗口显示

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

因此,我可以加载模型并在其 MATLAB 功能块中搜索特定字符串。当我找到这个函数时,我希望能够在 matlab 编辑器中打开它。当我在 Simulink 窗口中双击模块时会调用什么?

这些不起作用_

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

我无法更改 Simulink 模型本身。我不想更改函数脚本。我只想能够在 MATLAB 编辑器中打开它。

4

2 回答 2

2

您可以使用在编辑器中打开代码,

view(blockHandles(iHandle))
于 2018-11-15T16:27:21.090 回答
0

您可以将Matlab function块更改为Interpreted Matlab function块。

这确实有一个限制,它只能有一个输入和一个输出(可以是向量),因此根据您的问题,您可能需要复用/解复用一些数据。

或者,您可以更改为S-function,它提供了更大的灵活性,但设置起来可能有点复杂。

于 2018-11-13T12:35:46.050 回答