主要内容

处理速度的转换

率转换

两个周期采样率转换可以存在于一个模型:

  • 一块快开慢

  • 一块快开一块慢

以下部分关注模型与周期样本时间零点偏移。其他的考虑适用于多重速率的模型,包括异步任务。有关如何为异步多任务处理,生成代码异步支持金宝app

在多任务和pseudomultitasking系统中,不同的样本率会导致块以错误的顺序执行。为了防止可能的错误计算数据,你必须控制模型执行这些转换。当连接块快和慢,你或仿真软件金宝app®发动机必须添加它们之间的过渡块。Fast-to-slow转换下一个图中所示。

低到高转换下一个图中所示。

请注意

虽然速度过渡块提供的超集的功能单元延迟块(低到高转换)和零块(fast-to-slow转换),您应该使用速度过渡块代替这些块。

数据传输问题

率过渡块处理的数据完整性和决定论问题与数据传输块之间以不同的速率运行。

  • 数据完整性:当输入数据完整性的问题存在一块变化在该块的执行。数据完整性问题可能是由于抢占。

    考虑以下场景:

    • 快块供应慢块的输入。

    • 块读取一个输入值越慢V1从速度块,开始使用这个值计算。

    • 的计算是由另一个抢占执行速度块,计算一个新的输出值V2

    • 数据完整性问题现在出现了:当块继续执行得越慢,现在继续计算,用“新”的输入值V2

    这样的数据传输无保护的快到慢实时转换显示了一个不受保护的数据传输。

    在一个受保护的数据传输,输出V1快块直到慢块的结束执行。

  • 确定的不确定的数据传输:在确定的数据传输,数据传输的时间是完全可预测的,由样本率的块。

    的时机不确定的数据传输取决于数据的可用性,块的采样率和接收块开始执行的时间相对于驱动块。

您可以使用速度过渡块保护数据传输在您的应用程序,让他们确定的。这些特征在大多数应用程序被认为是可取的。然而,过渡块支持灵活的选项,让你妥协数据完整性和决定论的低延迟。金宝app下一节总结了这些选项。

数据传输的假设

在处理任务之间的数据传输时,代码生成器使得这些假设:

  • 数据之间的转换发生一个阅读任务和一个写作任务。

  • byte-sized变量是原子的读或写。

  • 当两个任务通过交互数据过渡,只有其中一个可以抢占其他。

  • 对于周期性任务,更快的任务的优先级高于速度较慢,任务;更快的任务就抢占速度较慢的任务。

  • 所有任务运行在一个处理器。时间切片是不允许的。

  • 流程不崩溃或重启(特别是当任务)之间的数据传输。

率过渡块选项

几个参数的过渡块相关使用代码生成的实时执行,我们将在下面进行讨论。一块完整的描述,请参阅率转换

率过渡块处理周期(快慢,慢到快)和异步转换。当之间插入两块不同的采样率,过渡块率自动配置它的输入和输出采样率转换的类型;你不需要指定一个过渡是否低到高或fast-to-slow(或由低到低优先级为异步任务)。

关键的决定你必须配置一个过渡块数据传输机制的选择率这两个利率之间使用。你的选择是由安全注意事项,内存的使用和性能。作为过渡块率参数对话框在接下来的图中显示,数据传输机制是由两种选择。

  • 数据传输期间确保数据完整性:当你选择该参数,数据之间传输速率保持其完整性(数据传输保护)。当你清楚这个参数,数据可能不会保持其完整性(数据传输不受保护)。默认情况下,参数数据传输期间确保数据完整性被选中。

  • 确保确定性数据传输(最大延迟):这个参数支持周期性任务和一个偏移量的零金宝app和快和慢率的倍数。当这个参数被选中,过渡块像一个零块(快到慢转换)或单位延迟块(缓慢快速转换)。过渡块率控制数据传输的时间在一个完全可预测的方法。当这个参数了,数据传输是不确定的。默认情况下,确保确定性数据传输(最大延迟)被选中的定期利率之间的转换一个偏移量为0;为异步转换,它不能被选中。

