主要内容

使用C API将生成和外部代码之间的交换数据

一些金宝app®编码器™应用程序必须与生成的模型代码中的信号、状态、根级输入/输出或参数交互。例如,校准应用程序监视和修改参数。信号监视或数据记录应用程序与信号、状态和根级输入/输出数据接口。使用金宝app仿真软件编码器在C API中,您可以构建记录信号、状态和根级输入/输出的目标应用程序,监控信号、状态和根级输入/输出,并在生成的代码执行时调优参数。

C API通过在更小的结构中共享信号、状态、根级输入/输出和参数的公共信息来最小化其内存占用。信号、状态、根级输入/输出和参数结构包括结构映射的索引,允许多个信号、状态、根级输入/输出或参数共享数据。

要开始使用一个例子,请参阅使用C API访问模型信号和状态或者使用C API访问模型参数

生成的C API文件

当您配置一个模型以使用C API时,金宝app仿真软件编码器代码生成器生成两个附加文件,模型_capi.c(或.cpp),模型_capi.h,在那里模型是模型的名称。代码生成器根据“配置参数”对话框中的设置,将两个C API文件放置在生成文件夹中。C API源代码文件包含有关全局块输出信号、状态、根级输入/输出以及在生成的代码模型源代码中定义的全局参数的信息。C API头文件是模型源代码和生成的C API之间的接口头文件。您可以使用这些C API文件中的信息来创建应用程序。生成的文件包括下图所示的文件。

选择C API生成的文件

请注意

当您将代码生成器配置为生成支持C API接口和数据日志的代码时,代码生成器可以在记录到C API文件的块路径中包含块名称的文本金宝app模型_capi.c(或.cpp),模型_capi.h.如果文本包含在模型的字符集编码中未表示的字符,代码生成器将用XML转义序列替换这些字符。例如,代码生成器取代了日本宽屏片假名信ア转义序列ア;.有关更多信息,请参阅国际化和代码生成

生成C API文件

为模型生成C API文件:

  1. 为您的模型选择C API接口。有两种方法可以为您的模型选择C API接口,如下节所述。

  2. 为模型生成代码。

生成代码后,您可以检查文件模型_capi.c(或.cpp),模型_capi.h在模型构建文件夹中。

使用配置参数对话框选择C API

  1. 打开您的模型,并打开配置参数对话框。

  2. 在里面代码生成>接口窗格中,在数据交换界面子组,选择一个或多个C API选项。根据您选择的选项,C API生成的代码中将显示对访问信号、参数、状金宝app态和根级I/O的支持。

    • 如果你想为全局块输出信号生成C API代码,选择为:信号生成C API

    • 如果您想为全局块参数生成C API代码,请选择生成C API:参数

    • 如果要为离散和连续状态生成C API代码,请选择生成C API:状态

    • 如果您想为根级输入和输出生成C API代码,请选择为:根级I/O生成C API

从命令行中选择C API

从MATLAB®命令行中,可以使用set_param函数来选择或清除C API模型配置参数。在MATLAB命令行中,输入一个或多个以下命令,其中modelname是您的模型的名称。

选择为:信号生成C API,输入:

set_param('modelname','rtwcapisignals','开')

清除为:信号生成C API,输入:

set_param(“modelname”、“RTWCAPISignals”、“了”)

选择生成C API:参数,输入:

set_param('modelname','rtwcapiparams','开')

清除生成C API:参数,输入:

set_param('modelname','rtwcapiparams','关闭')

选择生成C API:状态,输入:

set_param(“modelname”、“RTWCAPIStates”,“上”)

清除生成C API:状态,输入:

set_param(“modelname”、“RTWCAPIStates”、“了”)

选择为:根级I/O生成C API,输入:

set_param('modelname','rtwcapirootoootio','开')

清除为:根级I/O生成C API,输入:

set_param(“modelname”、“RTWCAPIRootIO”、“了”)

C API文件描述

关于C API文件

模型_capi.c(或.cpp)文件提供带有一致接口的外部应用程序来模拟数据。根据您的配置设置,数据可以是信号,状态,根级输入或输出或参数。在本文件中,该术语数据项指信号、状态、根级输入或输出或参数。C API使用提供数据项属性接口的结构。接口将每个数据项的属性打包到数据结构中。如果模型包含多个数据项,则接口生成一个数据结构数组。数据结构的成员映射到数据属性。

