创建TCP / IP或串行外部模式通讯传输层

本节将帮助您通过使用自己的低级别的通信层外部模式自定义目标连接。主题包括:

  • 的外部模式的设计和操作的概述

  • 的外部模式源文件的说明

  • 修改外部模式源文件并生成可执行处理默认的任务指南ext_commMEX文件

本节假定您熟悉的执行万博1manbetx®编码器™方案,并与外部模式的基本操作。

外部模式的设计

Simulink的发动机和目标系统之间的外部通信方式是基于客户机/服务器体系结构万博1manbetx。客户端(Simulink的发动机万博1manbetx)发送请求的服务器(目标)接受参数的变化或上传信号数据消息。服务器通过执行这个请求。

一个低级别的传输层处理消息的物理传输。两者的Simuli万博1manbetxnk发动机和型号代码是独立于该层的。两个传输层和代码直接接口到传输层被隔离在独立的模块,其格式,发送,和接收消息和数据分组。

这样的设计使得它可以针对不同的目标使用不同的传输层。的GRT,ERT和RSIM目标通过使用TCP / IP和RS-万博1manbetx232(串行)通信支持主机/目标的通信。该万博1manbetxSimulink的桌面实时™目标支撑件共享万博1manbetx存储器的通信。风河®系统龙卷风®目标只支持TC万博1manbetxP / IP。

万博1manbetxSimulink的编码器产品提供了完整的源代码用于客户端和服务器端外部模式模块两者,作为所使用的GRT,ERT,快速仿真,和龙卷风目标,以及万博1manbetxSimulink的桌面实时万博1manbetxSimulink的实时™s manbetx 845产品。主客户端模块是ext_comm.c。主服务器侧模块是ext_svr.c

这两个模块调用通过以下源文件指定的传输层。

内置传输层实现

协议

客户端或服务器?

源文件

TCP / IP

客户端(主机)

服务器(目标)

串行

客户端(主机)

服务器(目标)

用于串行通信,所述模块ext_serial_transport.crtiostream_serial.c实现客户端侧传送功能和模块ext_svr_serial_transport.crtiostream_serial.c执行相应的服务器侧的功能。对于TCP / IP的通信,所述模块rtiostream_interface.crtiostream_tcpip.c实现了客户端和服务器端的功能。您可以编辑这些文件的副本(但不修改原件)。您可以通过以下模万博1manbetx板创建类似的文件,使用自己的低级别的通信层支持外接方式:

  • 客户端(主机)端:matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c(TCP / IP)或matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamserial /rtiostream_serial.c(串行)

  • 服务器(目标)方面:matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c(TCP / IP)或matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamserial /rtiostream_serial.c(串行)

rtiostream_interface.c文件是外部模式协议和之间的界面rtiostream通信信道。有关实现和测试的详细资料rtiostream通信信道,请参见:

实现你rtiostream通过使用所记录的接口的通信信道,以避免不必更改到该文件rtiostream_interface.c或其他外部模式相关的文件。

注意

不要修改工作的源文件。使用中提供的模板/自定义要么/ rtiostream文件夹作为出发点,通过内他们的意见指导。

你只需要提供代码实现低级别的通信。你不必与问题的关注,如数据转换主机和目标之间,或消息的格式。该万博1manbetxSimulink的编码器软件处理这些功能。

在客户端(Simulink的发万博1manbetx动机)侧,通信由处理ext_comm(用于TCP / IP)和ext_serial_win32_comm(串行)MEX-文件。

在服务器(目标)侧,外部模式下的模块被链接到目标可执行文件。这在代码生成时自动发生,如果你选择外部模式并且是基于传输层选择您指定。的模块,从主程序和模型执行引擎调用时,是独立于所生成的模型的代码。

为实现自己的客户端的低级别的传输协议的一般程序如下:

  1. 编辑模板rtiostream_tcpip.c更换用自己的通讯调用低级别的来电来函。

  2. 为您的自定义传输一个MEX文件的可执行文件。

  3. 与Simulink的软件注册新的传输层,从而使运输可以选择使用一个模型万博1manbetx接口配置参数对话框的窗格。