过渡块率提供了三种模式的操作对数据传输。的安全级别:

  • 保护/确定性(默认):这是最安全的方式。这种模式的缺点是,它介绍了确定性延迟的系统为例低到高周期过渡。在这种情况下,引入的延迟率过渡块是慢的一个样本期间的任务。fast-to-slow周期性速度转换的情况下,速度过渡块不引入额外的延迟。

  • 保护/不确定的:在这种模式下,低到高周期速率转换,数据完整性保护的双缓冲之间传输数据率。fast-to-slow周期速率转换,信号量使用国旗。率的块下游过渡块使用最新的可用的数据块驱动速度过渡块。最大延迟小于或等于一个样本的任务越快。

    这种模式的缺点是它的不确定的时间。这种模式的优点是它的低延迟。

  • 不受保护的/不确定的:这种模式不建议关键任务的应用程序。这种模式下的延迟保护/不确定的模式是一样的,但内存需求减少双缓冲和信号量是必需的。即速度过渡块并没有在这种模式下除了信号穿过;它的存在只是为了通知你速度过渡存在(和生成的代码会导致计算不正确的答案)。然而,选择这种模式产生最少的代码。

    请注意

    在无保护的模式(数据传输期间确保数据完整性被选中),过渡块只是允许速度过渡到存在于模型。

速度过渡块和持续时间

样品时间的输出端口速度过渡块只能离散或固定在较小的时间步长。这意味着当速度过渡块继承连续取样时间从目的地块,它将继承了样本时间固定在较小的时间步长。因此,输出函数的速度过渡块只运行在主要的时间步骤。如果目的地块样品时间是连续的,速度过渡块输出样本时间基准利率样本(如果解算器是固定的),或者zero-order-hold-continuous样本时间(如果解决变步)。

自动速度过渡

仿真软件金宝app引擎可以检测不匹配率转换在一个多任务模型更新图和自动插入率过渡块来处理它们。为此,选择模型配置参数自动处理数据传输速度过渡。默认情况下,这个参数是清除。当您选择该参数:

  • 金宝app仿真软件处理周期样本之间的转换时间和异步任务。

  • 金宝app动态仿真模块插入隐藏率过渡块框图。

  • 代码生成器生成的代码的速度过渡块自动插入。这段代码是相同的代码生成的速度手动插入的过渡块。

  • 自动插入率过渡块在周期性任务的保护模式和异步任务。你不能改变这一行为。对于周期性任务,自动插入率过渡块操作的决定论模型指定的配置参数确定性数据传输。默认设置是只要有可能之间的数据传输,使决定论定期抽样时间相关的整数倍数。有关更多信息,请参见确定性数据传输。要使用其他模式,必须插入率过渡块和手动设置他们的模式。

例如,在这个模型中,SineWave2样品时间为2,SineWave3样本时间3。

当您选择模型配置参数自动处理数据传输速度过渡,仿金宝app真软件插入率过渡块每个正弦波块和产品之间的块。插入的块有调和的参数值正弦波块样品。

如果输入端口和输出端口的数据样本率模型不是彼此的倍数,仿真软件插入率过渡块的采样率是最大公约数(GCD)的两个利率。金宝app如果没有其他的块模型包含这个新利率,在模拟过程中出现错误。在这种情况下,您必须手动插入率过渡块。

想象插入率过渡块

当您选择模型配置参数自动处理数据传输速度过渡,仿金宝app真软件插入率过渡块率不匹配的路径转换。这些块默认是隐藏的。想象插入的块,更新图。徽章标签出现在仿真软件的模型和显示插入率在编译阶段过渡块。金宝app举个例子,在这个模型中,三个速度过渡块之间插入两个正弦波块和多路复用器和集成器当模型编译。这些块ZOH和DbBuf徽章标签指示。

您可以显示或隐藏标记标签。打开调试选项卡。在诊断部分的信息覆盖/样品时间画廊选择或清除自动转换速度

配置隐藏率过渡阻塞,随处可见,右键单击面板标签,然后单击插入率过渡块

当你隐藏的速度过渡块可见:

  • 你可以看到速度过渡块插入的类型和模型中块的位置。

  • 你可以设置块参数初始条件

  • 你可以改变速率传输块参数设置。

验证更改您的模型通过更新你的图。

显示插入率过渡块与导出功能模型不兼容。

了解更多关于类型的过渡块,明白了率转换

了解更多关于利率的类型转换块,明白了率转换

周期性的采样率转换

这些部分描述所需的情况下,速度过渡块周期采样率转换。这些章节的讨论和时序图是基于假设速度过渡块中使用其默认(保护/确定性)模式。模型配置参数数据传输期间确保数据完整性确保确定性数据传输(最大延迟)被选中。这些设置用于自动插入率过渡块。

更快的在一个较慢的转换金宝app模型