要与数据项接口,应用程序需要每个数据项的以下属性:

  • 名称

  • 块路径

  • 端口号(仅用于信号和根级输入/输出)

  • 地址

  • 数据类型信息:本机数据类型、数据大小、复杂性和其他属性

  • 维度信息:行数、列数和数据方向(标量、向量、矩阵或n维)

  • 定点信息:斜率、偏差、比例类型、字长、指数和其他属性

  • 采样时间信息(仅用于信号、状态和根级输入/输出):采样时间、任务标识符、帧

如下图所示,例如,数据项A的属性位于数据结构DS_A中。数据项B的属性位于数据结构DS_B中。

一些财产对于每个数据项可以是唯一的,并且有一些属性值可以由多个数据项共享。例如,Name对于每个数据项都有唯一的值。接口将唯一的属性值直接放在数据项的结构中。数据项A的name值在DS_A中,数据项B的name值在DS_B中。

但数据类型可以是一个属性,其值与多个数据项相同。一些数据项共享属性的能力允许C API具有重用特性。在这种情况下,接口仅在DS_A中放置索引值,在DS_B中放置索引值。这些索引指向一个不同的数据结构DS_C,它包含实际的数据类型值。下图更详细地显示了该方案。

图中显示了三种信号。signal1signal2共享相同的数据类型,. 接口不在每个信号数据结构中指定此数据类型值,而是在结构中仅提供索引值0。“双倍的”由中的条目0描述RTDATATYPEMAP.数组,它被两个信号引用。此外,属性值可以在信号、状态、根级输入/输出和参数之间共享,因此状态、根级输入/输出和参数也可以引用条目的RTDATATYPEMAP.数组中。此重用信息可降低生成接口的内存大小。

C API文件中生成的结构数组

与数据类型一样,接口将其他常见属性(如地址、维度、定点缩放和示例时间)映射到单独的结构中,并在结构中为数据项提供索引。有关结构定义的完整列表,请参阅该文件matlabroot./ RTW / C / SRC /RTW_CAPI.H.. 该文件还描述了结构中的每个成员。中生成的结构数组模型_capi.c(或.cpp)文件是在中定义的结构类型RTW_CAPI.H.文件下面是在中生成的结构数组的简要说明模型_capi.c(或.cpp):

  • RTBLOCKSIGNALS.是包含有关模型中全局块输出信号信息的结构数组。阵列中的每个元素都是类型结构rtwCAPI_信号.这个结构的成员提供了信号名称、块路径、块端口号、地址和数据类型、维度、定点和采样时间结构数组的索引。

  • rtBlockParameters是一系列结构,其中包含通过块名称和参数名称包含有关模型中可调块参数的信息。阵列中的每个元素都是类型struct rtwCAPI_BlockParameters.该结构的成员将参数名称,块路径,地址和索引提供给数据类型,维度和定点结构阵列。

  • rtBlockStates是一组结构,其中包含有关模型中离散和连续状态的信息。数组中的每个元素都是struct rtwCAPI_States.该结构的成员提供了状态名、块路径、类型(连续或离散)以及地址、数据类型、维度、定点和样例时间结构数组的索引。

  • rtRootInputs是一个结构数组,其中包含有关模型中根级别输入的信息。数组中的每个元素都是结构rtwCAPI_信号.这个结构的成员提供了根级输入名称、块路径、块端口号、地址和数据类型、维度、定点和样例时间结构数组的索引。

  • rtRootOutputs是一个结构数组,其中包含有关模型中根级别输出的信息。数组中的每个元素都是结构rtwCAPI_信号. 此结构的成员为数据类型、维度、定点和采样时间结构数组提供根级别的输出名称、块路径、块端口号、地址和索引。

  • rtmodelparameters.是一个结构数组,其中包含一个或多个块或statflow®模型中的图表作为块参数参考。数组中的每个元素都是数据类型rtwCAPI_ModelParameters.此结构的成员将变量名称,地址和指标提供给数据类型,维度和定点结构阵列。

  • RTDATAAddrmap.是一系列基本地址的信号,状态,根级输入/输出和参数中出现的RTBLOCKSIGNALS.rtBlockParametersrtBlockStates, 和rtmodelparameters.数组。每个元素RTDATAAddrmap.数组是指向无效(无效*)

  • RTDATATYPEMAP.是一个结构数组,其中包含有关模型中各种数据类型的信息。这个数组的每个元素都是类型struct rtwCAPI_DataTypeMap.该结构的成员提供数据类型名称、数据类型的大小以及关于数据是否复杂的信息。

  • RTD尺寸图是一个结构数组,其中包含关于模型中各种数据维的信息。这个数组的每个元素都是类型struct rtwCAPI_DimensionMap.该结构的成员提供有关数据中的维度数量的信息,数据的方向(无论是标量,矢量或矩阵),以及数据的实际尺寸。

  • rtFixPtMap是一系列结构,其中包含有关信号,状态,根级输入/输出和参数的定点信息。这个数组的每个元素都是类型struct rtwCAPI_FixPtMap.此结构的成员提供有关数据缩放、偏差、指数以及定点数据是否有符号的信息。如果模型没有定点数据(信号、状态、根级输入/输出或参数),则金宝app仿真软件编码器软件分配空值或元素的值为零rtFixPtMap数组中。

  • rtSampleTimeMap是一系列结构,其中包含有关模型中的全局信号,状态和根级输入/输出的采样信息。(此阵列不包含有关参数的信息。)此数组的每个元素都是类型struct rtwCAPI_SampleTimeMap.该结构的成员提供有关样本周期,偏移量的信息,偏移,以及数据是否是基于帧的或基于样本的。

