主要内容

金宝app与C S-Functions引擎交互

您可以检查模型的方式金宝app®引擎与S-functions来自两个方面:

  • 过程的角度,即,点模拟引擎调用功能。

  • 数据透视,即,引擎和功能如何交换信息在一个模拟世界中。

流程视图

以下数据显示的顺序模型引擎调用回调方法的功能。金宝app实心矩形显示回调,总是发生在模型初始化或在每一个时间步。虚线矩形显示回调期间可能发生的初始化和/或在部分或全部时间步长仿真循环。看到每个回调方法的文档来确定具体的情形下,引擎调用回调。

请注意

流程视图图代表执行S-functions包含连续和离散状态,使零交点检测和驻留在一个模型,利用变步解算器。在图中省略某些步骤不同求解方法。为更好的理解如何仿真软件引擎执行特定的功能,使用仿真软件调试器运行包含s函数金宝app的模型。

在以下模型初始化循环,为即将到来的模拟仿真软件引擎配置功能。金宝app发动机总是让所需的要求mdlInitializeSizesmdlInitializeSampleTime设置功能的基本属性,包括输入和输出端口,功能对话框参数、工作载体,样品时间,等等。

引擎调用其他方法,根据需要,完成初始化功能。例如,如果s函数向量,使用工作引擎调用mdlSetWorkWidths。同样,如果mdlInitializeSizes方法延迟设置输入和输出端口属性,引擎调用任何必要的方法来完成端口的初始化,如mdlSetInputPortWidth在信号传播。的mdlStart方法调用的mdlCheckParametersmdlProcessParameters如果函数使用对话框参数的方法。

请注意

mdlInitializeSizes回调方法也当你编译的s函数的名称输入功能块参数对话框。

初始化后,仿真软件引擎执行以下模拟循环。金宝app如果模拟循环中断,手动或当一个错误发生时,发动机直接跳跃mdlTerminate方法。如果模拟手动停止,引擎调用之前完成当前时间的第一步mdlTerminate

如果您的模型包含多个功能块在给定水平的模型层次结构,每个功能的引擎调用特定方法在继续之前下一个方法。例如,所有的引擎调用mdlInitializeSizes方法在调用任何mdlInitializeSampleTimes方法。发动机使用块顺序来确定订单执行S-functions。了解更多关于引擎决定了如何阻止执行顺序,明白了控制和显示执行顺序

为代码生成调用结构

如果你使用金宝app仿真软件编码器™产品包含S-functions生成代码模型,仿真软件引擎不执行上述所有的调用序列。金宝app初始化收益如前所述,直到发动机到达mdlStart方法。引擎然后调用函数方法如下图所示,在那里mdlRTW方法是独一无二的金宝app仿真软件编码器产品。

如果s函数驻留在一个有条件地执行子系统,它生成的代码可以交错调用mdlInitializeConditionsmdlStart。考虑下面的仿真软件模型。金宝app

该模型包含两个nonvirtual子系统,有条件地执行子系统启用复位和名为原子的原子子系统。每个子系统都包含一个功能块调用功能dsfunc.c,这与两国模型离散状态空间系统。使子系统重置重置状态值子系统启用时,子系统时,输出值是禁用的。

使用通用实时(GRT)目标,model-wide生成的代码开始函数调用的开始函数在调用model-wide之前的两个子系统MdlInitialize功能,如以下代码所示:

空白MdlStart (void){/ *剪* / / *开始启用子系统:“< Root > /重置”* / sfcndemo_enablesub_Reset_Start ();/ *开始年底子系统:“< Root > /重置”* / / *开始原子子系统:“< Root > /原子”* / sfcndemo_enablesub_Atomic_Start ();/ *开始年底子系统:“< Root > /原子”* / MdlInitialize ();

开始为使子系统调用子系统的功能InitializeConditions功能:

空白sfcndemo_enablesub_Reset_Start (void) {sfcndemo_enablesub_Reset_Init ();/ *剪* /}

MdlInitialize函数,在MdlStart,包含一个调用InitializeConditions原子子系统的功能:

空白MdlInitialize (void) {/ * InitializeConditions原子子系统:“< Root > /原子”* / sfcndemo_enablesub_Atomic_Init ();}

因此,model-wide开始交叉调用函数开始InitializeConditions两个子系统的功能和S-functions中所包含的信息。

更多的信息金宝app仿真软件编码器产品和它如何与S-functions,明白了S-Functions和代码生成(金宝app仿真软件编码器)

交替为外部调用结构模式

当你运行一个仿真软件模型在外部模式,功能例程的金宝app调用序列变化如下图所示。

引擎调用mdlRTW当它再次进入外部模式,每次参数变化或当你点击更新模型建模选项卡。

请注意

看到外部模式的沟通(金宝app仿真软件编码器)在外部模式运行的要求。

数据视图

功能块的输入和输出信号、参数和内部状态,再加上其他一般工作区域。在一般情况下,块输入和输出写入,读取,一块I / O向量。输入可以来自

  • 通过根尺寸块外部输入

  • 如果输入信号无关的或接地

块输出也可以通过根外港街区外部输出。除了输入和输出信号,S-functions

  • 持续的状态

  • 离散状态

  • 其他工作领域,比如真实、整数或向量指针工作

你可以通过传递参数,参数化功能块使用功能块参数对话框。

下面的图显示了这些不同类型的数据之间的映射。

一个函数的mdlInitializeSizes程序集的各种信号和向量的大小。在模拟循环s函数方法称为可以确定信号的大小和价值。

一个函数方法可以访问输入信号在两个方面:

  • 通过指针

  • 使用连续的输入

使用指针访问信号

在模拟循环期间,访问输入信号使用

InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(年代,portIndex)

这返回一个指针数组输入端口与索引portIndex,在那里portIndex从0开始。有一个数组的指针对每个输入端口。访问一个元素的数组必须使用

* uPtrs(元素)

下图描述了如何访问输入和两个输入信号的功能。

如前图所示,输入数组指针可以指向非邻接的地方在内存中。

你可以使用这段代码检索输出信号。

real_T * y = ssGetOutputPortSignal(年代,outputPortIndex);

访问连续的输入信号

一个函数的mdlInitializeSizes方法可以指定元素的输入信号必须占领相邻地区的内存,使用ssSetInputPortRequiredContiguous。如果输入是连续的,其他可以使用的方法ssGetInputPortSignal访问输入。

个人访问输入信号端口

本节描述如何访问特定端口的所有输入信号和输出端口写。前面的图显示,输入数组的指针可以指向非连续块I / O向量中的条目。一个特定端口的输出信号形成一个连续的向量。因此,访问输入元素的正确方法和把它们输出元素(假设输入和输出端口有同等宽度)是使用这段代码。

int_T元素;int_T portWidth = ssGetInputPortWidth(年代,inputPortIndex);InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(年代,inputPortIndex);real_T * y = ssGetOutputPortSignal(年代,outputPortIdx);(元素= 0;元素< portWidth;元素+ +){y(元素)= * uPtrs(元素);}

一个常见的错误是试图访问输入信号通过指针算术。例如,如果你的地方

real_T * u = * uPtrs;/ * * /不正确

在初始化的uPtrs和替换上述循环的内在部分

* y + + = * u + +;/ * * /不正确

代码编译,但墨西哥人文件可能崩溃模型软件。金宝app这是因为它可以访问无效的内存(这取决于你如何建立你的模型)。当访问输入信号不正确,车祸发生在信号输入功能块不是连续的。非连续信号数据时发生信号通过虚拟连接阻塞如Mux或选择器。

正确验证您的s函数访问广泛的输入信号,通过复制信号每个输入端口的功能。为此,创建一个Mux块输入端口的数量等于期望信号的宽度输入功能。然后,驱动源连接到每一个功能的输入端口,如下图所示。最后,运行您的s函数使用该输入信号,以确认它不会崩溃,产生预期的结果。

另请参阅

|||

相关的话题