主要内容

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

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

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

  • 外部模式源文件的描述

  • 修改外部模式源文件并构建可执行文件以处理默认的任务的指南ext_comm.MEX文件

本节假设您熟悉执行金宝app®编码器™程序,以及外部模式的基本操作。

外部模式设计

Simulink引擎和目标系统之间的外部模式通信基于客户端/服务器架构。金宝app客户端(Simulink引擎)将金宝app请求服务器(目标)的消息发送以接受参数更改或上载信号数据。服务器通过执行请求来响应。

低级传输层处理消息的物理传输。Simulink引金宝app擎和模型代码都独立于这一层。传输层和直接与传输层接口的代码都被隔离在单独的模块中,这些模块格式化、传输和接收消息和数据包。

这种设计使得不同的目标可以使用不同的传输层。GRT,ERT和RSIM通过使用TCP / IP和RS-232金宝app(串行)通信支持主机/目标通信。当金宝appSimulink Desktop Real-Time™Target支金宝app持共享内存通信。风河®系统龙卷风®目标仅支持TC金宝appP / IP。

金宝app仿真软件编码器产品为客户端和服务器端外部模式模块提供完整的源代码,如GRT,ERT,快速仿真和龙卷风目标所使用的金宝app桌面实时仿真软件金宝appSimulink Real-Time™下载188bet金宝搏产品。主要的客户端模块是ext_comm.c..主服务器端模块是ext_svr.c.

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

内置传输层实现

协议

客户或服务器?

源文件

TCP / IP.

客户(主机)

服务器(目标)

序列号

客户(主机)

服务器(目标)

用于串行通信,模块ext_serial_transport.c.rtiostream_serial.c实现客户端传输功能和模块ext_svr_serial_transport.c.rtiostream_serial.c实现相应的服务器端功能。用于TCP/IP通信的模块rtiostream_interface.cRTIOSTREAD_TCPIP.c.实现客户端和服务器端功能。您可以编辑这些文件的副本(但不能修改原始文件)。您可以使用自己的金宝app底层通信层通过使用以下模板创建类似的文件来支持外部模式:

  • 客户端(主机)方:matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.(TCP / IP)或matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreamSerial /rtiostream_serial.c(串行)

  • 服务器(目标)方:matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.(TCP / IP)或matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreamSerial /rtiostream_serial.c(串行)

rtiostream_interface.c文件是外部模式协议和一个接口Rtiostream.通信通道。有关实现和测试的详细信息Rtiostream.通信渠道,请参阅:

实施你的Rtiostream.通过使用文档化的接口来实现通信通道,以避免对文件进行更改rtiostream_interface.c或其他外部模式相关文件。

注意

不要修改工作源文件。使用提供的模板/习惯或者/ Rtiostream.文件夹作为起点,由它们内的评论指导。

您只需要提供实现低级通信的代码。您不需要关心诸如主机和目标之间的数据转换或消息的格式等问题。当金宝app仿真软件编码器软件处理这些功能。

在客户端(Simulink引擎金宝app)端,通信由ext_comm.(用于TCP / IP)和ext_serial_win32_comm.(对于串行)MEX文件。

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

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

  1. 编辑模板RTIOSTREAD_TCPIP.c.用你自己的沟通电话代替低级的沟通电话。

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

  3. 使用Simulink软件注册您的新传输层,以便可以使用型号选择传输金宝app界面对话框中的。

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

实现服务器端底层传输协议的一般过程如下:

  1. 编辑模板RTIOSTREAD_TCPIP.c.用你自己的沟通电话代替低级的沟通电话。这通常涉及为目标硬件编写或集成设备驱动程序。

  2. 修改模板makefiles以支持新的传输。金宝app

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

外部模式通信概述

本节提供了如何的高级概述金宝app仿真软件编码器生成的程序与Simulink外部模式通信。金宝app该描述基于随附的外部模式的TCP/IP版本金宝app仿真软件编码器产品。