在一个模型一块快开慢块直接引线,越快块的输出计算。在模拟间隔块慢不执行,模拟进展更快,因为有更少的块来执行。下一个图说明了这个情况。

实时金宝app仿真软件模拟不执行,这意味着它是不受实时约束。模拟等待,或者提前移动,任何任务都必须完成模拟流。实际的样本之间的时间间隔的时间步骤可以有所不同。

快到慢实时转换

在模型中更快的块驱动较慢的块,你必须弥补的事实,执行慢块可能跨越多个执行快块的时期。这意味着更快的输出块可以改变之前慢块已完成计算其输出。下一个图显示一个情况下,这个问题出现(T =样品时间)。注意,抢占低优先级任务的优先任务之前完成。

在上面的图中,越快块执行第二个时间慢块已完成执行。这可能会导致不可预知的结果,因为缓慢的输入数据的任务是改变。在这种情况下数据可能不会保持其完整性。

为了避免这种情况,仿真软件引擎必须持有1秒(更快)块的输出金宝app,直到2秒(慢)块执行完毕。要达到这个目的的方法是通过插入率之间的过渡块1秒和2第二块。慢的输入块不会改变其执行期间,维护数据的完整性。

假设速度过渡块中使用其默认(保护/确定性)模式。

过渡块执行速度较慢的块的采样率,但快块的优先级。

当你添加一个过渡块,块执行前2第二块(优先级高)和输出值保持不变,而2第二块执行(执行速度慢样本)。

慢的速度转换的金宝app模型

在一个较慢的的模型块驱动器速度块,仿真软件引擎再次计算的输出驱动块。金宝app在样本间隔只有块执行的速度越快,模拟进展更快。

下一个图显示了执行序列。

正如你所看到的从前面的数据,仿真软件引擎可以模拟模型与多个样本率在一个有效的方式。金宝app然而,仿真软件模拟并不金宝app实时操作。

慢速度实时转换

模型中较慢的块驱动速度块,生成的代码分配块优先级高于越快越慢。这意味着更快的执行块慢块之前,需要特别注意避免不正确的结果。

这个时间图说明了两个问题:

  • 执行慢的块分割块间隔超过一个更快。在这种情况下,更快的任务执行前一次慢任务执行完成。这意味着更快的任务的输入可以有不正确的值的一些时间。

  • 越快块执行之前慢块(这是逆向仿真软件模拟运作方式)。金宝app在这种情况下,1秒块执行;但是,输入任务尚未计算越快。这可能会导致不可预知的结果。

要消除这些问题,必须插入一个速度慢和快块之间的过渡块。

假设速度过渡块中使用其默认(保护/确定性)模式。

下一个图显示了结果的时序与添加率过渡块。

三个要点转换在这个图中(指围绕数字):

  1. 过渡块输出率在1秒运行任务,但以较慢的速度(2秒)。的输出率过渡块饲料1秒任务块。

  2. 过渡更新率使用的输出2第二个任务更新其内部状态。

  3. 率转换输出1秒的任务使用状态的更新速度过渡2秒的任务。

第一个问题是缓解因为过渡块更新速度较慢,慢的优先级。的输入速度过渡块(这是慢的输出块)读取慢块完成后执行。

第二个问题是缓解因为过渡块执行以较慢的速度及其输出并没有改变在计算速度块的驾驶。执行速度过渡块的输出部分的采样率慢,但快块的优先级。因为过渡块驱动速度块率和有效地相同的优先级,执行前更快的块。

请注意

这个用过渡块率变化的模型。慢的输出块现在推迟了一次一步输出相比没有速度过渡块。

保护数据完整性挥发性关键字

当您选择模型配置参数数据传输期间确保数据完整性,生成的代码速度过渡块定义了全球缓冲区和信号量,并使用它们来保护数据传输的完整性。

特别是对于多任务应用程序中,所涉及的任务(利率)传输数据的数据传输可以写,缓冲区,信号量有时编译器无法预测。防止编译器优化汇编代码的方式妥协的完整性转移数据,代码生成器适用于关键字挥发性缓冲区和信号量。代码生成器并不适用挥发性全局变量,因为代表转移数据挥发性缓冲区和信号量通常提供足够的保护。

使用嵌入式编码器®,您可以明确地适用挥发性传输数据通过应用内置的自定义存储类挥发性的输入率转换块。例如,您可以使用这种方法来保护数据的完整性,外部代码和生成的代码。

另外,保护数据,外部代码和生成的代码,您可以编写自己的C函数,读取和写入数据保护的方式。然后,您可以应用定制的存储类GetSet模型中的数据,导致生成的代码调用你的函数,而不是直接访问数据。