有关详细信息,请参阅创建自定义客户端(主机)传输协议

为实现自己的服务器端的低级别的传输协议的一般程序如下:

  1. 编辑模板rtiostream_tcpip.c更换用自己的通讯调用低级别的来电来函。这通常需要编写或目标硬件集成的设备驱动程序。

  2. 修改模板Makefile文件以支持新的运输。万博1manbetx

有关详细信息,请参阅创建自定义服务器(目标)传输协议

外部模式通信概述

本节给出如何高层次概述万博1manbetxSimulink的编码器使用Simulink外部模式生成程序通信。万博1manbetx这个描述是基于TCP / IP版本的外部模式附带的万博1manbetxSimulink的编码器产品。

对于通信发生,同时在服务器(目标)程序和Simulink的软件必须执行。万博1manbetx这并不意味着,在服务器系统中的模型代码必须执行。该服务器可以等待Simulink的发动机发出命令来启动模型执行。万博1manbetx

客户端和服务器通过使用携带数据包双向交流插​​座。包由任消息(命令,参数下载,和响应)或数据(信号上传)。

如果目标应用是与调用-w命令行选项,该程序,直到它从主机收到一条消息进入等待状态。否则,该程序将开始执行模型的执行。虽然目标应用是处于等待状态,Simulink的发动机可以下载参数,目标和配置数据上传。万博1manbetx

当用户选择连接到目标从选项模拟菜单上,主机通过发送启动握手EXT_CONNECT消息。该服务器关于自身的信息进行响应。这些信息包括

  • 校验。主机使用模型校验,以确定目标代码是当前Simulink模型的确切表示。万博1manbetx

  • 数据格式的信息。格式化要下载数据时,或解释已上载数据的主机使用此信息。

在这一点上,主机和服务器连接。该服务器是执行模式或处于等待状态。(在后一种情况下,用户可以开始通过选择模型执行开始实时代码来自模拟菜单。)

在模型执行,消息服务器作为后台任务。此任务接收和处理的消息,例如参数的下载。

数据上传既包括前景执行和背景的信号分组的服务。作为目标计算模型输出,它也副本信号值到数据上传缓冲器。这种情况发生时,与每个任务标识符相关联的任务的一部分(TID)。因此,数据收集发生在前台。收集到的数据传输,但会发生作为后台任务。后台任务,通过使用数据包发送在收集的缓冲区到Simulink的发动机数据。万博1manbetx

主机启动大多数交易所的消息。目标通常会发送确认已接收和处理所述消息的响应。消息和命令的例子是:

  • 连接消息/连接响应

  • 启动目标模拟/响应启动

  • 参数下载/参数下载响应

  • 臂触发数据上传/臂触发响应

  • 终止目标模拟/关断目标响应

当模型达到其最终时刻,当主机发出一个终止命令时,或者当停止仿真块终止执行模型执行终止。在终端,服务器通知模型停止执行的主机,并关闭其插座。主机也关闭其插座,并退出外部模式。

外部模式源文件

客户端(主机)MEX文件接口源文件

