MATLAB中find_system用法

文章详细介绍了MATLAB中的find_system函数,用于在Simulink项目中搜索系统、模块、信号线、注释和参数,支持多种条件查询,如正则表达式搜索和库链接更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

语法

说明

示例

查找已加载的系统及其模块

查找特定的系统及其模块

返回加载的模型、子系统和库的名称

搜索子系统的子级

使用多个条件进行搜索

以句柄形式返回信号线和注释

搜索特定的模块参数值

使用正则表达式进行搜索

正则表达式搜索部分匹配

更新子系统中的库链接

以句柄形式返回值


        find_system工能是查找系统、模块、信号线、端口和注释。

语法

Objects = find_system
Objects = find_system(System)
Objects = find_system(Name,Value)
Objects = find_system(System,Name,Value)

说明

        ​Objects = find_system 返回已加载的系统及其模块,包括子系统。​

        Objects = find_system(System) 返回指定的系统及其模块。

        ​Objects = find_system(Name,Value) 返回已加载的系统以及这些系统中满足一个或多个 Name,Value 对组参数指定的条件的对象。您可以使用此语法指定搜索约束和搜索特定的参数值。在参数和值对组之前指定搜索约束。

        ​Objects = find_system(System,Name,Value) 返回指定系统中满足指定条件的对象。

示例

查找已加载的系统及其模块

        返回所有已加载的系统及其模块的名称。

load_system('vdp')
find_system
ans = 15x1 cell
    {'vdp'                     }
    {'vdp/Constant'            }
    {'vdp/More Info'           }
    {'vdp/More Info/Model Info'}
    {'vdp/Mu'                  }
    {'vdp/Mux'                 }
    {'vdp/Product'             }
    {'vdp/Scope'               }
    {'vdp/Square'              }
    {'vdp/Sum'                 }
    {'vdp/Sum1'                }
    {'vdp/x1'                  }
    {'vdp/x2'                  }
    {'vdp/Out1'                }
    {'vdp/Out2'                }

        返回已加载的系统和库,包括 vdp。

查找特定的系统及其模块

        返回 vdp 系统及其模块。

load_system({'vdp','ex_sldemo_clutch'})
find_system('vdp')
ans = 15x1 cell
    {'vdp'                     }
    {'vdp/Constant'            }
    {'vdp/More Info'           }
    {'vdp/More Info/Model Info'}
    {'vdp/Mu'                  }
    {'vdp/Mux'                 }
    {'vdp/Product'             }
    {'vdp/Scope'               }
    {'vdp/Square'              }
    {'vdp/Sum'                 }
    {'vdp/Sum1'                }
    {'vdp/x1'                  }
    {'vdp/x2'                  }
    {'vdp/Out1'                }
    {'vdp/Out2'                }

返回加载的模型、子系统和库的名称

        返回加载的模型、子系统和库的名称。仅当子系统可以独立加载时,才会返回子系统名称。

load_system('vdp');
find_system('type','block_diagram')
ans = 1x1 cell array
    {'vdp'}

搜索子系统的子级

        返回作为 ex_sldemo_clutch 系统的 Unlocked 子系统的子级存在的所有 Goto 模块的名称。

load_system('ex_sldemo_clutch');
find_system('ex_sldemo_clutch/Unlocked','SearchDepth',1,'BlockType','Goto')

ans = 2x1 cell
    {'ex_sldemo_clutch/Unlocked/Goto' }
    {'ex_sldemo_clutch/Unlocked/Goto1'}

使用多个条件进行搜索

        在 vdp 系统中进行搜索,并返回增益值设置为 1 的所有 Gain 模块的名称。

load_system('vdp');
find_system('vdp','BlockType','Gain','Gain','1')
ans = 1x1 cell array
    {'vdp/Mu'}

以句柄形式返回信号线和注释

        获取 vdp 系统中所有信号线和注释的句柄。对于 'FindAll',不管如何指定要搜索的系统,该函数都会返回句柄。

load_system('vdp');
L = find_system('vdp','FindAll','on','type','line')
L = 19×1

   34.0004
   33.0004
   32.0004
   31.0004
   30.0004
   29.0004
   28.0004
   27.0004
   26.0004
   25.0004
      ⋮