为了进行通信,服务器(目标)程序和Simulink软件必须执行。金宝app这并不意味着服务器系统中的模型代码必须执行。服务器可以等待Simulink引擎发出命令以启动模型执行。金宝app

客户端和服务器端使用双向的套接字进行通信。数据包由以下任意一个组成消息(命令、参数下载和响应)或数据(信号上传)。

对象调用目标应用程序时-W.命令行选项,程序进入等待状态,直到它从主机收到消息。否则,程序开始执行模型。虽然目标应用程序处于等待状态,但Simulink引擎可以将参数下载到目标并配置数据上传。金宝app

当用户选择连接到目标选项来自模拟菜单,主机通过发送握手握手ext_connect消息.服务器以自己的信息作为响应。这些信息包括

  • 校验和。主机使用模型校验和来确定目标代码是当前Simulink模型的精确表示。金宝app

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

此时,主机和服务器已经连接。服务器要么正在执行模型,要么处于等待状态。(在后一种情况下,用户可以通过选择开始模型执行启动实时代码模拟菜单。)

在模型执行期间,消息服务器作为后台任务运行。此任务接收和处理参数下载等消息。

数据上传包括信号包的前台执行和后台服务。当目标计算模型输出时,它还将信号值复制到数据上传缓冲区中。这是与每个任务标识符(t).因此,数据收集发生在前台。然而,收集的数据的传输是作为后台任务进行的。后台任务使用数据包将集合缓冲区中的数据发送到Simulink引擎。金宝app

主机启动大多数交换为消息。目标通常会发送响应,确认它已收到并处理消息。消息和命令的示例是:

  • 连接消息/连接响应

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

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

  • 用于数据上传/ ARM触发响应的ARM触发

  • 终止目标仿真/目标关闭响应

当模型达到最终时间时,模型执行终止,当主机发送终止命令时,或者停止模拟块终止执行时。在终止时,服务器通知主机模型执行已停止,然后关闭其套接字。主机还将其插入套接字,并退出外部模式。

外部模式源文件

客户端(主机)MEX文件界面源文件

MEX文件界面组件的源文件位于文件夹中matlabroot./工具箱/编码器/ simul金宝appinkcoder_core ext_mode /主机开放),除非另有说明:

  • common / ext_comm.c.

    此文件是外部模式通信的核心。它充当目标和Simulink引擎之间的中继站。金宝appext_comm.c.通过使用共享数据结构对Simulink引金宝app擎进行通信,externalsim.它通过对传输层的调用通信给目标。

    执行的任务ext_comm.c.包括建立与目标的连接,下载参数和与目标连接的连接。

  • common / Rtiostream_Interface.c.

    该文件是外部模式协议和Rtiostream.通信通道。有关实施的更多细节Rtiostream.通信通道,看通信Rteostream API.(嵌入式编码器).实施你的Rtiostream.通信通道使用记录的界面避免必须更改文件rtiostream_interface.c或其他外部模式相关文件。

  • matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.

    此文件实现所需的TCP / IP传输层函数。版本RTIOSTREAD_TCPIP.c.附带了金宝app仿真软件编码器软件使用TCP / IP功能,包括recv()发送(),和套接字()

  • matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreamSerial /rtiostream_serial.c

    此文件实现所需的串行传输层函数。版本rtiostream_serial.c附带了金宝app仿真软件编码器软件使用串行功能,包括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.在Simulink引擎中使用标准的接金宝app口MEXFUTCTION.调用。(见MEXFUTCTION.参考页面和为您的应用程序选择一个MATLAB API有关更多信息。)ext_main.c.包含一个函数分配器,esGetAction,从Simulink引擎发送请求金宝appext_comm.c.

  • common / ext_convert.c.ext_convert.h.

    此文件包含用于将数据从主机转换为目标格式的函数(反之亦然)。函数包括字节交换(大小 - endian),从非IEEE转换®浮点到IEEE双精度浮点数和其他转换。这些函数都被调用ext_comm.c.并且直接由Simulink引擎(通过使用金宝app函数指针)。

    注意

    您无需自定义ext_convert.实现自定义传输层。但是,您可能需要自定义ext_convert.对于预期的目标。例如,如果目标代表浮动数据类型为Texas Instruments™格式,ext_convert.必须修改以对IEEE转换执行德州仪器。

  • 共同/ extsim.h.

    此文件定义了externalsim数据结构和访问宏。该结构用于Simulink引擎与Simulink引擎之间的通信金宝appext_comm.c.

  • 共同/ extutil.h.

    该文件仅包含编译的条件断言宏。

  • 常见/ ext_transport.h

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

