主要内容

使用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转义序列替换这些字符。例如,代码生成器将日语全宽片假名字母ア替换为转义序列& # x30A2;.有关更多信息,请参见国际化和代码生成

生成C API文件

为你的模型生成C API文件:

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

  2. 为模型生成代码。

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

选择C API与配置参数对话框

  1. 打开模型,并打开Configuration Parameters对话框。

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

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

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

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

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

从命令行中选择C API

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

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

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

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

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

选择为:parameters生成C API,输入:

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

清除为:parameters生成C API,输入:

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

选择为:states生成C API,输入:

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

清除为:states生成C API,输入:

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

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

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

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

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,该结构包含实际的数据类型值。下图更详细地展示了该方案。

图中显示了三个信号。signal1而且signal2共享相同的数据类型,.接口没有在每个信号数据结构中指定这个数据类型值,而是在结构中只提供一个索引值0。“替身”的0项描述rtDataTypeMap数组,它被两个信号引用。此外,属性值可以在信号、状态、根级输入/输出和参数之间共享,因此状态、根级输入/输出和参数也可以引用进入rtDataTypeMap数组中。这种信息重用减少了生成接口的内存大小。

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

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

  • rtBlockSignals是一个结构数组,其中包含关于模型中全局块输出信号的信息。数组中的每个元素都有类型struct rtwCAPI_Signals.该结构的成员提供信号名称、块路径、块端口号、地址以及数据类型、维数、定点和采样时间结构数组的索引。

  • rtBlockParameters是一个结构数组,按块名和参数名包含关于模型中可调块参数的信息。数组中的每个元素都有类型struct rtwCAPI_BlockParameters.此结构的成员提供参数名称、块路径、地址以及数据类型、维数和定点结构数组的索引。

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

  • rtRootInputs包含关于模型中根级输入的信息的结构数组。数组中的每个元素都有类型struct rtwCAPI_Signals.该结构的成员提供根级输入名称、块路径、块端口号、地址和数据类型、维、定点和采样时间结构数组的索引。

  • rtRootOutputs包含关于模型中根级输出的信息的结构数组。数组中的每个元素都有类型struct rtwCAPI_Signals.该结构的成员提供根级输出名称、块路径、块端口号、地址以及数据类型、维度、定点和采样时间结构数组的索引。

  • rtModelParameters是一个结构数组,包含关于工作场所变量的信息,一个或多个块或状态流®模型中的图表作为块参数引用。数组中的每个元素都是数据类型rtwCAPI_ModelParameters.此结构的成员提供变量名、地址和数据类型、维数和定点结构数组的索引。

  • rtDataAddrMap中出现的信号、状态、根级输入/输出和参数的基址数组rtBlockSignalsrtBlockParametersrtBlockStates,rtModelParameters数组。的每个元素rtDataAddrMap数组的指针空白(void *)

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

  • rtDimensionMap是一个结构数组,其中包含关于模型中各个数据维的信息。这个数组的每个元素都有类型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,选择型号配置参数生成C API用于:根级I/O

    该参数的设置必须与顶模型和引用模型相匹配。如果您修改了参数设置,请将顶部模型和引用模型保存到相同的可写工作文件夹中。

  3. 为模型生成代码。

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

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

  • top_sig1,为顶模型中Gain1块输出处的测试点

  • sig2_eg,它出现在顶部模型中,并在基本工作空间中定义为金宝app仿真软件。信号具有存储类的对象。ExportedGlobal

  • bot_sig1,它出现在引用的模型中rtwdemo_capi_bot定义为a金宝app仿真软件。信号具有存储类的对象。模型的默认

该模型还有两个独立的状态,它们将出现在C API生成的代码中:

  • top_state,它是为顶层模型中的Delay1块定义的

  • bot_state,它是为引用模型中的Discrete Filter块定义的

模型具有根级输入/输出,如果您选择模型配置参数,这些输入/输出将出现在C API生成的代码中生成C API用于:根级I/O

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

  • 六个根级输出,着干活通过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