A = find_system('vdp','FindAll','on','type','annotation')
A = 2×1

   36.0004
   35.0004

搜索特定的模块参数值

        在 vdp 和 ex_sldemo_clutch 系统中查找值为 0 的任何模块对话框参数。

load_system({'vdp','f14'})
find_system({'vdp','f14'},'BlockDialogParams','0')
ans =

  32×1 cell array

    {'vdp/More Info'                                              }
    {'vdp/More Info/Model Info'                                   }
    {'vdp/Scope'                                                  }
    {'vdp/x2'                                                     }
    {'vdp/Out1'                                                   }
    {'vdp/Out1'                                                   }
    {'vdp/Out2'                                                   }
    {'vdp/Out2'                                                   }
    {'f14/Aircraft↵Dynamics↵Model'                              }
    {'f14/Aircraft↵Dynamics↵Model/Vertical Velocity↵w (ft//sec)'}
    {'f14/Aircraft↵Dynamics↵Model/Vertical Velocity↵w (ft//sec)'}
    {'f14/Aircraft↵Dynamics↵Model/Pitch Rate↵q (rad//sec)'      }
    {'f14/Aircraft↵Dynamics↵Model/Pitch Rate↵q (rad//sec)'      }
				.
				.
				.

使用正则表达式进行搜索

        在当前加载的系统的顶层查找模块对话框参数值以 3 开头的所有模块。

load_system({'ex_sldemo_clutch','vdp'});
find_system('SearchDepth','1','regexp','on','BlockDialogParams','^3')
ans = 4x1 cell
    {'vdp/Scope'         }
    {'vdp/Scope'         }
    {'vdp/Square'        }
    {'ex_sldemo_clutch/w'}

正则表达式搜索部分匹配

        使用正则表达式进行搜索时,可以指定要匹配的字符向量的一部分,以返回包含该字符向量的所有对象。在 ex_sldemo_clutch 模型中查找所有 Inport 和 Outport 模块。

load_system('ex_sldemo_clutch');
find_system('ex_sldemo_clutch','regexp','on','blocktype','port')
ans = 39x1 cell
    {'ex_sldemo_clutch/Friction...'                               }
    {'ex_sldemo_clutch/Friction...'                               }
    {'ex_sldemo_clutch/Friction...'                               }
    {'ex_sldemo_clutch/Friction Mode Logic/Tin'                   }
    {'ex_sldemo_clutch/Friction Mode Logic/Tfmaxs'                }
    {'ex_sldemo_clutch/Friction Mode Logic/Break Apart...'        }
    {'ex_sldemo_clutch/Friction Mode Logic/Break Apart...'        }
    {'ex_sldemo_clutch/Friction Mode Logic/Break Apart...'        }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup...'             }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup FSM/lock'       }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup FSM/unlock'     }
    {'ex_sldemo_clutch/Friction Mode Logic/Lockup FSM/locked'     }
    {'ex_sldemo_clutch/Friction Mode Logic/Requisite Friction/Tin'}
    {'ex_sldemo_clutch/Friction Mode Logic/Requisite Friction/Tf' }
    {'ex_sldemo_clutch/Friction Mode Logic/locked'                }
    {'ex_sldemo_clutch/Friction Mode Logic/lock'                  }
    {'ex_sldemo_clutch/Friction Mode Logic/unlock'                }
    {'ex_sldemo_clutch/Friction Mode Logic/Tf'                    }
    {'ex_sldemo_clutch/Locked/Tin'                                }
    {'ex_sldemo_clutch/Locked/w'                                  }
    {'ex_sldemo_clutch/Unlocked/Tfmaxk'                           }
    {'ex_sldemo_clutch/Unlocked/Tin'                              }
    {'ex_sldemo_clutch/Unlocked/we'                               }
      ⋮

更新子系统中的库链接

        在本示例中,myModel 只包含一个子系统,它是一个库链接。上次打开模型后,向库中对应的子系统中添加了一个 Gain 模块。

        打开模型。使用 find_system 并将 'FollowLinks' 设置为 'off'。此命令不会跟随库链接进入子系统,并且只返回顶层子系统。