服务器(目标)源文件

这些文件被链接到模型. exe可执行。它们位于内部matlabroot./ rtw / c / src / ext_mode开放)除非指出。

  • 常见/ ext_svr.c

    ext_svr.c.类似于ext_comm.c.在主机上,但通常负责更多任务。它充当主机和生成的代码之间的中继站。likeext_comm.c.ext_svr.c.执行与主机建立和终止连接等任务。ext_svr.c.还包含将下载参数写入目标模型的后台任务功能,或从目标数据缓冲区中提取数据并将其发送回主机。

  • common / Rtiostream_Interface.c.

    该文件是外部模式协议和Rtiostream.通信通道。有关实施的更多细节Rtiostream.通信通道,看通信Rteostream API.(嵌入式编码器).实施你的Rtiostream.通过使用文档化的接口进行通信,以避免不得不更改文件rtiostream_interface.c或其他外部模式相关文件。

  • matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.

    此文件实现所需的TCP / IP传输层函数。版本RTIOSTREAD_TCPIP.c.附带了金宝app仿真软件编码器软件使用TCP / IP功能,包括recv()发送(),和套接字()

  • matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreamSerial /rtiostream_serial.c

    此文件实现所需的串行传输层函数。软件附带的Rtiostream_serial.c使用串行功能,包括ReadFile ()writefile(),和CreateFile()

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

    此文件定义了RTIOSTREAM *功能实现RTIOSTREAD_TCPIP.c.

  • serial / ext_svr_serial_transport.c.

    此文件实现所需的串行传输层函数。ext_svr_serial_transport.c.包括串行/ ext_serial_utils.c,其中包含客户端和服务器边共用的功能。

  • 常见/ updown.c.

    updown.c处理与目标模型相互作用的细节。在参数下载期间,updown.c将新的参数安装到模型的参数向量中。对于数据上传,updown.c包含从模型中提取数据的函数block向量并将数据写入上传缓冲区。updown.c为以下两方面提供服务ext_svr.c.以及模型代码(例如,grt_main.c).它包含通过使用的后台任务调用的代码ext_svr.c.以及作为较高优先级模型执行的一部分调用的代码。

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

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

  • 常见/ upown_util.h.

    该文件仅包含编译的条件断言宏。

  • 常见/ ext_svr_transport.h

    此文件定义了ext *必须由服务器(目标)传输层实现的函数。

服务器文件夹中的其他文件

  • common / ext_share.h.

    包含主机和目标模块所需的消息代码定义和其他定义。

  • 串行/ ext_serial_utils.c

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

  • 串行传输实现包括附加文件

    • 串行/ ext_serial_pkt.cext_serial_pkt.h

    • serial / ext_serial_port.h.

实现自定义传输层

定制传输层的要求

  • 默认情况下,ext_svr.c.updown.c使用Malloc.为消息,数据收集和其他目的分配目标内存中的缓冲区,尽管还有一个选项来预先采用静态存储器。如果您的目标使用另一个内存分配方案,则必须修改这些模块。

  • 假设目标同时支持这两种情况金宝appINT32_T.UINT32_T.数据类型。

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