生成示例C API文件

次要的C API信号C API州C API根级输入和输出, 和C API参数使用示例模型讨论生成的C API结构rtwdemo_capi.要从示例模型生成代码,请执行以下操作:

  1. 单击打开模型rtwdemo_capi链接上面或通过键入rtwdemo_capi在matlab命令行上。

  2. 如果你想为根级输入/输出生成C API结构rtwdemo_capi,选择模型配置参数为:根级I/O生成C API

    该参数的设置必须在顶级模型和引用模型之间匹配。如果修改参数设置,请将顶部模型和引用模型保存到同一个可写的工作文件夹中。

  3. 为模型生成代码。

下一个子主题中的C API代码示例是用C作为目标语言生成的。

这个模型有三个全局块输出信号,将出现在C API生成的代码中:

  • top_sig1,它是顶部模型中Gain1块输出的一个测试点

  • sig2_eg,它出现在顶部模型中,并在基本工作空间中定义为金宝appsimulink.signal.具有存储类的对象ExportedGlobal

  • bot_sig1,它出现在引用的模型中RTWDEMO_CAPI_BOT.定义为a金宝appsimulink.signal.具有存储类的对象模型的默认

模型也有两个离散的状态,将出现在C API生成的代码中:

  • top_state.,它为顶部模型中的Delay1块定义

  • bot_state.,它是为引用模型中的离散过滤器块定义的

该模型具有在C API生成的代码中出现的根级输入/输出,如果选择“型号配置”参数为:根级I/O生成C API

  • 四个根级输入,三机一体通过In4

  • 6根级输出,着干活通过Out6