/*块输出信号信息*/ static const rtwCAPI_Signals rtBlockSignals[] = {/* addrMapIndex, sysNum, blockPath, * signalName, portNumber, dataTypeIndex, dimIndex, fxpIndex, sTimeIndex */ {0,0, "rtwdemo_capi/Gain1", "top_sig1", 0,0,0,0}, {1,0, "rtwdemo_capi/lu2d", "sig2_eg", 0,0,1,0,0}, {0,0, (NULL), (NULL), 0,0,0,0}};

请注意

为了更好地理解代码,请阅读文件中的注释。例如,请注意前面代码中从第三行开始的注释。属性的成员rtwCAPI_Signals结构,有序。这将告诉您信号中每个成员的赋值出现的顺序。在本例中,注释告诉您这一点signalName是结构的第四个元素。下面几行描述了第一个信号:

{0, 0,“rtwdemo_capi / Gain1”,“top_sig1”,0,0,0,0,0},

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

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

{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. []] = {&rtwdemo_capi_B.]top_sig1, /* 0:信号*/ &sig2_eg[0], /* 1:信号*/ &rtwdemo_capi_DWork。top_state,/* 2: Discrete State */ &rtP_Ki, /* 3: Model Parameter */ &rtP_Kp, /* 4: Model Parameter */ &rtP_p1[0], /* 5: Model Parameter */ &rtP_p2[0], /* 6: Model Parameter */ &rtP_p3[0], /* 7: Model Parameter */ };

的指数1对象中的第二个元素rtDataAddrMap数组中。从rtDataAddrMap数组,就可以推断出这个信号的地址是&sig2_eg [0]

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

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

/*数据类型映射-使用dataTypeMapIndex访问这个结构*/ static const rtwCAPI_DataTypeMap rtDataTypeMap[] = {/* cName, mwName, numElements, elemMapIndex, dataSize, slDataId, * * isComplex, isPointer */ {"double", "real_T", 0, sizeof(real_T), SS_DOUBLE, 0, 0}};

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

dimIndex(维度索引)提供到rtDimensionMap数组,在rtwdemo_capi_capi.c,表示信号的尺寸。因为这个指标是1sig2_eg的第二个元素rtDimensionMap数组:

/* DimensionMap -使用dimensionMapIndex访问结构的元素*/ static const rtwCAPI_DimensionMap rtDimensionMap[] = {/* dataOrientation, dimArrayIndex, numDims, vardimsIndex */ {rtwCAPI_SCALAR, 0,2,0}, {rtwCAPI_VECTOR, 2,2,0},…};

从这个结构,你可以推断出这是一个维数为的非标量信号2.的dimArrayIndexValue, 2,提供到的索引rtDimensionArray,后来在rtwdemo_capi_capi.c

*/ static 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状态

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

下面是rtwdemo_capi_capi.c中顶层模型的C API状态信息rtwdemo_capi