实现低级传输协议的客户端(主机)一侧,

  1. 编辑模板文件matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.用你自己的沟通电话代替低级的沟通电话。

    1. 复制并将文件重命名为RTIOSTREAM_的名字.c(替换的名字一个名字对你有意义的)。

    2. 替换功能Rtiostreamopen.RtiostreamClose.rtIOStreamSend,和RTIOSTREADRECV.使用函数(相同名称的)调用您的低级通信基元。通过其他外部模式模块调用这些函数rtiostream_interface.c.有关更多信息,请参阅通信Rteostream API.(嵌入式编码器)

    3. 建立你的Rtiostream.实现到共享库中,该共享库导出Rtiostreamopen.RtiostreamClose.RTIOSTREADRECV.rtIOStreamSend功能。

  2. 使用MATLAB构建自定义的MEX文件可执行文件®梅克斯函数。看到重建ext_comm和ext_serial_win32 mex文件的MATLAB命令例如,梅克斯调用。

    不要取代现有ext_comm.mex文件,如果你想保留它的功能。相反,使用与产出选项来命名新的可执行文件,例如,my_ext_comm.有关更多信息,请参阅梅克斯

  3. 使用Simulink软件注册新的客户端传输层,以便可以使用使用的模型来选择传输金宝app界面对话框中的。有关详细信息,请参阅注册自定义客户端(主机)传输协议

列出了用于重建外部模式MEX文件的示例命令重建ext_comm和ext_serial_win32 mex文件的MATLAB命令

MATLAB重建ext_comm和ext_serial_win32 MEX-Files的命令

下表列出了用于构建该标准的命令ext_comm.ext_serial_win32.PC和UNIX上的模块®平台。

平台

命令

窗户®,TCP / IP

cd (matlabroot)墨西哥人工具箱/编码器/ simul金宝appinkcoder_core / ext_mode / host / common / ext_comm.c......工具箱/编码器/ simul金宝appinkcoder_core / ext_mode /主机/共同/ ext_convert.c......工具箱/编码器/ simul金宝appinkcoder_core / ext_mode / host / common / rtiostream_interface.c......工具箱/编码器/ simul金宝appinkcoder_core / ext_mode / host / common / ext_util.c......-R2018A......-Itoolbox /编码器/ rtiostream / src......-toolbox / coder / Rtiostream / src / utils_host......-Itoolbox /编码器/ 金宝appsimulinkcoder_core / ext_mode /主机/共同/包括......-Irtw / c / src / ext_mode /常见......-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

  • 用正斜杠更换后斜杠。

窗户,串行

cd (matlabroot)墨西哥人工具箱\编码器\ simul金宝appinkcoder_core \ ext_mode \ \常见\ ext_comm.c......工具箱\译文\ simuli金宝appnkcoder_core \ ext_mode \ host \ common \ ext_convert.c......工具箱\译文\ simuli金宝appnkcoder_core \ ext_mode \ host \ serial \ ext_serial_transport.c......工具箱\译码器\ simul金宝appinkcoder_core \ ext_mode \ host \ serial \ ext_serial_pkt.c......工具箱\编码器\ simul金宝appinkcoder_core \ ext_mode \主机\系列\ rtiostream_serial_interface.c......工具箱\编码器\ simul金宝appinkcoder_core \ ext_mode \ host \ common \ ext_util.c......-R2018A......-Itoolbox \编码器\ rtiostream \ src......-Itoolbox \编码器\ rtiostream \ src \ utils_host......-Itoolbox \编码器\ 金宝appsimulinkcoder_core \ ext_mode \主机\常见......-Itoolbox \编码器\ 金宝appsimulinkcoder_core \ ext_mode \ \常见\包括......-irtw \ c \ src \ ext_mode \ common......-irtw \ c \ src \ ext_mode \ serial......-lmwrtiostreamutils.-lmwsl_services......-dextmode_serial_transport.-dsl_ext_dll.......与产出my_ext_serial_comm

注意

rtiostream_interface.c函数定义RTIOSTREAM_SHARED_LIB为libmwrtiostreamserial并动态加载MathWorks序列Rtiostream.共享库。如果需要加载不同的情况,请修改此文件Rtiostream.共享库。

Linux,Serial.

使用Windows命令,其中包含以下更改:

  • 改变-dsl_ext_dll.到目前为止-DSL_EXT_SO

  • 用正斜杠更换后斜杠。

麦克铁,序列

