上帝:冯工,在你的培训视频里讲了几种模型编译后调参、观测变量的方法,哪几种嘞?
冯工:视频里我讲了Simulink Real Time explorer、Simulink External Mode、M脚本三种方法。
上帝:可我觉得还不够。如果我想让实时仿真模型控制上位机仿真的离线模型,该怎么做?
冯工:恰好有个方法可以一试。
背景
Speedgoat实时系统作为Matlab环境的实时硬件平台,软件上完全依托Matlab/Simulink环境,与该硬件对应的是Simulink Real Time组件。一般而言,Simulink离线仿真时的操作方法,均可以迁移到Speedgoat操作中。比如仿真时修改参数、观测数据的方式,M指令操作模型的方式,DashBoard模块使用等。但实时仿真和离线仿真的差异,使Speedgoat在具体操作上与Simulink离线仿真有些不同。在控制仿真、数据观测、调参功能上,SimulinkReal Time组件提供了多种接口方式,以满足用户不同应用场景的需求。具体如下表(需注意不同版本Matlab,方法略不相同,本文以Matlab2018b为例):
接口方式
环境属性配置
仿真控制
数据观测
调参
是否可脱离Matlab环境
Simulink Real-Time Explorer
√
√
√
√
√
Matlab命令行接口
√
√
√
√
Simulink外部模式(External Mode)接口
√
√
√
Simulink Real Time模块
√
目标机命令行接口
√
√
√
√
Explorer导出Matlab运行
√
√
√
√
Matlab应用
√
√
√
√
基于Microsoft .NET Framework API的自定义UI
√
√
√
√
基于C API的自定义UI
√
√
√
√
上述几种接口方式,这里做简要说明:
Simulink Real-Time Explorer:Speedgoat使用的最基本上位机图形环境,在该环境中,可完成实时机环境配置、实时应用控制、调参、观测数据等功能。
Matlab命令行接口:Simulink Real Time组件提供了很多function函数,可以以m语言的方式,对实时机控制,具体可参见Simulink Real Time帮助文档。
Simulink外部模式(External Mode)接口:该模式下,将simulink模型的仿真模式改为external,即用户可以将simulink模型作为上位机界面,在该界面下观测、调整Speedgoat实时机上运行的应用。
Simulink Real Time模块:Simulink Real Time提供了一些实时模块,可用于构建host/target/file scope观测记录数据;同时也提供了Simulink接口模块,用于构建自定义的图形界面或与上位机其它Simulink模型交互。
目标机命令行接口:Speedgoat实时目标机支持一些指令,用户可以直接连接键盘,以指令方式控制实时应用运行,详情参见Simulink Real Time帮助文档。
Explorer导出Matlab运行:Simulink Real-Time Explorer搭建的图形化界面,是可以导出为独立的exe,脱离matlab环境控制Speedgoat实时应用运行。
Matlab应用:在Matlab中可以用Appdesigner工具创建独立的APP,实现对Speedgoat实时应用的控制观测。
Microsoft .NET Framework API:用户可以基于该API,搭建自己的图形化界面,控制Speedgoat系统
C API: 用户可以基于该API,搭建自己的图形化界面,控制Speedgoat系统。比如在labview下调用该API,实现Labview观测Speedgoat实时应用。
Simulink Real Time模块
在Speedgoat提供的接口库或者SimulinkReal Time库àDisplay and Logging中,提供了以下模块:
Scope模块:用于获取观测模型中的数据,可配置为Target/Host/FileScope,培训视频中有详细说明,这里不再赘述。
Video Display:在Speedgoat连接的显示器上,将实时应用处理的摄像头图像显示出来,这里不赘述。
Enable Profiler:利用Profiler获取实时内核任务调度情况,这里不赘述。
To/From Target:在上位机另外的模型中,通过这两个模块,获取Speedgoat实时应用中的数据、调参。本文重点说明其使用。
Simulink用户接口模型
用户接口模型是指一个包含To/From Target接口模块,以及其它组件模块的模型。基于该模型,用户可以连接实时仿真数据与自定义图形界面;如基于Simulink 3D Animation??或 Altia??products的图像界面。To/From Target模块充当了Speedgoat实时运行应用与上位机运行的其他模型间的通讯桥梁。
To Target模块
该模块类似于一个信号接收模块。它接收上位机控制模块发出的信号,并将其传输给Speedgoat运行的实时应用中被标记的特定参数。
该模块基于Matlab S函数实现,会在控制模块发出的信号发生变化时,才将新数值传输给Speedgoat实时应用参数。
From Target
该模块类似于信号源,它将Speedgoat实时应用上传的数据,传输给上位机模型中的显示模块。
该模块在上传数据时,每个信号在每个步长仅上传1个数值。
From/To Target模块底层均是基于Matlab命令函数,因此无法脱离Matlab环境使用。
基本步骤
在下载到Speedgoat上运行的实时模型中决定哪些信号或参数,需要与上位机模型交互
标记需要由上位机模型控制的,实时模型中的参数,具体见后续章节“标记模型参数”
标记需要由上位机模型显示的,实时模型中的信号,具体见后续章节“标记模型信号”
实时模型编译下载,在上位机Matlab中运行SimulinkRealTime.utils.createInstrumentationModel指令,该指令会解析实时应用被标记的内容,自动生成包含所有标记参数、信号对应的To/From Target模块的模板模型,To/From Target模块会以标记的名称显示
在模板模型中添加其他模块,比如Simulink 3D Animation或Altia Design的模块,并与To/From Target模块连接
开始运行Speedgoat实时应用和上位机模型,两者即可实现交互。
标记模型参数
以Matlab自带demo为例:
打开xpctank示例模型,并将其保存到工作路径下:
>> xpctank
在Description窗口,输入xPCTag=label(语法结构为xPCTag(1, . . .index_n)=label_1 . . . label_n; index表征该模块第几个参数,单维参数可以不输入,label之间以空格间隔);比如xPCTag(1)=WaterLevel。
重复依次标记需要的参数并保存。
标记模块信号
在模型中需要标记的信号线上右键,选择Properties.
在Documentation栏中Description窗口,输入XPCTag=label(语法结构为xPCTag(1, . . .index_n)=label_1. . .label_n; index表征该信号线第几个信号,单维信号可以不输入,label之间以空格间隔);比如xPCTag=FromTankLevel;
重复依次标记所需的信号并保存。
操作实例
首先我们基于Simulink 3D Animation自带的“Plane Take-Off with Trajectory Tracing”模型,该模型配合VRTracer模块,可将飞机模拟起飞的动作场景化:
在模型默认的配置针对simulink离线仿真,并不适合实时仿真,因此需要调整。主要是将其分割为2个模型,一部分在speedgoat实时机上实时仿真,另一部分在上位机上离线仿真;中线连接的信号需要标记。如下:
实时仿真部分模型编译下载,运行SimulinkRealTime.utils.createInstrumentationModel(‘模型名称’),自动生成标记的信号接口模块:
将上述接口模块与上位机模型部分连接在一起(可调整下模块的采样率等设置),如下:
最终,同时开始上位机模型和speedgoat实时仿真,演示视频如下:
总结
Simulink Real Time模块,提供了Speedgoat实时仿真模型与上位机Simulink仿真模型的交互接口,用户可以基于该功能,实现与MATLAB/Simulink环境的其它组件离线仿真交互,如演示的和Simulink 3D Animation组件的交互。
Speedgoat实时系统与Matlab/Simulink的交互不止该方法,后期会逐步介绍。