对于MEX文件接口组件的源文件所在的文件夹中matlabroot/工具箱/编码器/ simul万博1manbetxinkcoder_core / ext_mode /主机打开),除非另有说明:

  • 通用/ ext_comm.c

    该文件是外部模式通信的核心。它作为在靶和Simulink的发动机之间的中继站。万博1manbetxext_comm.c通过使用共享数据结构的Simulink的万博1manbetx发动机连通,ExternalSim。它通过使用传输层调用目标进行通信。

    通过任务进行ext_comm.c包括建立与目标的连接,参数下载,并终止与目标的连接。

  • 通用/ rtiostream_interface.c

    该文件是外部模式协议和之间的界面rtiostream通信信道。有关实现的更多详细信息rtiostream通信信道,见通信rtiostream API(嵌入式编码)。实现你rtiostream使用所记录的接口的通信信道,以避免不必更改文件rtiostream_interface.c或其他外部模式相关的文件。

  • matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c

    此文件实现所需的TCP / IP传输层的功能。的版本rtiostream_tcpip.c万博1manbetxSimulink的编码器软件使用TCP / IP功能,包括:的recv()发送()插座()

  • matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamserial /rtiostream_serial.c

    该文件将实现要求的串行传输层的功能。的版本rtiostream_serial.c万博1manbetxSimulink的编码器软件采用串行功能,包括:ReadFile的()WriteFile的()的CreateFile()

  • 串行/ ext_serial_transport.c

    该文件将实现要求的串行传输层的功能。ext_serial_transport.c包括ext_serial_utils.c,它位于matlabroot/ RTW / C / SRC / ext_mode /串行打开),并包含了这些功能共同客户端和服务器端。

  • 通用/ ext_main.c

    此文件是外部模式MEX文件包。ext_main.c通过使用标准的接口连接到Simuli万博1manbetxnk的发动机mexFunction呼叫。(见mexFunction参考页和为应用程序选择一个MATLAB API(MATLAB)了解更多信息。)ext_main.c包含一个函数调度,esGetAction,发送在Simulink引擎请求万博1manbetxext_comm.c

  • 通用/ ext_convert.cext_convert.h

    此文件包含用于从主机将数据转换成目标格式(反之亦然)的功能。功能包括从非IEEE字节交换(大,小端),转换®彩车IEEE双打,和其他转换。这些功能是通过所谓的两ext_comm.c并直接由发动机的Simulink(通过使万博1manbetx用函数指针)。

    注意

    你并不需要定制ext_convert要实现自定义的传输层。但是,您可能希望定制ext_convert与预期目标。例如,如果目标表示浮动德州仪器™格式的数据类型,ext_convert必须进行修改,以执行德州仪器IEEE转换。

  • 通用/ extsim.h

    此文件定义ExternalSim数据结构和访问宏。此结构被用于Simulink的发动机之间的通信万博1manbetxext_comm.c

  • 通用/ extutil.h

    此文件只包含的编译条件语句断言宏。

  • 通用/ ext_transport.h

    此文件定义了必须由传输层来实现的功能。

服务器(目标)源文件