使用Windows命令,其中包含以下更改:

  • 改变-dsl_ext_dll.到目前为止-DSL_EXT_DYLIB

  • 用正斜杠更换后斜杠。

注意

梅克斯需要Matlab API支持的编译器。金宝app看看梅克斯参考页面和为您的应用程序选择一个MATLAB API有关的更多信息梅克斯函数。

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

要使用Simulink软件注册自定义客户端传输协议,您必须将以下表单的条目添加到金宝appsl_customization.mMatlab路径上的文件:

函数sl_customization(cm)cm.extmodetransports.add('STF..tlc”、“运输”、“mexfile.','level1');% -  SL_Customization的结尾

在哪里

  • STF..tlc.是运输将注册的系统目标文件的名称(例如,“grt.tlc”

  • 运输是显示的传输名称传输层菜单上界面“配置参数”对话框的窗格(例如,“mytcpip”

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

您可以使用额外指定多个目标和/或传输cm.extmodetransports.add.例如,线路:

函数sl_customization (cm) cm.ExtModeTransports.add (grt”。tlc', 'mytcpip', 'ext_mytcpip ', 'Level1');cm.ExtModeTransports.add(“接受方。tlc', 'mytcpip', 'ext_mytcpip ', 'Level1');% -  SL_Customization的结尾

如果你把sl_customization.m包含MATLAB路径上的传输注册信息的文件,您的自定义客户端传输协议将在每个后续的Simulink会话中注册。金宝app运输的名称将出现在传输层菜单上界面对话框中的。当您为模型选择传输时,关联的外部接口mex -文件的名称将出现在不可编辑列表中MEX-file名字字段,如下图所示。

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

RTIOSTREAM *功能原型matlabroot./工具箱/编码器/ Rtiostream / src /rtiostream.h为服务器(目标)和客户端(主机)侧传输层函数定义呼叫接口。

  • TCP / IP实现在matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.

  • 串行实现是matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreamSerial /rtiostream_serial.c

注意

ext *功能原型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 / RtiostreadTeamTCPIP /RTIOSTREAD_TCPIP.c.或者matlabroot./工具箱/编码器/ Rtiostream / src / RtiostreamSerial /rtiostream_serial.c用你自己的沟通电话代替低级的沟通电话。

    1. 复制并将文件重命名为RTIOSTREAM_的名字.c(替换的名字一个名字对你有意义的)。

    2. 替换功能Rtiostreamopen.RtiostreamClose.rtIOStreamSend,和RTIOSTREADRECV.使用函数(相同名称)调用低级通信驱动程序。

      中定义的函数必须实现rtiostream.h,您的实现必须符合该文件中定义的原型。参考原文RTIOSTREAD_TCPIP.c.或者rtiostream_serial.c用于指导。

  2. 将传输层的外部模式源文件合并到模型构建过程中。使用构建过程机制,例如邮政编码生成命令或abefore_make.钩子函数使传输文件可用于构建过程。有关构建过程机制的更多信息,请参阅自定义代码后生成构建处理使用STF_make_rtw_hook文件自定义构建过程,和使用sl_customization.m自定义构建过程

    例如:

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

      path/RTIOSTREAM_的名字.c
    • 对于TCP / IP,将以下文件添加到构建信息:

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

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

注意

对于外部模式,请检查此RTIOSTREADRECV.不是一个阻塞实现。否则,它可能会导致外部模式服务器阻塞,直到主机通过通讯层。

串行接收缓冲区小于64字节

对于串行通信,如果目标的串行接收缓冲区小于64字节:

  1. 使用实际的目标缓冲区大小更新以下宏:

    #define target_serial_receive_buffer_size 64.

    在以下文件中实现更改:

    matlabroot./ RTW / C / SRC / EXT_MODE /序列/ext_serial_utils.c.matlabroot./ toolbox / cod金宝apper / simulinkcoder_core / ext_mode / host / serial /ext_serial_utils.c.
  2. 运行命令来重建ext_serial_win32.MEX-file。看到重建ext_comm和ext_serial_win32 mex文件的MATLAB命令

相关主题