关于申请的更多信息挥发性,请参阅保护全球数据常量和不稳定类型限定符(嵌入式编码)。更多信息GetSet,请参阅通过与存储类GetSet函数访问数据(嵌入式编码)

分离率过渡块代码和数据从算法的代码和数据

您可以指定是否代码生成器内联代码和数据产生速度过渡与模型代码块或将代码和数据在不同的模型代码调用的函数。你控制这个选择率过渡块代码参数。分离率过渡阻止代码和数据算法代码和数据使您能够独立分析、优化和测试速度过渡和算法代码块。默认情况下,速度过渡块代码设置内联代码和数据与算法。你可以单独的代码和数据,生成的代码包含独立得到功能模型_step函数调用和一个专用的结构状态数据。生成的代码还包含分开开始初始化功能模型_initialize函数调用。

示例模型

打开示例模型rtwdemo_ratetrans。这种多重速率的多任务模型包含几个速度过渡块操作在不同的模式。

open_system (“rtwdemo_ratetrans”);set_param (“rtwdemo_ratetrans”,“SystemTargetFile”,“ert.tlc”);set_param (“rtwdemo_ratetrans”,“GenerateComments”,“关闭”);

单独的代码速度过渡块

配置参数对话框中率过渡块代码参数设置为函数。为模型生成代码。在文件的代码rtwdemo_ratetrans.crtwdemo_ratetrans.h

currentDir = pwd;[~,cgDir] = rtwdemodir ();rtwbuild (“rtwdemo_ratetrans”);
# # #开始构建过程:rtwdemo_ratetrans # # #成功完成构建过程:rtwdemo_ratetrans模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = rtwdemo_ratetrans代码生成和编译代码生成信息文件不存在。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米18.871秒
hfile = fullfile (cgDir,“rtwdemo_ratetrans_ert_rtw”,“rtwdemo_ratetrans.h”);rtwdemodbtype (hfile“typedef struct {”,”}DW,“,1,1);
typedef struct {real_T OutportBufferForOut3 [20];real_T Integrator1_DSTATE [20];real_T Integrator2_DSTATE [20];real_T Integrator3_DSTATE [20];real_T Integrator1_PREV_U [20];real_T Integrator2_PREV_U [20];real_T Integrator3_PREV_U [20];uint32_T Algorithm_PREV_T;结构体{uint_T Algorithm_RESET_ELAPS_T: 1;}bitsForTID1; uint8_T Integrator1_SYSTEM_ENABLE; uint8_T Integrator2_SYSTEM_ENABLE; uint8_T Integrator3_SYSTEM_ENABLE; } DW;

率过渡块的状态数据不是在全球国家结构,DW_rtwdemo_ratetrans_T。这个数据文件的结构rtwdemo_ratetrans_rtb.h

这段代码的文件rtwdemo_ratetrans.c

