按照Simulink.SimulationOutput设计,运行仿真之后,工作区会生成一个SimulationOutput对象,用于访问仿真的结果。
创建对象
运行仿真之后就创建一个SimulationOutput对象,包含仿真中的数据。和记录所有仿真元数据的SimulationMetadata对象。
- simulationOutput对象返回记录的数据
- 用who、get、find方法访问输出变量
可在仿真中设置参数“Single simulation output”为真或假,来控制是在SimulationOutput中返回仿真输出,还是直接在基础工作区展开数据。(不知道除了方便查看还有什么用)
属性
- SimulationMetadata:仿真的元数据,是一个SimulationMetadata对象,所以也要实现SimulationMetadata类
- ErrorMessage: 记录仿真的错误信息。返回字符向量。没出错返回None。
对象函数
- find
- 访问和显示仿真结果的值
- output = simOut.find('VarName') 参数为变量名,输出该变量的值
- get(感觉和find完全相同,只做get就行)
- 访问和显示仿真结果的值
- output = simOut.get('VarName')
- 替代方法是先who再find
- getSimulationMetadata
- 从SimulationOutput对象中检索出元数据信息
- mData = simOut.getSimulationMetadata() 输出的mData是一个SimulationMetadata对象
- 与simOut.SimulationMetadata.ModelInfo输出一样,相当于该方法为该属性的get方法
- setUserData
- 将自定义数据存储在SimulationOutput对象包含的SimulationMetadata中
- simoutNew = simOut.setUserData(CustomData) 将包含CustomData的SimulationOutput副本分配给simoutNew
- SimulationMetadata中包含了UserData
- setUserString
- 将自定义字符向量存储在SimulationOutput对象包含的SimulationMetadata中
- simoutNew = simout.setUserString(CustomString) 类似于setUserData,返回的对象包含CustomString,它是自定义的字符向量
- SimulationMetadata中包含了UserString
- who
- 访问和显示模拟的输出变量名字,包含工作区变量
- simOutVar = simOut.who 输出仿真的输出变量名 的 字符向量数组
- plot
- 在Simulation Data Inspector中绘制仿真输出对象simOutObj的仿真输出数据
- runObj = plot(simOutObj) 返回一个Simulink.sdi.Run对象
- simOutObj有很多,目前可以只实现SimulationOutput
- 绘制的信号少于8个时,Simulation Data Inspector布局为1*n,每个子图画一个信号,多于8个时,只画第一个信号
- 需要Simulation Data Inspector对象
- 如果只画一个信号,需要SimulationData.Dataset类
SimulationMetadata
存储关于仿真运行的信息
属性
- ModelInfo: 模型和仿真运行环境的信息,是structure
- ModelName: char
- ModelVersion: char
- ModelFilePath: char 绝对路径
- UserID: char 仿真的机器的系统用户的ID
- MachineName: char 仿真的机器的主机名
- Platform: char 操作系统
- ModelStructuralChecksum: 4–by–1 uint32 更新图后计算模型的校验和
- SimulationMode: char
- StartTime: double
- StopTime: double
- SolverInfo: structure
- 定步长—— Solver type, name, and fixed step size
- 变步长—— Solver type, name, and max step size (initial setting)(暂时没有)
- SimulinkVersion: structure 不需要
- LoggingInfo: structure 不需要
- ExecutionInfo: 存储仿真运行的信息,是structure
- StopEvent: Nontranslated character vector,描述仿真停止的原因,有以下几类
- ReachedStopTime
- ModelStop 在到达停止时间前被模块或求解器中止
- StopCommand
- DiagnosticError 仿真期间发生错误
- KeyboardControlC
- PauseCommand 点击暂停(不需要)
- ConditionalPause (不需要)
- StepForward (不需要)
- StepBackward(不需要)
- TimeOut
- StopEventSource:类型为SimulationData.BlockPath。停止事件的来源 (不需要)
- StopEventDescription: 类型为Translated character vector,存储在上述1和2中的信息的超集(不太明白,感觉我们应该不用)
- ErrorDiagnostic:类型为struct
- 仿真过程中的错误,包含下述字段
- Diagnostic:MSLDiagnostic 对象,包括对象路径、ID、消息、原因和堆栈
- SimulationPhase:由以下之一表示:初始化、执行或终止。
- SimulationTime:double/[]
- 通过将名称-值对 'CaptureErrors', 'on' 传递给 sim 命令,仿真期间生成的错误将在 ExecutionInfo.ErrorDiagnostic 中报告。 sim 命令不会捕获生成的错误。(我们的simulate不知道有没有这个逻辑)
- WarningDiagnostics:struct数组 (和4几乎相同,区别在于error和warning)
- 每个元素包括以下几个字段
- Diagnostic:MSLDiagnostic 对象,包括对象路径、ID、消息、原因和堆栈。
- SimulationPhase:由以下之一表示:初始化、执行或终止。
- SimulationTime:double/[]
- TimingInfo: 存储仿真的分析信息
- WallClockTimestampStart:character vector 格式为YYYY-MM-DD HH:MI:SS,精度微妙
- WallClockTimestampStop:character vector 格式为YYYY-MM-DD HH:MI:SS,精度微妙
- InitializationElapsedWallTime:double 执行前花费的时间,单位是秒
- ExecutionElapsedWallTime: double 执行花的时间,单位秒
- TerminationElapsedWallTime: double
- TotalElapsedWallTime: double 初始化,执行,中止花的总时间,秒
- ProfilerData: Simulink.profiler.Data 模型分析结果(不需要)
- UserString:自定义的符号向量来描述仿真
- 使用setUserString方法来把字符向量存储在SimulationOutput的SimulationMetadata中
- UserData:存储在SimulationMetadata中的数据 character vector
例子
mData=simout.getSimulationMetadata()
simout=simout.setUserData(struct('param1','value1','param2','value2','param3','value3'));
simout=simout.setUserString('Store first simulation results');
mData=simout.getSimulationMetadata()
disp(mData.UserData)
disp(mData.UserString)
Simulation Data Inspector
是simulink画图的东西,暂时可以不做,直接画图
本文章使用limfx的vscode插件快速发布