此外,该模型有5个全局块参数,将出现在C API生成的代码中:

  • kp.(顶级模特Gain1块和参考模型Gain2块分享)

  • ki.(引用模型Gain3块)

  • P1.(查找表lu1d.

  • P2.(查找表lu2d.

  • P3.(查找表lu3d.

C API信号

rtwCAPI_Signals结构捕获包括信号名称,地址,块路径,输出端口号,数据类型信息,尺寸信息,定点信息和采样时间信息的信号信息。

下面是中的代码部分rtwdemo_capi_capi.c,提供C API信号的信息rtwdemo_capi

/ *块输出信号信息* /静态const rtwcapi_signals rtblocksignals [] = {/ * addrmapindex,sysnum,blockpath,* signalname,portnumber,datatypeindInd,dimindex,fxpindex,stimeindex * / {0,0,“RTWDEMO_CAPI / GAIN1”,“top_sig1“,0,0,0,0,0},{1,0,”RTWDEMO_CAPI / LU2D“,”SIG2_EG“,0,0,1,0,0},{0,0,(null),(null),0,0,0,0,0}};

请注意

为了更好地理解代码,请阅读文件中的注释。例如,请注意前面代码中从第三行开始的注释。这个注释列出了rtwCAPI_Signals结构,按顺序。这告诉您每个成员的分配值出于信号的顺序。在这个例子中,评论告诉你signalName.是该结构的第四个成员。以下行描述了第一条信号:

{0,0,“RTWDEMO_CAPI / GAIN1”,“TOP_SIG1”,0,0,0,0,0},

从这几行可以推断出第一个信号的名称是top_sig1

除最后一个数组元素之外,每个数组元素描述了块信号的一个输出端口。最终数组元素是一个Sentinel,所有元素都设置为空值。例如,检查第二个信号,由以下代码描述:

{1, 0,“rtwdemo_capi / lu2d”、“sig2_eg”,0,0,1,0,0},

这个信号,sig2_eg,是块的第一个端口的输出信号RTWDEMO_CAPI / LU2D.(此端口是第一个端口,因为基于零的索引portNumber在第二行中显示为值0.)

此信号的地址由addrMapIndex,在本例中,第一行显示为1.的索引RTDATAAddrmap.数组,稍后在rtwdemo_capi_capi.c

/*静态声明数据地址*/static void*rtDataAddrMap[]={&rtwdemo_capi_B.top_sig1,/*0:Signal*/&sig2_eg[0],/*1:Signal*/&rtwdemo_capi_DWork.top_state,/*2:Discrete state*/&rtP_Ki,/*3:Model参数*/&rtP_Kp,/*4:Model参数*/&rtP_p1[0],/*5:Model参数*/&rtP_p2[0],/*6:模型参数*/&rtP_p3[0],/*7:模型参数*/};

索引1指向第二个元素RTDATAAddrmap.数组中。从RTDATAAddrmap.阵列,您可以推断出该信号的地址是&sig2_eg [0]

此级别的间接支持同一模型的多个代码实例。金宝app对于多个实例,信号信息保持不变,除了地址。在本例中,模型是单个实例。因此,RTDATAAddrmap.静态声明。如果您选择生成可重用代码,则会生成一个初始化函数,该函数会动态地初始化每个实例的地址。有关生成可重用代码的详细信息,请参见配置模型入口点函数的C代码生成并看看配置代码重用支持金宝app(嵌入式编码器)

dataTypeIndex的索引RTDATATYPEMAP.数组,稍后在rtwdemo_capi_capi.c,表示信号的数据类型:

/* DataTypeMap - use dataTypeMapIndex to access this structure */ static const rtwCAPI_DataTypeMap rtDataTypeMap[] = {/* cName, mwName, numElements, elemMapIndex, dataSize, slDataId, * * isComplex, isPointer */ {"double", "real_T", 0,0, sizeof(real_T), SS_DOUBLE, 0,0}};

因为索引是0sig2_eg,索引指向数组中的第一个structure元素。可以推断信号的数据类型为.的价值isComplex.0,表示信号不复杂。而不是直接提供数据类型信息rtwCAPI_Signals结构,引入了间接层次。间接允许共享相同数据类型的多个信号指向一个映射结构,为每个信号节省内存。

dimindex.(尺寸指数)为索引提供进入的索引RTD尺寸图数组,稍后在rtwdemo_capi_capi.c,表示信号的尺寸。因为这个索引是1sig2_eg的索引指向第二个元素RTD尺寸图数组:

*/ static const rtwCAPI_DimensionMap rtDimensionMap[] = {/* dataOrientation, dimArrayIndex, numDims, vardimsIndex */ {rtwCAPI_SCALAR, 0,2,0}, {rtwCAPI_VECTOR, 2,2,0},…};

从这个结构中,可以推断出这是一个维度为的非标量信号2.的dimArrayIndex值2提供了到的索引RtdimensionArray.,后来在rtwdemo_capi_capi.c

/ *尺寸阵列 - 使用DimArrayIndex访问此阵列* /静态Const UInt_T RTDimensionArray [] = {1,/ * 0 * / 1,/ * 1 * / 2,/ * 2 * / ...};

fxpIndex(定点索引)提供索引到rtFixPtMap数组,稍后在rtwdemo_capi_capi.c,表示有关信号的定点信息。您的代码可以使用这个方程,使用缩放信息来计算信号的真实值V =平方+ B,其中V是“真实世界”(即,基-10)值,S是用户指定的斜率,Q是“量化定点值”或“存储整数”,B是用户指定的偏差。有关详细信息,请参阅缩放比例(定点设计师)

因为这个索引是0sig2_eg,信号没有定点信息。定点映射索引为零意味着信号没有定点信息。

sTimeIndex(采样时间索引)提供rtSampleTimeMap数组,稍后在rtwdemo_capi_capi.c,表示有关信号的任务信息。如果您记录多速率信号或有条件执行的信号,则采样信息可能是有用的。

请注意

模型_capi.c(或.cpp)包括RTW_CAPI.H..的源文件RTBLOCKSIGNALS.阵列也必须包括RTW_CAPI.H.

C API州

美国结构捕获状态信息,包括状态名称、地址、块路径、类型(连续或离散)、数据类型信息、维度信息、定点信息和采样时间信息。

下面是中的代码部分rtwdemo_capi_capi.c这提供了关于顶级模型的C API状态信息rtwdemo_capi

/ *块状态信息* /静态常量rtwCAPI_States rtBlockStates [] = { /* addrMapIndex、contStateStartIndex blockPath、* stateName pathAlias, dWorkIndex, dataTypeIndex, dimIndex, * fixPtIdx sTimeIndex,毕竟* /{2 1、“rtwdemo_capi / Delay1”、“top_state”,“”,0,0,0,0,0,0},{0 1(空),(零),(零),0,0,0,0,0,0}};

每个数组元素(最后一个除外)都描述模型中的状态。最后一个数组元素是sentinel,所有元素都设置为空值。在本例中,顶级模型的C API代码显示一种状态:

{2 1、“rtwdemo_capi / Delay1”、“top_state”,“”,0,0,0,0,0,0},

这个国家命名top_state.,为该块定义rtwdemo_capi / Delay1.的价值毕竟为零,表明状态是离散而不是连续的。其他字段对应于中描述的类似名称的信号等效C API信号,如下所示:

  • 信号的地址由addrMapIndex,在这个例子中,是2.这是一个索引RTDATAAddrmap.数组,稍后在rtwdemo_capi_capi.c. 因为索引是以零为基础的,2对应于中的第三个元素RTDATAAddrmap.,即&rtwdemo_capi_DWork.top_state

  • dataTypeIndex的索引RTDATATYPEMAP.数组,稍后在rtwdemo_capi_capi.c,表示参数的数据类型。值0对应于一个双精度非复杂参数。

  • dimindex.(尺寸指数)为索引提供进入的索引RTD尺寸图数组,稍后在rtwdemo_capi_capi.c.值0对应于第一个条目,即{rtwCAPI_SCALAR, 0, 2, 0}

  • fixPtIndex(定点索引)提供索引到rtFixPtMap数组,稍后在rtwdemo_capi_capi.c,表示参数的定点信息。与相应的信号属性一样,定点映射索引为零意味着参数不具有定点信息。

C API根级输入和输出

rtwCAPI_SignalsStructure捕获根级输入/输出信息,包括输入/输出名称、地址、块路径、端口号、数据类型信息、维度信息、定点信息和采样时间信息。(该结构也用于块输出信号,如前所述C API信号.)

下面是中的代码部分rtwdemo_capi_capi.c提供C API根级输入/输出的信息rtwdemo_capi

/ * root输入信息* / static const rtwcapi_signals rtrotinputs [] = {/ * addrmapindex,sysnum,blockpath,* signalname,portnumber,dataTypeIndex,dimindex,fxpindex,stimeindex * / {3,0,“RTWDEMO_CAPI / IN1”,“”,1,0,0,0,0},{4,0,“RTWDEMO_CAPI / IN2”,“,2,0,0,0,0},{5,0,”RTWDEMO_CAPI / IN3“,”“,3,0,0,0,0},{6,0,“RTWDEMO_CAPI / IN4”,“,4,0,0,0,0,0},{0,0,(null),(null),0,0,0,0,0}};/ *根输出信息* / static const rtwcapi_signals rtrotointputs [] = {/ * addrmapindex,sysnum,blockpath,* signalname,portnumber,dataTypeIndind,dimindex,fxpindex,stimeindex * / {7,0,“rtwdemo_capi / out1”,“”,1,0,0,0,0},{8,0,“RTWDEMO_CAPI / OUT2”,“”,2,0,0,0,0},{9,0,“RTWDEMO_CAPI / OUT3”,“”。,3, 0, 0, 0, 0 }, { 10, 0, "rtwdemo_capi/Out4", "", 4, 0, 0, 0, 0 }, { 11, 0, "rtwdemo_capi/Out5", "sig2_eg", 5, 0, 1, 0, 0 }, { 12, 0, "rtwdemo_capi/Out6", "", 6, 0, 1, 0, 0 }, { 0, 0, (NULL), (NULL), 0, 0, 0, 0, 0 } };

中值的解释信息rtwCAPI_Signals结构,请参见上一节C API信号

C API参数

rtwCAPI_BlockParametersrtwCAPI_ModelParameters结构捕获参数信息,包括参数名称,块路径(用于块参数),地址,数据类型信息,尺寸信息和定点信息。

rtmodelparameters.数组包含工作区变量的条目,这些变量被引用为可调的Simulink块参数或机器范围的statflow数据。金宝app例如,可调参数包括金宝app仿真软件。参数使用非汽车.的金宝app仿真软件编码器软件只分配它的元素空值或在没有此类数据时为零值。

为模型配置参数选择的设置默认参数的行为确定如何将信息生成到rtBlockParameters排列模型_capi.c(或.cpp).

  • 如果你设置默认参数的行为调节,rtBlockParameters数组包含模型中每个块的每个可修改参数的条目。但是,如果使用MATLAB变量或可调参数来指定块参数,则不会出现块参数rtBlockParameters.相反,变量或可调参数出现在rtmodelparameters.

  • 如果你设置默认参数的行为内联,rtBlockParameters数组是空的。的金宝app仿真软件编码器软件只分配它的元素空值或零值。

每个数组的最后一个成员是一个Sentinel,所有元素都设置为空值。

这是rtBlockParameters中默认生成的数组rtwdemo_capi_capi.c

/* Individual block tuning is not valid when inline parameters is * * selected.生成空映射以提供与内联参数无关的一致* *界面。* / static const rtwcapi_blockparameterstrtbockparameters [] {/ * addrmapindex,blockpath,* paramname,dimindex,fixptidx * / {0,(null),0,0,0}};

在此示例中,仅生成最终的Sentinel数组元素,具有结构的所有成员rtwCAPI_BlockParameters设置为空值和零值。这是因为默认参数的行为被设置为内联默认情况下rtwdemo_capi模型的例子。如果你设置默认参数的行为调节,块参数在rtwCAPI_BlockParameters结构体。但是,Matlab变量和可调参数出现在rtwCAPI_ModelParameters结构体。

这是rtmodelparameters.中默认生成的数组rtwdemo_capi_capi.c

/ *可调变量参数* /静态conscr rtwcapi_model parameterstrmodel parameters [] {/ * addrmapindex,varname,dataTypeindex,dimindex,fixtindex * / {2,target_string(“ki”),0,0,0},{3,target_string(“kp”),0,0,0},{4,target_string(“p1”),0,2,0},{5,target_string(“p2”),0,3,0},{6,target_string(“p3”),0,4,0},{0,(null),0,0,0,0}};

在这个例子中rtmodelparameters.数组包含每个变量的条目,这些变量被引用为可调的Simulink块参数。金宝app

例如,varName(变量名)的第四个参数为P2..其他字段对应于中描述的类似名称的信号等效C API信号,如下所示:

  • 第四个参数的地址为addrMapIndex,在这个例子中,是5.这是一个索引RTDATAAddrmap.数组,稍后在rtwdemo_capi_capi.c. 因为索引是以零为基础的,5对应于中的第六个元素RTDATAAddrmap.,即rtP_p2

  • dataTypeIndex的索引RTDATATYPEMAP.数组,稍后在rtwdemo_capi_capi.c,表示参数的数据类型。值0对应于一个双精度非复杂参数。

  • dimindex.(尺寸指数)为索引提供进入的索引RTD尺寸图数组,稍后在rtwdemo_capi_capi.c.值3对应于第四个条目,即{rtwCAPI_MATRIX_COL_MAJOR,6,2,0}

  • fixPtIndex(定点索引)提供索引到rtFixPtMap数组,稍后在rtwdemo_capi_capi.c,表示参数的定点信息。与相应的信号属性一样,定点映射索引为零意味着参数不具有定点信息。

有关生成代码中可调参数存储的更多信息,请参阅生成的代码如何存储内部信号,状态和参数数据

将C API数据结构映射到rtModel

实时模型数据结构封装了完整描述模型的模型数据和相关信息。当选择C API特性并生成代码时,金宝app仿真软件编码器代码生成器将另一个成员添加到生成的实时模型数据结构中模型.h

/* * DataMapInfo: *下面的子结构包含关于在模型的C API生成的*结构的信息。*/ struct {rtwCAPI_ModelMappingInfo mmi;} DataMapInfo;

这个成员定义mmi(用于模型映射信息)struct rtwcapi_modelmappinginfo..这个结构位于matlabroot./ RTW / C / SRC /rtw_modelmap.h.的mmi子结构定义了模型和C API文件之间的接口。更具体地说,是mmi将实时模型数据结构映射到中的结构模型_capi.c(或.cpp).

初始化的值mmi成员到阵列完成了映射,如图所示将模型映射到C API结构数组. 每个成员都指向生成的C API文件中的一个结构数组。例如,服务器的地址RTBLOCKSIGNALS.对象的数组的第一个成员mmi子结构中模型.c(或.cpp)中使用以下代码rtw_modelmap.h文件:

/ *信号* / struct {rtwcapi_signals const *信号;/ *信号阵列* / uint_t numsignals;/ * num信号* / rtwcapi_signals const * rootinputs;/ *根输入阵列* / UINT_T NUMROOTINPUTS;/ * num根输入* / rtwcapi_signals const * rootoctputs;/ *根输出阵列* / uint_t numrootoutputs; / * num根输出* /}信号;

模型初始化功能模型.c(或.cpp)通过调用C API的initialize函数来执行初始化。例如,以下代码是在模型初始化函数(例如model)中生成的rtwdemo_capi

/*初始化包含ModelMap的DataMapInfo子结构*/ rtwdemo_capi_InitializeDataMapInfo(rtwdemo_capi_M);

将模型映射到C API结构数组

请注意

此图按数组结构出现的顺序列出了数组rtw_modelmap.h,这与它们生成的顺序略有不同模型_capi.c

生成C API数据定义文件,用于与目标系统交换数据

这个示例展示了如何使用基于目标的C API与生成的代码进行接口,这些代码表示信号、状态、参数和根级别I/O。

打开示例模型

打开示例模型rtwdemo_capi

open_system ('RTWDEMO_CAPI');

C API可用于在生成的代码中与应用程序数据进行交互,而无需停止程序执行或重新编译生成的代码。要使用C API接口,为顶部模型及其引用的模型:

1.在开发计算机和目标计算机之间建立一个客户机/服务器协议(例如TCP/IP或双端口内存连接)。

2.选择至少一个C API型号配置参数:信号参数, 和根级I / O

3.用可寻址的存储类配置要使用C API访问的数据元素。

顶部模型和引用模型的C API配置设置必须匹配。

代码生成器将C API接口放在文件中模型_capi.c.根据您的配置设置,数据可以表示配置了可寻址存储类的信号、状态、参数和根级I/O。该文件包括提供数据属性接口的结构。

C API的限制

C API特性有以下限制。

  • 的C API不支持以下值金宝appCodeFormatTLC变量:

    • S函数

    • Accelerator_S-Function(加速模拟)

  • 对于基于ERET的目标,C API要求启用对浮点代码的支持。金宝app

  • 不支持本地块输出信号。金宝app

  • 不支持本地校正帧参数。金宝app

  • 不支持以下自定义存储类对象:金宝app

    • 没有包的对象csc_registration文件

    • 分组自定义存储类

    • 使用宏定义的对象

    • 设置对象

    • 丝锥对象

  • 使用C API时禁用自定义数据放置。界面查找全局数据声明模型.h模型_private.h..通过自定义数据放置放置在任何其他文件中的声明将导致代码无法编译。

请注意

只有当您使用ERT系统目标文件并清除模型配置参数时,自定义存储类对象才能在代码生成中工作忽略自定义存储类

相关话题