【问题标题】:Programmatically open a Simulink MATLAB function block's code以编程方式打开 Simulink MATLAB 功能块的代码
【发布时间】:2019-04-16 04:25:56
【问题描述】:

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

例如,假设我有一个名为 ma​​inModel.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 编辑器中打开它。

【问题讨论】:

  • 你能添加一个 minimal reproducible example 块的样子,以便我们可以重现它并尝试 ti?
  • 也许改成 S-Function,而不是 Matlab 功能块?
  • 这不是我自己的模型,我不能改变任何大的东西。
  • 对于 MATLAB 功能块,代码保存在模型中。所以你不能在不打开模型的情况下打开或编辑它。一旦模型打开,您就可以通过编程方式将代码获取或设置为字符串。例如stackoverflow.com/questions/42263697/…。或者,您可以更改 MATLAB Function 块中的代码以调用您可以轻松编辑的 .m 文件。
  • 我正在编写函数来帮助我在 simulink 模型中查找和突出显示块。我很懒,想写一个函数,与这些一起在matlab编辑器中打开代码。然后我可以加载模型,找到代码块并在编辑器中打开代码。所有这些都无需打开 Simulink 窗口。

标签: matlab simulink stateflow


【解决方案1】:

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

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

或者,您可以更改为S-function,这样可以提供更大的灵活性,但设置起来可能会更复杂一些。

【讨论】:

  • 如果允许我进行此更改,这可能是我的问题的解决方案。但是,这是用于安全关键功能的代码,因此风险太大。此外,我希望这有助于我在常规 MATLAB 功能块很常见的环境中工作。我不能改变我接触到的每一个模型。谢谢你的回答。这是一种我将不得不尝试的方法。 :)
【解决方案2】:

你可以在编辑器中打开代码,

view(blockHandles(iHandle))

【讨论】:

  • 我们有一个赢家!简单易读。谢谢!我想一定有这样的方法。 PS,菲尔你现在知道我的另一个问题导致了哪里。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多