【问题标题】:Search through Simulink MATLAB function block code for matching string, from MATLAB command window从 MATLAB 命令行窗口搜索 Simulink MATLAB 功能块代码以查找匹配字符串
【发布时间】:2018-10-05 06:30:22
【问题描述】:

我正在尝试找到一种方法来搜索 Simulink 模型的 MATLAB 功能块的代码,以找到匹配的字符串。

对于单个 MATLAB 函数文件,我可以在 Windows 命令提示符下简单地使用 findstr。但是,这不会搜索 .slx 文件(MATLAB 功能块)中的用户定义函数。它适用于 .m 文件。

我可以在 Simulink 模型中使用 CTRL+F 手动进行搜索。 (CTRL+F -> "查看更多" -> 输入搜索字符串 -> "单击此处在当前系统及以下系统中搜索")。这为我提供了包含匹配字符串的用户定义 MATLAB 函数的所有块。我希望能够通过 MATLAB 中的命令窗口或 Windows 命令提示符来执行此操作。

我曾尝试通过 Simulink 帮助寻求帮助,并花了一段时间在互联网上搜索,但没有找到任何东西。

有没有办法通过代码执行来进行这种搜索?

【问题讨论】:

    标签: matlab search find user-defined-functions simulink


    【解决方案1】:

    首先,您需要获取模型中所有 MATLAB Function 块的句柄。这可以使用

    blockHandles = find(slroot, '-isa', 'Stateflow.EMChart')
    

    请注意,MATLAB Function 块实际上只是Stateflow 图表的一种特殊类型(随Simulink 一起提供,不需要Stateflow 本身的许可证)。如果您只想要特定块的句柄,那么您可以使用

    来细化搜索
    blockHandles = find(slroot, '-isa', 'Stateflow.EMChart', 'Path', gcb)
    

    gcb 是您感兴趣的区块的名称。

    函数中的文本存储在对象的Script 属性中。要显示它(或写入它),请使用

    blockHandles(idx).Script
    

    其中idx 是指示您感兴趣的块的索引。您可以在循环中使用它来搜索所有块,

    for idx = 1:numel(blockHandles)
       strfind(blockHandles(idx).Script,'text_to_search_for')
    end
    

    【讨论】:

    • 这成功了!此外,strfind 返回作为函数副本创建的 char 数组中第一个搜索字符串字符的位置。似乎使用\n 换行,因此每个换行使用两个字符。
    • slroot() 在做什么?有没有办法只找到特定型号的EMChart?我一直在寻找加速我的代码的方法,我想为一个特定的 Simulink 模型获取一个 Root 对象。你知道什么方法吗?
    • slroot 刚刚获得 Simulink 层次结构中的最高级别。您可以轻松地使用bdroot 或模型名称(作为字符串)开始搜索特定模型。
    • 我可能错了这两个字符的换行符。我最近的测试只指向一个字符。不要相信我的话,我可能会马虎。
    • 菲尔,你确定吗?我已经尝试过bdroot(刚才又尝试了一些)。它只返回带有模型名称的字符向量或数字(使用'myModelName'gcbgcsgcbh)。这些都不能用于上面用于设置blockHandlesfind
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多