用= fullfile (cgDir,“rtwdemo_ratetrans_ert_rtw”,“rtwdemo_ratetrans.c”);rtwdemodbtype(用“空白rtwdemo_ratetrans_step0”,“空白rtwdemo_ratetrans_terminate(空白)1 0);
空白rtwdemo_ratetrans_step0 (void) {(rtM - > Timing.RateInteraction.TID0_1) + +;如果((rtM - > Timing.RateInteraction.TID0_1) > 1) {rtM - > Timing.RateInteraction。TID0_1 = 0;}rtwdemo_rate_DetAndIntegS2F_get (rtY.Out1);rtwdemo_ratetr_IntegOnlyS2F_get (rtY.Out2);memcpy(而无。&rtDW Out3 [0]。OutportBufferForOut3 [0] 20 u * sizeof (real_T));rtwdemo_rate_DetAndIntegF2S_set (rtU.In1);rtwdemo_ratetr_IntegOnlyF2S_set (rtU.In2);}无效rtwdemo_ratetrans_step1 (void) {real_T rtb_DetAndIntegF2S [20]; real_T rtb_IntegOnlyF2S[20]; real_T tmp; int32_T i; uint32_T Algorithm_ELAPS_T; rtwdemo_rate_DetAndIntegF2S_get(rtb_DetAndIntegF2S); rtwdemo_ratetr_IntegOnlyF2S_get(rtb_IntegOnlyF2S); if (rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T) { Algorithm_ELAPS_T = 0U; } else { Algorithm_ELAPS_T = rtM->Timing.clockTick1 - rtDW.Algorithm_PREV_T; } rtDW.Algorithm_PREV_T = rtM->Timing.clockTick1; rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = false; tmp = 0.001 * (real_T)Algorithm_ELAPS_T; for (i = 0; i < 20; i++) { if (rtDW.Integrator1_SYSTEM_ENABLE == 0) { rtDW.Integrator1_DSTATE[i] += tmp * rtDW.Integrator1_PREV_U[i]; } if (rtDW.Integrator2_SYSTEM_ENABLE == 0) { rtDW.Integrator2_DSTATE[i] += tmp * rtDW.Integrator2_PREV_U[i]; } if (rtDW.Integrator3_SYSTEM_ENABLE == 0) { rtDW.Integrator3_DSTATE[i] += tmp * rtDW.Integrator3_PREV_U[i]; } rtDW.OutportBufferForOut3[i] = rtDW.Integrator3_DSTATE[i]; rtDW.Integrator1_PREV_U[i] = rtb_DetAndIntegF2S[i]; rtDW.Integrator2_PREV_U[i] = rtb_IntegOnlyF2S[i]; rtDW.Integrator3_PREV_U[i] = rtU.In3[i]; } rtDW.Integrator1_SYSTEM_ENABLE = 0U; rtDW.Integrator2_SYSTEM_ENABLE = 0U; rtDW.Integrator3_SYSTEM_ENABLE = 0U; rtwdemo_rate_DetAndIntegS2F_set(rtDW.Integrator1_DSTATE); rtwdemo_ratetr_IntegOnlyS2F_set(rtDW.Integrator2_DSTATE); rtM->Timing.clockTick1++; } void rtwdemo_ratetrans_initialize(void) { rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = true; rtDW.Integrator1_SYSTEM_ENABLE = 1U; rtDW.Integrator2_SYSTEM_ENABLE = 1U; rtDW.Integrator3_SYSTEM_ENABLE = 1U; }

rtwdemo_ratetrans_step0rtwdemo_ratetrans_step1函数包含调用得到功能。这些函数包含分组码率转换。这些函数定义文件rtwdemo_ratetrans_rtb.c

生成率过渡的内联代码块

在配置参数对话框中,设置率过渡块代码参数内联。为模型生成代码。在文件的代码rtwdemo_ratetrans.crtwdemo_ratetrans.h

set_param (“rtwdemo_ratetrans”,“RateTransitionBlockCode”,“内联”);rtwbuild (“rtwdemo_ratetrans”)
# # #开始构建过程:rtwdemo_ratetrans # # #成功完成构建过程:rtwdemo_ratetrans模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = rtwdemo_ratetrans代码生成和编译生成的代码是过时了。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米16.174秒

                

这段代码是现在的文件rtwdemo_ratetrans.h

hfile = fullfile (cgDir,“rtwdemo_ratetrans_ert_rtw”,“rtwdemo_ratetrans.h”);rtwdemodbtype (hfile“typedef struct {”,”}DW,“,1,1);
typedef struct {real_T Integrator1_DSTATE [20];real_T Integrator2_DSTATE [20];real_T Integrator3_DSTATE [20];real_T DetAndIntegS2F_Buffer0 [20];挥发性real_T IntegOnlyS2F_Buffer [40];real_T DetAndIntegF2S_Buffer [20];挥发性real_T IntegOnlyF2S_Buffer0 [20];real_T Integrator1_PREV_U [20];real_T Integrator2_PREV_U [20];real_T Integrator3_PREV_U [20]; uint32_T Algorithm_PREV_T; struct { uint_T Algorithm_RESET_ELAPS_T:1; } bitsForTID1; volatile int8_T IntegOnlyS2F_ActiveBufIdx; volatile int8_T IntegOnlyF2S_semaphoreTaken; uint8_T Integrator1_SYSTEM_ENABLE; uint8_T Integrator2_SYSTEM_ENABLE; uint8_T Integrator3_SYSTEM_ENABLE; } DW;

率过渡块的状态数据不是在全球国家结构,DW_rtwdemo_ratetrans_T。这个数据文件的结构rtwdemo_ratetrans_rtb.h

这段代码是现在的文件rtwdemo_ratetrans_rtb.c