/*块状态信息*/ static const rtwCAPI_States rtBlockStates[] = {/* addrMapIndex, contStateStartIndex, blockPath, * stateName, pathAlias, dWorkIndex, dataTypeIndex, dimIndex, * fixPtIdx, sTimeIndex, isContinuous */ {2, -1, "rtwdemo_capi/Delay1", "top_state", "" ", 0,0,0,0}, {0, -1, (NULL), (NULL), (NULL), 0,0,0,0,0}};

除最后一个元素外,每个数组元素都描述了模型中的一个状态。最后一个数组元素是一个哨兵,所有元素都设置为空值。在这个例子中,顶部模型的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.因为索引是以0为基础的,2中的第三个元素rtDataAddrMap,即&rtwdemo_capi_DWork.top_state

  • dataTypeIndex类的索引rtDataTypeMap数组,在rtwdemo_capi_capi.c,表示参数的数据类型。值0对应一个双参数,不复杂参数。

  • dimIndex(维度索引)提供到rtDimensionMap数组,在rtwdemo_capi_capi.c.值0对应于第一个条目,即{rtwCAPI_SCALAR, 0,2,0}

  • fixPtIndex(定点索引)提供了进入的索引rtFixPtMap数组,在rtwdemo_capi_capi.c,表示参数的定点信息。与对应的信号属性一样,零的定点映射索引意味着参数没有定点信息。

C API的根级输入和输出

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

下面是rtwdemo_capi_capi.c为顶层模型提供C API根级输入/输出的信息rtwdemo_capi

* / / *根输入信息静态常量rtwCAPI_Signals rtRootInputs [] = { /* addrMapIndex、sysNum blockPath、* signalName portNumber, dataTypeIndex, dimIndex, fxpIndex, sTimeIndex * /{3 0“rtwdemo_capi /三机一体”,“”,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,0,0,0,0}};* / / *根输出信息静态常量rtwCAPI_Signals rtRootOutputs [] = { /* addrMapIndex、sysNum blockPath、* signalName portNumber, dataTypeIndex, dimIndex, fxpIndex, sTimeIndex * /{7 0“rtwdemo_capi /着干活”,“”,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}};

请注意

在生成c++代码时,代码生成器不会提供C API根级输入/输出的信息。

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

C API参数

rtwCAPI_BlockParameters而且rtwCAPI_ModelParameters结构捕获参数信息,包括参数名称、块路径(用于块参数)、地址、数据类型信息、维度信息和定点信息。

rtModelParameters数组包含工作区变量的条目,这些变量被引用为可调的Simulink块参数或机器范围的状态流数据。金宝app例如,可调参数包括金宝app仿真软件。参数对象的存储类汽车.的金宝app仿真软件编码器软件只分配它的元素如果没有这样的数据,则为零值。

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

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

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

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

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

/*当内联参数被* *选中时,单独的块调优无效。生成一个空映射以提供独立于内联参数的一致* *接口。* */ static const rtwCAPI_BlockParameters rtBlockParameters[] = {/* addrMapIndex, blockPath, * paramName, dataTypeIndex, dimIndex, fixPtIdx */ {0, (NULL), (NULL), 0,0,0}};

在本例中,只生成最后的哨兵数组元素,其中包含结构的所有成员rtwCAPI_BlockParameters设置为零值。这是因为默认参数行为设置为内联默认情况下,rtwdemo_capi模型的例子。如果你设置默认参数行为可调时,块参数在rtwCAPI_BlockParameters结构。但是,MATLAB中出现了变量和可调参数rtwCAPI_ModelParameters结构。

这是rtModelParameters中默认生成的rtwdemo_capi_capi.c

/*可调变量参数*/ static const rtwCAPI_ModelParameters rtModelParameters[] = {/* addrMapIndex, varName, dataTypeIndex, dimIndex, fixPtIndex */ {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}};

在本例中,rtModelParameters数组包含作为可调Simulink块参数引用的每个变量的条目。金宝app

例如,varName(变量名)的第四个参数为p2.其他字段对应于中描述的类似命名的信号等价物C API信号,详情如下:

  • 第四个参数的地址由addrMapIndex,在本例中为5.这是进入的索引rtDataAddrMap数组,在rtwdemo_capi_capi.c.因为索引是以0为基础的,5中的第6个元素rtDataAddrMap,即rtP_p2

  • dataTypeIndex类的索引rtDataTypeMap数组,在rtwdemo_capi_capi.c,表示参数的数据类型。值0对应一个双参数,不复杂参数。

  • dimIndex(维度索引)提供到rtDimensionMap数组,在rtwdemo_capi_capi.c.值3对应第4项,即{rtwCAPI_MATRIX_COL_MAJOR, 6,2,0}

  • fixPtIndex(定点索引)提供了进入的索引rtFixPtMap数组,在rtwdemo_capi_capi.c,表示参数的定点信息。与对应的信号属性一样,零的定点映射索引意味着参数没有定点信息。

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

将C API数据结构映射到rtModel

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

下面的子结构包含了在模型的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文件:

/* signals */ struct {rtwCAPI_Signals const *信号;/*信号数组*/ uint_T numSignals;/* Num Signals */ rtwCAPI_Signals const *rootInputs;/*根输入数组*/ uint_T numRootInputs;/*根输入*/ rtwCAPI_Signals const *rootOutputs;/*根输出数组*/ uint_T numRootOutputs;

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

/*初始化DataMapInfo子结构,包含ModelMap */ 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特性有以下限制。

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

    • 功能

    • Accelerator_S-Function(用于加速模拟)

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

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

  • 不支持本地状态流参数。金宝app

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

    • 没有包的对象csc_registration文件

    • 分组自定义存储类

    • 使用宏定义的对象

    • 设置对象

    • FileScope对象

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

请注意

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

相关的话题