Simulink RTW的外部模式
简介
外部模式提供了两个分立系统之间的通信,也就是主机和目标机之间的通信。主机是指运行MATLAB和Simulink环境的计算机。而目标机则是指运行由RTW生成的可执行文件的计算机。
主机(Simulink环境)通过传递消息来要求目标机接收改变的参数或是上传信号数据。然后目标机就会执行这些操作。外部模式的通信是基于一种客户端/服务器的结构,其中Simulink环境扮演客户端的角,而目标机则扮演服务器。
外部模式可以帮助你:
l 实时修改block参数。在外部模式中你可以随时修改block表中的参数,Simulink引擎会将他们下载到正在执行的目标机程序中。这样你就可以在不用重新编译的情况下修改你程序中的参数了。
l 观察并记录各种block和子系统的输出。在不用编写任何接口程序的情况下你可以监控和/或
保存从目标机程序中获得的信号数据。你也可以自己定义上传数据的条件,比如你可以规定只当某个数据正向穿过0点的时候才上载数据。同样你也可以选择手动上传数据。
要想使外部模式工作,你需要在Simulink引擎和RTW产生的代码之间建立一个通信通道。这个通道的底层通信层控制消息的物理传播。Simulink引擎以及RTW产生的代码对于这个通信层来说都是独立的。这个通信层以及实现它的代码被隔离在一个个单独的模块中,而这些模块负责构造,收发消息和数据包。
这种设计允许不同的目标机运用不同的通信层。ERT,GRT,GRTmallc,以及RSim目标机都支持外部模式,而这些外部模式既可以用串口也可以用网线来实现主机和目标机之间的通信。xPC目标机使用了一种自己特有的通信层,风河系统的龙卷风目标机的外部模式只支持TCP/IP协议。串口通信的外部模式只在微软的32位Windows操作系统结构下被实现。这个实时的Windows目标机使用共享内存。
下载机制
在外部模式中,Simulink引擎并不对模型中用模块搭好的系统进行仿真。在默认情况下,当
外部模式被启动的时候,Simulink引擎将全部参数下载到目标系统中。当初始化信息被下载之后,引擎保持在等待状态知直到你改变block图表中的参数或是引擎从目标机上获得数据。
当你在结构图中改变一个参数,Simulink引擎会调用外部接口的MEX文件,将该参数的新的值(以及其它相关信息)作为一个实参传给目标机。这个外部接口MEX文件包含实现一侧进程间通信(IPC)通道的代码。这个IPC通道将Simulink进程(也就是这个MAX文件运行的进程)和运行外部程序的进程连接了起来。并且该MAX文件利用这个IPC通道将参数值传送到外部模式程序中。
而这个通信通道的另一侧则是在外部程序中被实现的。这一侧将这个新的参数值写入目标机的参数结构体中。
Simulink一侧通过发送一个包含参数信息的消息到外部程序来初始化参数下载操作。在客户机/服务器模型的术语中,Simulink侧是客户机而外部程序是服务器。这两个进程可以在异地运行,也可以在本地运行。当在异地运行时,就会用到例如TCP/IP这样的通信协议来传输数据。当客户机和服务器在本地工作时,串口通信或是共享内存就可以被用来传输数据了。
下面的示意图很清楚地展示了这种关系。当结构图中的参数被改变时,Simulink引擎便会调用外部接口MEX文件。随后这个MEX文件就会通过通信通道将参数下载到外部程序中。
外部模式结构图
建立外部模式通信通道
介绍
这部分将告诉你如何利用自己编写的底层通信层的外部模式连接你自己的目标机。这部分主要包括以下几个主题:
l 外部模式的设计和操作的概述
l 外部模式源文件的描述
l 修改外部模式源文件以及建立用来执行默认的ext_comm MEX-文件的任务的可执行文件
这部分假设你已经熟悉RTW程序的执行以及与外部模式相关的基本操作。在程序结构和外部模式两部分中描述了相关内容。
外部模式的设计
Simulink引擎和目标机系统之间的外部模式通信是基于一种客户端/服务器的结构。客户端(Simulink引擎)向服务器(目标机)发送消息来改变参数或者是要求其上载信号数据。于是服务器便会执行这些要求。
低级通信层控制着消息的物理传播。Simulink引擎和模块代码都独立于这个通信层。这个通信层以及实现它的代码被隔离在一个个单独的模块中,而这些模块负责构造,收发消息和数据包。
这种设计为不同的目标机用不同的通信层提供了可能。GRT,GRT malloc,ERT,以及RSim 目标都支持利用RS232(串口)和TCP/IP协议的主机/目标机通信。RTWin目标机支持共享内存通信,风河系统龙卷风目标机只支持TCP/IP。串口通信的外部模式只在微软的32位Windows操作系统结构下被实现。
实时工具箱的产品为客户端和服务器端的外部模式模块都提供了完整的源文件。这些源文件被用于GRT,GRT malloc,ERT,快速仿真,龙卷风目标,以及实时Windows目标和xPC目标等产品。其中主客户端模块是ext_comm.c。主服务器端模块是ext_svr.c。
这两个模块通过以下的源文件调用指定的通信层:
内置通信层的实现:(ext:execute)
协议 | 客户端/服务器 | 源文件 |
TCP/IP | Client (host) | matlabroot/rtw/ext_mode/tcpip/ext_tcpip_transport.c |
Server (target) | matlabroot/rtw/c/src/ext_mode/common/rtiostream_interface.c 和matlabroot/rtw/c/src/ext_mode/tcpip/rtiostream_tcpip.c | |
Serial | Client (host) | matlabroot/rtw/ext_mode/serial/ext_serial_transport.c |
Server (target) | matlabroot/rtw/c/src/ext_mode/serial/ext_svr_serial_transport.c | |
ext_tcpip_transport.c和ext_serial_transport.c模块实现了客户端通信函数。rtiostream_interface.c/rtiostream_tcpip.c和ext_svr_serial_transport.c模块包含与之相应的服务器端函数。
你可以将这些文件复制出来,并编辑它们(但不要再源文件上直接修改)。如果你想用你自己的低级通信层来实现外部模式,你可以利用一下模板来创建与上面所说的相似的文件:
·
客户(主机)端: matlabroot/rtw/ext_mode/custom/ext_custom_transport.c
· 服务器(目标机)端: matlabroot/rtw/c/src/ext_mode/tcpip/rtiostream_tcpip.c (TCP/IP),
或 matlabroot/rtw/c/src/ext_mode/custom/ext_svr_custom_transport.c (serial)
注意:不要修改用于工作的源文件。你可以利用/custom or /tcpip目录下提供的模板。在刚开始的时候按照里面的注释的指导做。
你只需要提供实现底层通信的代码。你不需要考虑主机与目标机之间的数据转换或者是消息的格式等问题。RTW软件已经写好了这不问的函数。
客户端(Simulink引擎)的通信被ext_comm (负责TCP/IP协议)和 ext_serial_win32_comm (负责串口协议) MEX文件控制。
而服务器(目标机)一侧,在生成代码的时候,如果生成外部模式代码的选项被选择的话,外部模式模块将会被自动连接到目标可执行文件当中。而这个自动连接的过程是遵循“目标代
码生成选项”对话框中的外部模式通信选项的。这些模块被主程序以及模型执行引擎调用。但这些模块是独立于模型生成的代码的。
实现你自己的客户端的底层通信协议的一般步骤如下:
1、编辑模板ext_custom_transport.c(客户端的),用你自己编写的低级通信函数替换原有的通信函数。
2、为你自定义的通信生成一个MEX文件的可执行文件。
3、在Simulink软件上注册你的新的通信层。这样这个通信层就可以在参数设定对话框中的接口栏中被选择。
实现你自己的客户端低级通信协议的一般步骤如下:
1、编辑rtiostream_tcpip.c (TCP/IP) or ext_svr_custom_transport.c (serial)模板(两个都是服务器端的(目标机端的)),并用此替换低级通信函数。
进程间通信 共享内存 2、修改TMF文件来支持对于该目标机的新的通信。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论