用= fullfile (cgDir,“rtwdemo_ratetrans_ert_rtw”,“rtwdemo_ratetrans.c”);rtwdemodbtype(用“空白rtwdemo_ratetrans_step0”,“空白rtwdemo_ratetrans_terminate(空白)1 0);
空白rtwdemo_ratetrans_step0 (void) {int32_T我;int32_T i_0;(rtM - > Timing.RateInteraction.TID0_1) + +;如果((rtM - > Timing.RateInteraction.TID0_1) > 1) {rtM - > Timing.RateInteraction。TID0_1 = 0;如果(rtM - > Timing.RateInteraction}。TID0_1 = = 1) {memcpy(而无。着干活[0],&rtDW。DetAndIntegS2F_Buffer0 [0] 20 u * sizeof (real_T));我= rtDW}。IntegOnlyS2F_ActiveBufIdx * 20;(i_0 = 0;i_0 < 20; i_0++) { rtY.Out2[i_0] = rtDW.IntegOnlyS2F_Buffer[i_0 + i]; } if (rtM->Timing.RateInteraction.TID0_1 == 1) { memcpy(&rtDW.DetAndIntegF2S_Buffer[0], &rtU.In1[0], 20U * sizeof(real_T)); } if (rtDW.IntegOnlyF2S_semaphoreTaken == 0) { for (i = 0; i < 20; i++) { rtDW.IntegOnlyF2S_Buffer0[i] = rtU.In2[i]; } } } void rtwdemo_ratetrans_step1(void) { real_T rtb_IntegOnlyF2S[20]; real_T tmp; int32_T i; uint32_T Algorithm_ELAPS_T; rtDW.IntegOnlyF2S_semaphoreTaken = 1; for (i = 0; i < 20; i++) { rtb_IntegOnlyF2S[i] = rtDW.IntegOnlyF2S_Buffer0[i]; } rtDW.IntegOnlyF2S_semaphoreTaken = 0; if (rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T) { Algorithm_ELAPS_T = 0U; } else { Algorithm_ELAPS_T = rtM->Timing.clockTick1 - rtDW.Algorithm_PREV_T; } rtDW.Algorithm_PREV_T = rtM->Timing.clockTick1; rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = false; tmp = 0.001 * (real_T)Algorithm_ELAPS_T; for (i = 0; i < 20; i++) { if (rtDW.Integrator1_SYSTEM_ENABLE == 0) { rtDW.Integrator1_DSTATE[i] += tmp * rtDW.Integrator1_PREV_U[i]; } if (rtDW.Integrator2_SYSTEM_ENABLE == 0) { rtDW.Integrator2_DSTATE[i] += tmp * rtDW.Integrator2_PREV_U[i]; } if (rtDW.Integrator3_SYSTEM_ENABLE != 0) { rtY.Out3[i] = rtDW.Integrator3_DSTATE[i]; } else { rtY.Out3[i] = tmp * rtDW.Integrator3_PREV_U[i] + rtDW.Integrator3_DSTATE[i]; } rtDW.Integrator1_PREV_U[i] = rtDW.DetAndIntegF2S_Buffer[i]; rtDW.Integrator2_PREV_U[i] = rtb_IntegOnlyF2S[i]; rtDW.Integrator3_DSTATE[i] = rtY.Out3[i]; rtDW.Integrator3_PREV_U[i] = rtU.In3[i]; rtDW.DetAndIntegS2F_Buffer0[i] = rtDW.Integrator1_DSTATE[i]; } rtDW.Integrator1_SYSTEM_ENABLE = 0U; rtDW.Integrator2_SYSTEM_ENABLE = 0U; rtDW.Integrator3_SYSTEM_ENABLE = 0U; for (i = 0; i < 20; i++) { rtDW.IntegOnlyS2F_Buffer[i + (rtDW.IntegOnlyS2F_ActiveBufIdx == 0) * 20] = rtDW.Integrator2_DSTATE[i]; } rtDW.IntegOnlyS2F_ActiveBufIdx = (int8_T)(rtDW.IntegOnlyS2F_ActiveBufIdx == 0); rtM->Timing.clockTick1++; } void rtwdemo_ratetrans_initialize(void) { rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = true; rtDW.Integrator1_SYSTEM_ENABLE = 1U; rtDW.Integrator2_SYSTEM_ENABLE = 1U; rtDW.Integrator3_SYSTEM_ENABLE = 1U; }

是内联函数的代码rtwdemo_ratetrans_step0rtwdemo_ratetrans_step1

限制

代码生成器并不单独的代码和数据率转换块适应信号或为每个子系统内部的块。

另请参阅

bdclose (“rtwdemo_ratetrans”);rtwdemoclean;cd (currentDir)

相关的话题