1. 概念讲解
1.1 观察者要解决的问题
在真实项目中,模型一旦冻结用于仿真验证,我们往往希望在不改动系统设计本身的前提下,监控某些内部信号、检查系统是否运行在规定范围内。传统做法是在被测模型上引出 To Workspace 端口、挂 Scope,或者专门搭一个验证子系统并用信号线把关心的点连出来。这样做的代价是:被测模型被修改了,设计与验证逻辑混在一张图里,既污染了模型可读性,也可能因为额外的连线、采样和缓冲改变系统的动态响应,破坏仿真结果的完整性。
观察者(Observer)正是为解决这一矛盾而设计的:它让你在不修改系统模型、不影响系统编译与仿真结果的前提下,无线地(wirelessly)监控系统模型的动态响应。官方指南明确指出:观察者在保护系统模型设计与系统结果完整性的同时,监控系统模型的动态响应。所谓"无线",是指被观察的信号与观察者之间没有物理信号线相连,二者通过模块间的绑定关系关联。
1.2 两类模块:Observer Reference 与 Observer Port
观察者体系由两类模块构成:
Observer Reference 模块(Observer Reference Block):位于系统模型顶层,没有输入输出端口,它把系统模型无线链接到一个独立的 Observer 模型(验证模型)。运行系统模型时,与之链接的 Observer 模型也会一起运行。
Observer Port 模块(Observer Port Block):位于 Observer 模型内部,一个 Observer 模型可以包含一个或多个。把某个 Observer Port 模块映射到系统模型中的某个信号或对象后,该 Port 的输出就等于被映射信号的输出。新建、尚未映射任何信号的 Observer Port 上会画一条穿过信号符号的斜线,表示它当前未绑定。
二者关系如下图:系统模型顶层放 Observer Reference 模块,它无线指向 Observer 模型;Observer 模型内用 Observer Port 取数,再接到 Test Assessment 等验证模块。
1.3 可以观察哪些数据
指南列出的可观察 Simulink 信号与模型数据类型包括:连续时间与离散时间信号;零阶保持信号;标量信号;宽信号(wide signals);非虚拟总线信号(Nonvirtual bus signals);消息(Messages,第 19 讲专讲);条件子系统信号(第 19 讲专讲);Stateflow 局部数据与参数(但不包括定义在 Stateflow 状态内部 Simulink 子系统中的局部数据、参数、信号等);以及 Stateflow 状态自活动(同样排除状态内部 Simulink 子系统中的情况)。
1.4 与直接改模型加端口的区别
无线访问的价值在于:观察者让你监控系统模型,却不对系统造成任何改变,并在系统设计与验证子系统之间形成清晰的分界。指南特别强调:带不带 Observer Reference 模块,系统模型的仿真结果完全相同,Observer Reference 模块不影响系统模型的编译。
2. 操作步骤 / 工作流
2.1 添加 Observer Reference 模块
在 Simulink 工具条的 Apps 页签中,于 Model Verification, Validation, and Test 区域点击Simulink Test,打开 Tests 页签。
在 Tests 页签点击Add Observer Reference;或者在 Simulink 画布顶层右键,选择Observers > Add Observer Reference here。
系统模型中即加入一个 Observer Reference 模块,同时自动创建并打开一个 Observer 模型。你必须把 Observer 模型保存到 MATLAB 路径上的可写文件夹中。
若要把 Observer Reference 模块链接到一个已经创建好的 Observer 模型:先把该 Observer 模型存入 MATLAB 路径上的可写文件夹;右键 Observer Reference 模块选择Block Parameters (ObserverReference),在对话框的 Observer Model name 栏填入 Observer 模型名并点击 Apply。双击该模块即可在新窗口打开对应 Observer 模型。
你也可以直接从信号或数据创建 Observer 模型:选中一条或多条想观察的信号/数据,点击 Tests 页签的 Add Observer Reference;或右键所选信号/数据,依次选择 Observers、要观察的项类型、New Observer。Simulink 会创建 Observer 模型并在系统模型中加入 Observer Reference 模块。
2.2 用 Manage Observer 对话框映射信号
打开Manage Observer 对话框有四种方式:Tests 页签点击 Manage Observer;点击 Observer Reference 模块右下角的齿轮图标;右键模块选择 Observers > Manage Observer;或在 Observer 模型中双击某个 Observer Port 模块。
该对话框左侧是 Observable Area 面板,展示模型的模块层次与可观察输出,被观察的信号/对象在层次树中加粗显示;右侧是 Observer 面板,展示 Observer Reference 模块内的 Observer 端口层次,已映射信号的端口加粗并显示其所附信号。把鼠标悬停在 Observer Port 上可查看被观察对象的完整路径。
映射操作:在 Observable Area 面板选中要观察的信号/对象;若要映射到新建Observer Port,双击该选中项或点击 Add New Observer Port 图标;若要映射到已有Observer Port,则在 Observer 面板选中目标端口,点击 Reconfigure Observer Port 图标。映射完成后,回到 Observer 模型把 Observer Port 的输出接到验证子系统即可。若在系统模型中改了被观察信号/对象的名字,Observer Reference 会同步更新 Observer Port 输出信号名;若信号无名无标签,则 Observer Port 输出为空字符串。
2.3 追溯被观察项
在对话框内部追溯:双击 Observer 面板中的 ObserverPort 项,或右键选 Show in left panel,对应被观察项即在左侧高亮。
对话框与系统模型之间追溯:右键 ObserverPort 项或左侧被观察项选 Show in model;或在系统模型中右键被观察信号选 Go to associated Observer Ports。
系统模型与 Observer 模型之间追溯:在 Observer 模型中右键 Observer Port 选 Observers > Go to observed <项类型>;或反向在系统模型中右键被观察对象选 Observers > Go to associated Observer Ports。
2.4 仿真注意
系统模型与 Observer 模型都必须以普通仿真模式(normal mode)运行;二者均可定步长或变步长,也可一固定一变;可使用相同或不同求解器。
3. 示例
指南给出的热泵示例sltestHeatpumpExample:被控对象用 Simulink 建模,控制器用 Stateflow 建模;目标是监控热泵温度 T,以及泵是在制冷还是制热——风扇吹风方向由 Stateflow 图中端口 3 的数据pump_dir表示。
操作流程如下:
% 打开热泵示例模型 sltestHeatpumpExample在模型 Apps 页签点击 Simulink Test,打开 Tests 页签;点击 Add Observer Reference,Simulink 加入 Observer Reference 模块,并创建名为
sltestHeatpumpExample_Observer1的 Observer 模型。打开主模型 Plant 子系统,右键信号 T,选择 Observers > Observe selected signals > sltestHeatpumpExample/Observer (sltestHeatpumpExample_Observer1)。Observer 模型即新增一个映射到信号 T 的 Observer Port 模块,保存该 Observer 模型。
在 Observer 模型 Tests 页签点击 Add Observer Port 再加一个端口;双击新端口 ObserverPort1 打开 Manage Observer 对话框。
在 Observable Area 面板展开 Controller 与 controller_chart,选中 Outport3,点击两面板之间的 Reconfigure 图标。ObserverPort1 即更名为 ObserverPort1 (controller_chart:3)。
此时两个 Observer Port 已映射完毕,可接到 Scope 或验证子系统。
3.1 把验证子系统转换为 Observer Reference
为给系统模型"减负",可把图中已有的验证子系统(如巡航示例里的 Safety Properties 验证子系统)整体转换为 Observer Reference:选中该子系统,在 Tests 页签点击Send to Observer;或右键验证子系统选 Observers > Move selected block to Observer > New Observer。该操作不可撤销。转换后,连接验证子系统与系统模型的信号线被移除,但系统完整性测试能力保留;原信号 throt 与 output1 自动映射到新 Observer 模型sltestBasicCruiseControlHarnessModel_Observer1中的两个 Observer Port。
4. 要点与注意事项
Observer 模型不仿真的情形:Observer 模型包含根级 Inport 或 Outport 模块时不仿真;Observer 模型是库模型或子系统引用模型时也不仿真。
Observer Reference 模块被忽略的情形:使用普通模式以外的仿真模式(如 accelerator、SIL/PIL);正在生成代码;Observer Reference 模块位于模型引用层次中(它只支持放在顶层模型根级);Observer Reference 模块位于另一个 Observer 模型中(不支持 Observer 模型递归嵌套)。
数据导出与输出:观察者支持记录信号/数据存储内存、保存最终工作点;其余导出选项(时间、状态、输出、最终状态、保存到文件)均不支持;To Workspace 与 Dashboard 模块在观察者中不支持,不产生输出。
设置冲突时以设计模型为准:当 Observer 模型与设计模型在数据导入导出设置、覆盖率设置、求解器停止时间上不一致时,采用设计模型设置,Observer 模型设置被忽略。
Observer 模型必须保存在 MATLAB 路径上的可写文件夹;转换验证子系统为 Observer Reference 前请确认可接受不可逆后果。