open_system('myModel')
find_system(bdroot,'LookUnderMasks','on','FollowLinks', 'off')

ans = 

    'myModel'
    'myModel/Subsystem'

        使用 find_system 并将 'FollowLinks' 设置为 'on'。find_system 将更新库链接,并返回子系统中的模块。

find_system(bdroot,'LookUnderMasks','on','FollowLinks','on')
Updating Link: myModel/Subsystem/Gain
Updating Link: myModel/Subsystem/Gain

ans = 

    'myModel'
    'myModel/Subsystem'
    'myModel/Subsystem/Gain'

以句柄形式返回值

        将该系统作为句柄提供给 find_system。搜索值为 0 的模块对话框参数。如果对同一个模块多次调用 get_param,则使用模块句柄比以字符向量形式指定完整模块路径更高效。

load_system('vdp');
sys = get_param('vdp','Handle');
find_system(sys,'BlockDialogParams','0')
ans = 8×1

    3.0006
    4.0006
    8.0006
   13.0006
   14.0006
   14.0006
   15.0006
   15.0006

classdef Initialza methods(Static) % Following properties of 'maskInitContext' are avalaible to use: % - BlockHandle % - MaskObject % - MaskWorkspace: Use get/set APIs to work with mask workspace. function MaskInitialization(maskInitContext) % 从 Mask 参数获取状态空间矩阵 A = eval(get_param(gcb, 'A_matrix')); B = eval(get_param(gcb, 'B_matrix')); C = eval(get_param(gcb, 'C_matrix')); D = eval(get_param(gcb, 'D_matrix')); % 验证矩阵 if isempty(A) || isempty(B) || isempty(C) || isempty(D) error('状态空间矩阵 A, B, C, D 为空,请检查 InitFcn 是否正确执行'); end % 调试:打印子系统路径 disp(['当前子系统路径: ', gcb]); % 确保模型已加载 model_name = bdroot(gcb); if ~bdIsLoaded(model_name) load_system(model_name); disp(['模型 ', model_name, ' 已加载']); end % 查找子系统内的所有块 block_list = find_system(gcb, 'SearchDepth', 1, 'LookUnderMasks', 'all', 'FollowLinks', 'on'); disp('子系统内的所有块:'); disp(block_list); % 查找 MATLAB Function 块 matlab_function_blocks = find_system(gcb, 'SearchDepth', 1, 'LookUnderMasks', 'all', 'FollowLinks', 'on', 'BlockType', 'MATLABFunction'); if isempty(matlab_function_blocks) % 如果 find_system 失败,尝试直接指定路径 expected_path = [gcb '/Fractional_order_operator']; if bdIsLoaded(model_name) && exist_block(expected_path) if strcmp(get_param(expected_path, 'BlockType'), 'MATLABFunction') matlab_function_blocks = {expected_path}; disp(['通过直接路径找到 MATLAB Function 块: ', expected_path]); else error('预期路径 %s 对应的块不是 MATLAB Function 块,实际类型为 %s', expected_path, get_param(expected_path, 'BlockType')); end else error('在子系统 %s 未找到 MATLAB Function 块,预期路径 %s 无效,请检查子系统结构', gcb, expected_path); end end % 获取 MATLAB Function 块的路径 matlab_function_block = matlab_function_blocks{1}; disp(['找到 MATLAB Function 块: ', matlab_function_block]); % 验证块类型 if ~strcmp(get_param(matlab_function_block, 'BlockType'), 'MATLABFunction') error('路径 %s 对应的块不是 MATLAB Function 块,实际类型为 %s', matlab_function_block,
最新发布
04-03
<think>好的,我需要帮助用户在Simulink调试和验证MATLAB Function块的状态空间矩阵参数配置及初始化逻辑。首先,用户的问题涉及到如何在Mask Initialization函数正确设置和验证A、B、C、D矩阵,以及确保子系统内有有效的MATLAB Function块。我需要回忆相关的Simulink知识,特别是关于Mask参数初始化、MATLAB Function块的使用以及调试方法。 首先,用户提到在Mask Initialization设置状态空间矩阵。我记得Mask Initialization是用来初始化封装子系统的参数,可以通过编写MATLAB代码来设置变量。用户需要确保这些矩阵在初始化时被正确赋值,并且维度匹配。比如,A矩阵应该是n×n,B矩阵是n×m,C是p×n,D是p×m,其n是状态数,m是输入数,p是输出数。可能需要检查矩阵的维度和数据类型是否正确。 接下来是验证参数配置。用户可能需要使用disp或者error函数在Mask Initialization输出或检查参数。比如,在初始化代码加入条件判断,如果矩阵维度不符合要求,就抛出错误信息。这有助于在仿真前发现问题。 关于确保子系统内有有效的MATLAB Function块,可能需要检查块的存在性。用户可以使用find_system函数在子系统搜索是否存在MATLAB Function块,如果没有则报错。此外,还需要确认该块的代码是否正确引用了Mask参数的矩阵,比如在MATLAB Function使用A、B、C、D参数进行计算。 调试部分,用户可能需要设置断点。在MATLAB Function块,可以通过编辑代码并添加dbstop命令来设置断点。或者在仿真时使用Simulink调试器,逐步执行以观察变量的值是否正确。 另外,引用的内容提到了Level-2 MATLAB S函数和仿真命令sim的用法。可能需要考虑用户是否使用S函数,但问题更偏向于MATLAB Function块。不过,初始化参数的验证方法可能类似,比如在S函数检查参数的有效性。 用户可能遇到的常见错误包括矩阵维度不匹配、参数未正确传递到MATLAB Function块、初始化逻辑错误等。需要指导用户如何逐一排查这些问题,例如通过打印变量值、检查作用域和命名空间,以及使用Simulink的数据检查工具。 最后,生成的相关问题需要围绕Simulink的参数设置、调试技巧、MATLAB Function块的使用以及状态空间模型的实现。比如如何调试Mask初始化错误,状态空间矩阵的维度要求,MATLAB Function块与其他模块的区别等。</think>### 在Simulink设置与验证状态空间矩阵参数及初始化逻辑 #### **1. 设置状态空间矩阵参数** **步骤1:创建Mask封装子系统** - 右击子系统 → 选择 *Mask → Create Mask*,进入封装编辑器。 - 在 *Parameters & Dialog* 选项卡定义矩阵参数(如A、B、C、D),建议使用 *Edit* 类型并添加数据验证规则(如矩阵维度限制)[^3]。 **步骤2:编写Mask Initialization代码** - 在 *Initialization* 选项卡编写初始化逻辑,例如: ```matlab % 检查矩阵维度合法性 [nA, mA] = size(A); if nA ~= mA error('矩阵A必须是方阵'); end % 将矩阵传递到工作区或子系统变量 assignin('base', 'A', A); ``` #### **2. 验证参数配置** **方法1:使用断点与调试输出** - 在Mask Initialization代码添加 `disp` 语句输出矩阵值: ```matlab disp('A矩阵值:'); disp(A); ``` - 使用 `error` 函数主动触发错误提示(如矩阵奇异性检测)。 **方法2:仿真前检查** - 在子系统内添加 *Assertion* 模块,通过MATLAB表达式验证矩阵维度: ```matlab assert(isequal(size(A), [n,n]), 'A矩阵维度错误'); ``` #### **3. 定位并验证MATLAB Function块** **方法1:使用find_system函数** - 在Mask Initialization添加代码检查子系统是否存在MATLAB Function块: ```matlab blk = find_system(gcb, 'BlockType', 'MATLABFunction'); if isempty(blk) error('子系统缺少MATLAB Function块'); end ``` **方法2:验证代码引用** - 确保MATLAB Function块内正确引用Mask参数(如直接使用A、B、C、D变量): ```matlab function y = fcn(u, A, B, C, D) x = evalin('base', 'x'); % 若状态变量存储在基础工作区 y = C*x + D*u; end ``` #### **4. 调试初始化逻辑** **方法1:使用Simulink调试器** - 在MATLAB命令行输入 `sldebug '模型名'` 进入调试模式,逐步执行初始化代码。 **方法2:Workspace变量检查** - 在初始化代码后添加 `keyboard` 命令暂停执行,手动检查工作区变量值: ```matlab assignin('base', 'A', A); keyboard; % 按F5继续 ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值