这些文件链接到模型。可执行程序可执行文件。它们位于内matlabroot/ RTW / C / SRC / ext_mode打开),除非另有说明。

  • 通用/ ext_svr.c

    ext_svr.c类似于ext_comm.c在主机上,但一般是负责更多的任务。它作为在主机和所生成的码之间的中继站。喜欢ext_comm.cext_svr.c执行任务,如建立和终止与主机连接。ext_svr.c还包含了后台任务功能,要么写参数下载到目标模式,或从目标数据缓冲区中提取数据,并将其发送回主机。

  • 通用/ rtiostream_interface.c

    该文件是外部模式协议和之间的界面rtiostream通信信道。有关实现的更多详细信息rtiostream通信信道,见通信rtiostream API(嵌入式编码)。实现你rtiostream通过使用所记录的接口的通信信道,以避免不必更改文件rtiostream_interface.c或其他外部模式相关的文件。

  • matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c

    此文件实现所需的TCP / IP传输层的功能。的版本rtiostream_tcpip.c万博1manbetxSimulink的编码器软件使用TCP / IP功能,包括:的recv()发送()插座()

  • matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamserial /rtiostream_serial.c

    该文件将实现要求的串行传输层的功能。附带软件rtiostream_serial.c的版本使用串行功能,包括ReadFile的()WriteFile的()的CreateFile()

  • matlabroot/工具箱/编码器/ rtiostream / SRC /rtiostream.h

    此文件定义rtIOStream *实现的功能在rtiostream_tcpip.c

  • 串行/ ext_svr_serial_transport.c

    该文件将实现要求的串行传输层的功能。ext_svr_serial_transport.c包括串行/ ext_serial_utils.c,其中包含的功能常见于客户端和服务器端。

  • 通用/ updown.c

    updown.c处理与目标模型交互的细节。在参数下载,updown.c不安装新的参数代入模型的参数向量的工作。对于数据上传,updown.c所包含的功能,从模型的提取数据blockio矢量数据和写数据到上传缓冲区。updown.c提供的服务既ext_svr.c和型号代码(例如,grt_main.c)。它包含了使用的后台任务称为码ext_svr.c以及代码,被称为优先级较高的模型执行的一部分。

  • matlabroot/ RTW / C / SRC /dt_info.h(包括在由生成的模型构建文件模型。H

    这些文件包含数据类型的转变信息,其允许在不同的计算机体系结构访问多数据类型的结构。此信息在主机和目标格式之间的数据转换使用。

  • 通用/ updown_util.h

    此文件只包含的编译条件语句断言宏。

  • 通用/ ext_svr_transport.h

    此文件定义分机*必须由服务器(目标)传输层来实现的功能。

在服务器文件夹其他文件

  • 通用/ ext_share.h

    包含消息代码定义和通过在主机和目标模块都需要的其它定义。

  • 串行/ ext_serial_utils.c

    包含用于通信,MEX链路,且由用于串行协议的传输层的主机和目标模块所需生成的代码的功能和数据结构。

  • 串行传输实现包括其他文件

    • 串行/ ext_serial_pkt.cext_serial_pkt.h

    • 串行/ ext_serial_port.h

实现自定义的传输层

自定义传输层的要求

  • 默认,ext_svr.cupdown.c的malloc分配用于消息,数据收集,和其他用途的目标存储器缓冲器,虽然也有一个选项,以预分配静态存储器。如果你的目标使用其他内存分配方案,则必须修改这些模块。

  • 目标被假定为支持万博1manbetxint32_Tuint32_t的数据类型。

创建自定义客户端(主机)传输协议

为了实现你的低级别的传输协议的客户端(主机)侧,

  1. 编辑模板文件matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c更换用自己的通讯调用低级别的来电来函。

    1. 复制和重命名文件rtiostream_名称。C(取代名称有一个名字对你有意义)。

    2. 更换功能rtIOStreamOpenrtIOStreamClosertIOStreamSendrtIOStreamRecv与打电话给你低级别的通信原语的功能(同名)。这些功能是通过其它外部模式模块调用rtiostream_interface.c。欲了解更多信息,请参阅通信rtiostream API(嵌入式编码)。

    3. 建立你的rtiostream落实到该出口的共享库rtIOStreamOpenrtIOStreamClosertIOStreamRecvrtIOStreamSend功能。

  2. 使用MATLAB构建定制MEX文件的可执行®MEX功能。看到MATLAB命令来重建ext_comm和ext_serial_win32 MEX-文件为例子MEX调用。

    不要替换现有的ext_commMEX文件,如果你想保留其功能。相反,使用- 输出选项来命名新的可执行文件,例如,my_ext_comm。欲了解更多信息,请参阅MEX

  3. 与Simulink的软件注册新的客户端传输层,从而使运输可以选择使用一个模型万博1manbetx接口配置参数对话框的窗格。有关详细信息,请参阅注册自定义客户端(主机)传输协议

重建外部模式MEX-文件样本命令列在MATLAB命令来重建ext_comm和ext_serial_win32 MEX-文件

MATLAB命令重建ext_comm和ext_serial_win32 MEX-文件

下表列出了建立标准的命令ext_commext_serial_win32在PC和UNIX模块®平台。

平台

命令

视窗®,TCP / IP

>>光盘(matlabroot)>> MEX工具箱\编码器\ simulinkc万博1manbetxoder_core \ ext_mode \主机\ COMMON \ ext_comm.c ...工具箱\编码器\ simulinkcoder_core \ ext_mode \主机\ COMMON \ ext_convert.c ...工具箱\编码器\ simulinkcoder_core\ ext_mode \主机\ COMMON \ rtiostream_interface.c ...工具箱\编码器\ sim万博1manbetxulinkcoder_core \ ext_mode \主机\ COMMON \ ext_util.c ... -Irtw \ C \ SRC -Itoolbox \编码器\ rtiostream的\ src \ utils的...-Irtw \ C \ SRC \ ext_mode \共同... -Itoolbox \编码器万博1manbetx\ simulinkcoder_core \ ext_mode \主机\共同... -Itoolbox \编码器\ simulinkcoder_core \ ext_mode \主机\ COMMON \包括... -lmwrtiostreamutils -lmwsl_services。.. -DEXTMODE_TCPIP_TRANSPORT ... -DSL_EXT_DLL  - 输出my_ext_comm

注意

rtiostream_interface.c功能RTIOSTREAM_SHARED_LIB定义为libmwrtiostreamtcpip和动态加载MathWorks的TCP / IPrtiostream共享库。如果您需要加载不同的修改此文件rtiostream共享库。

Linux的®,TCP / IP

使用Windows命令,这些变化:

  • 更改-DSL_EXT_DLL-DSL_EXT_SO

  • 替换回来斜线斜线。

苹果电脑,TCP / IP

使用Windows命令,这些变化:

  • 更改-DSL_EXT_DLL-DSL_EXT_DYLIB

  • 替换回来斜线斜线。

Windows中,串行

>>光盘(matlabroot)>> MEX工具箱\编码器\ simulinkc万博1manbetxoder_core \ ext_mode \主机\ COMMON \ ext_comm.c ...工具箱\编码器\ simulinkcoder_core \ ext_mode \主机\ COMMON \ ext_convert.c ...工具箱\编码器\ simulinkcoder_core\ ext_mode \主机\序列\ ext_serial_transport.c ...工具箱\编码器\ simulinkc万博1manbetxoder_core \ ext_mode \主机\序列\ ext_serial_pkt.c ...工具箱\编码器\ simulinkcoder_core \ ext_mode \主机\序列\ rtiostream_serial_interface.c ...工具箱\编码器\ s万博1manbetximulinkcoder_core \ ext_mode \主机\ COMMON \ ext_util.c ... -Irtw \ C \ SRC -Itoolbox \编码器\ rtiostream的\ src \ utils的... -Irtw \ C \ SRC \ ext_mode \共同...  -Irtw \ C \ SRC \ ext_mode \串行... -Itoolbox \编码器万博1manbetx\ simulinkcoder_core \ ext_mode \主机\共同... -Itoolbox \编码器\ simulinkcoder_core \ ext_mode \主机\ COMMON \包括... -lmwrtiostreamutils -lmwsl_services ..。-DEXTMODE_SERIAL_TRANSPORT -DSL_EXT_DLL ... -output my_ext_serial_comm

注意

rtiostream_interface.c功能RTIOSTREAM_SHARED_LIB定义为libmwrtiostreamserial和动态加载MathWorks的串行rtiostream共享库。如果您需要加载不同的修改此文件rtiostream共享库。

Linux的串行

使用Windows命令,这些变化:

  • 更改-DSL_EXT_DLL-DSL_EXT_SO

  • 替换回来斜线斜线。

苹果电脑,串行

使用Windows命令,这些变化:

  • 更改-DSL_EXT_DLL-DSL_EXT_DYLIB

  • 替换回来斜线斜线。

注意

MEX需要通过MATLAB API支持的编译器万博1manbetx。查看MEX参考页和为应用程序选择一个MATLAB API(MATLAB),了解更多信息MEX功能。

注册自定义客户端(主机)传输协议

要注册与Simulink的软件定制客户端的传输协议,必须添加以下形式的一个条目万博1manbetxsl_customization.m在MATLAB路径下的文件:

功能sl_customization(厘米)cm.ExtModeTransports.add(”STF.tlc ''运输''mexfile', '1级');% -  sl_customization结束

哪里

  • STF.tlc为所述传输将被注册(例如系统目标文件的名称,'grt.tlc'

  • 运输是运输名称在显示传输层在菜单接口配置参数对话框的窗格(例如,'mytcpip'

  • mexfile是传输的相关联的外部接口MEX-文件的名称(例如,'ext_mytcpip_comm'

您可以指定多个目标和/或运输与附加cm.ExtModeTransports.add线,例如:

功能sl_customization(厘米)cm.ExtModeTransports.add( 'grt.tlc', 'mytcpip', 'ext_mytcpip_comm', '级别1');cm.ExtModeTransports.add( 'ert.tlc', 'mytcpip', 'ext_mytcpip_comm', '级别1');% -  sl_customization结束

如果将sl_customization.m包含MATLAB路径上传输注册信息的文件,你的自定义客户端的传输协议将与每个后续的Simulink会议登记。万博1manbetx运输的名字将出现在传输层在菜单接口配置参数对话框的窗格。当您选择模型中的运输,相关的外部接口MEX文件的名称将出现在不可编辑MEX文件名场,如在如下图所示。

创建自定义服务器(目标)传输协议

rtIOStream *功能样机matlabroot/工具箱/编码器/ rtiostream / SRC /rtiostream.h限定用于在服务器(目标)和客户机(主机)侧输送层的功能调用接口。

  • 在TCP / IP实现在matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c

  • 串行实现在matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamserial /rtiostream_serial.c

注意

分机*功能样机matlabroot/ RTW / C / SRC / ext_mode /普通/ext_svr_transport.h在实施matlabroot/ RTW / C / SRC / ext_mode /普通/rtiostream_interface.c要么matlabroot/ RTW / C / SRC / ext_mode /串行/rtiostream_serial_interface.c。在大多数情况下,你不需要修改rtiostream_interface.c要么rtiostream_serial_interface.c为您的自定义的TCP / IP或串行传输层。

为了实现你的低级别的TCP / IP或串行传输协议的服务器(目标)方面:

  1. 编辑模板matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamtcpip /rtiostream_tcpip.c要么matlabroot/工具箱/编码器/ rtiostream / SRC / rtiostreamserial /rtiostream_serial.c更换用自己的通讯调用低级别的来电来函。

    1. 复制和重命名文件rtiostream_名称。C(取代名称有一个名字对你有意义)。

    2. 更换功能rtIOStreamOpenrtIOStreamClosertIOStreamSendrtIOStreamRecv与打电话给你低级别的通信驱动程序的功能(同名)。

      您必须执行规定的职责rtiostream.h和您的实现必须符合该文件中定义的原型。参考原文rtiostream_tcpip.c要么rtiostream_serial.c指导。

  2. 结合外部模式源文件的传输层到模型构建过程。使用构建过程机制,如后代码生成命令或before_make钩子函数,使传输文件提供给构建过程。有关构建过程机制的详细信息,请参阅定制后的代码生成加工订做与STF_make_rtw_hook文件自定义生成过程与sl_customization.m自定义生成过程

    例如:

    • 添加在上一步到构建信息创建的文件:

      路径/rtiostream_名称。C
    • 对于TCP / IP,下列文件添加到构建信息:

      matlabroot/rtw/c/src/ext_mode/common/rtiostream_interface.c
    • 对于串行,将下列文件添加到构建信息:

      matlabroot/rtw/c/src/ext_mode/serial/ext_serial_pkt.cmatlabroot/rtw/c/src/ext_mode/serial/rtiostream_serial_interface.cmatlabroot/rtw/c/src/ext_mode/serial/ext_svr_serial_transport.c

注意

对于外部模式,请检查rtIOStreamRecv是不是阻塞的实现。否则,直到主机通过发送数据则可能会导致外部模式服务器块COMM层。

串行接收缓冲器小于64字节的

用于串行通信,如果串行接收目标的缓冲器是小于64个字节:

  1. 更新与实际的目标缓冲区大小下面的宏:

    的#define TARGET_SERIAL_RECEIVE_BUFFER_SIZE 64

    实施以下文件的变化:

    matlabroot/ RTW / C / SRC / ext_mode /串行/ext_serial_utils.cmatlabroot/工具箱/编码器/ simul万博1manbetxinkcoder_core / ext_mode /主机/串口/ext_serial_utils.c
  2. 运行命令重建ext_serial_win32MEX文件。看到MATLAB命令来重建ext_comm和ext_serial_win32 MEX-文件

相关话题