主要内容

处理速度的转换

速率转换

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

  • 一个快的块驱动一个慢的块

  • 一个较慢的块驱动一个较快的块

下面几节只讨论具有零偏移的周期采样时间的模型。其他注意事项适用于涉及异步任务的多速率模型。有关如何为异步多任务生成代码的详细信息,请参见异步支持金宝app

在多任务和伪多任务系统中,不同的采样率可能导致块以错误的顺序执行。为了防止计算数据中可能出现的错误,您必须在这些转换中控制模型的执行。当连接更快和更慢的块时,你或Simulink金宝app®发动机必须添加它们之间的速率转换块。在下一个数字中示出了快速慢速转换。

下一个数字中示出了慢速转换。

请注意

尽管Rate Transition块提供了Unit Delay块(用于慢到快的转换)和Zero-Order Hold块(用于快到慢的转换)功能的超集,但您应该使用Rate Transition块而不是这些块。

数据传输问题

速率转换块处理与以不同速率运行的块之间的数据传输相关的数据完整性和确定主义问题。

  • 数据完整性:当数据块的输入在执行过程中发生变化时,就会存在数据完整性问题。数据完整性问题可能由抢占引起。

    考虑以下场景:

    • 较快的块向较慢的块提供输入。

    • 较慢的块读取输入值V1从更快的块开始并使用该值开始计算。

    • 计算被更快的块的另一次执行抢占,它计算一个新的输出值V2

    • 现在出现了一个数据完整性问题:当较慢的块恢复执行时,它继续计算,现在使用“新”输入值V2

    这种数据传输称为无保护的实时的更快到更慢的转换显示了未受保护的数据传输。

    在一个受保护的数据传输,输出V1保持更快的块,直到执行较慢的块完成执行。

  • 确定的相对不确定的数据传输:在一个确定的数据传输,数据传输的定时是完全可预测的,通过块的采样率确定。

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

您可以使用Rate Transition块来保护应用程序中的数据传输并使其具有确定性。这些特性在大多数应用中被认为是可取的。然而,Rate Transition块支持灵活的选项,允许您为了更低的金宝app延迟而牺牲数据完整性和确定性。下一节总结这些选项。

数据传输的假设

当处理任务之间的数据传输时,代码生成器会做出以下假设:

  • 数据转换发生在单个读任务和单个写任务之间。

  • 对字节大小的变量的读或写是原子的。

  • 当两个任务通过数据转换进行交互时,只有一个任务可以抢占另一个任务。

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

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

  • 进程不会崩溃或重启(特别是在任务之间传输数据时)。

速率转换块选项

Rate Transition块的几个参数与它在代码生成中用于实时执行有关,如下所述。有关完整的块描述,请参见率转换

速率转换块处理周期性(从快到慢,从慢到快)和异步转换。当插入两个不同的样品速率块之间时,速率转换块自动配置其输入和输出的样品速率的转换类型;您不需要指定转换是慢到快还是快到慢(异步任务的优先级从低到高或从高到低)。

在配置速率转换块时,您必须做出的关键决定是在两个速率之间选择要使用的数据传输机制。您的选择取决于对安全、内存使用和性能的考虑。如下图中的“速率转换块参数”对话框所示,数据传输机制由两个选项控制。

  • 在数据传输期间确保数据完整性:选择该参数时,速率之间传输的数据将保持完整性(数据传输受到保护)。当清除此参数时,数据可能无法保持其完整性(数据传输不受保护)。默认情况下,参数在数据传输期间确保数据完整性被选中。

  • 确保确定性数据传输(最大延迟):此参数适用于偏移量为零的定期任务以及速金宝app度和速度的倍数。选择此参数时,速率转换块的行为类似于零阶保持块(用于快速到慢速转换)或单位延迟块(用于慢速到快速转换)。速率转换块以完全可预测的方式控制数据传输的定时。清除此参数时,数据传输不确定。默认情况下,确保确定性数据传输(最大延迟)选择具有零点偏移的周期性速率之间的转换;对于异步转换,无法选择它。

速率转换块提供了三种相对于数据传输的操作模式。按照安全水平:

  • 保护/确定性(默认):这是最安全的模式。此模式的缺点是,在慢速到快速周期性速率转换的情况下,它将确定性延迟引入系统。在这种情况下,速率转换块引入的延迟是较慢任务的一个采样周期。在快速到慢速周期性速率转换的情况下,速率转换n块不会引入额外的延迟。

  • 保护/不确定的:在这种模式下,对于慢到快的周期性速率转换,数据完整性是通过速率之间传输的双缓冲数据来保护的。对于快到慢的周期速率转换,使用一个信号量标志。速率转换块下游的块使用驱动速率转换块的块的最新可用数据。最大延迟小于或等于较快任务的一个采样周期。

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

  • 不受保护的/不确定的:关键应用不建议使用该模式。这种模式的延迟与Protected/NonDeterministic模式相同,但是内存需求减少了,因为既不需要双缓冲也不需要信号量。也就是说,在这种模式下,速率过渡块除了传递信号外,什么也不做;它的存在只是为了通知您存在速率转换(并且可能导致生成的代码计算错误的答案)。然而,选择这种模式会生成最少的代码。

    请注意

    在无保护模式下(在数据传输期间确保数据完整性,则速率转换块只允许模型中存在速率转换。

速率转换块和连续时间

速率转换块的输出端口处的采样时间只能在次要时间步骤中离散或固定。这意味着当速率转换块从其目标块继承连续采样时间时,它将继承的采样时间视为在次要时间步骤中固定的。因此,速率转换块的输出函数仅在主要时间步骤中运行。如果目的地块采样时间是连续的,则速率转换块输出采样时间是基本速率采样时间(如果求解器是固定步骤),或零阶保持连续采样时间(如果求解器是可变步骤)。

自动速度过渡

Simu金宝applink引擎可以在更新图表期间检测多任务模型中不匹配的速率转换,并自动插入速率转换块来处理它们。要启用此功能,请选择模型配置参数自动处理速率转换的数据传输.缺省情况下,清除该参数。选择该参数时:

  • 金宝appSimulink处理周期性样本时间和异步任务之间的转换。

  • 金宝appSimulink在框图中插入隐藏的速率转换块。

  • 代码生成器为自动插入的Rate Transition块生成代码。此代码与手动插入的Rate Transition块生成的代码相同。

  • 自动插入的速率转换块在保护模式下运行,用于定期任务和异步任务。您无法更改此行为。对于定期任务,自动插入的速率转换块与模型配置参数指定的确定性级别运行确定性数据传输.默认设置为只要有可能,它支持在以整数倍相关的周期性采样时间之间确定数据传输。有关更多信息,请参见确定性数据传输.要使用其他模式,必须插入速率转换块并手动设置它们的模式。

例如,在此模型中,正弦波2的采样时间为2,而正弦波3的采样时间为3。

当您选择模型配置参数时自动处理速率转换的数据传输, 金宝appSimulink在每个正弦波块和产品块之间插入一个速率过渡块。插入的块具有与正弦波块样品。

如果模型中的输入端口和输出端口数据采样率不是彼此的倍数,Simulink将插入一个速率转换块,其采样率是两个速率的最大公约数(GCD)。金宝app如果模型中没有其他块包含这个新速率,则在模拟过程中会发生错误。在这种情况下,必须手动插入速率转换块。

可视化插入的速率转换块

当您选择模型配置参数时自动处理速率转换的数据传输, 金宝appSimulink在具有不匹配的转换速率的路径中插入速率转换块。这些块在默认情况下是隐藏的。要可视化插入的块,请更新图表。Badge标签出现在模型中,并指示Simulink在编译阶段插入Rate Transition块的位置。金宝app例如,在该模型中,当模型编译时,在两个正弦波模块与多路复用器和积分器之间插入了三个速率过渡模块。ZOH和DbBuf徽章标签表示这些块。

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

要配置隐藏的速率转换块,使其可见,右键单击一个徽章标签并单击插入速率转换块

当你让隐藏的速率转换块可见:

  • 您可以看到插入的Rate Transition块的类型以及该块在模型中的位置。

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

  • 您可以更改速率传输的块参数设置。

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

显示插入的速率转换块与导出函数模型不兼容。

要了解更多关于速率转换块类型的信息,请参见率转换

周期性采样率跃迁

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

更快到更慢的转换金宝app模型

在一个模型中,较快的块驱动具有直接馈通的较慢的块,较快的块的输出首先被计算。在较慢的块不执行的模拟间隔中,模拟进展更快,因为要执行的块更少。下一个图说明了这种情况。

Si金宝appmulink仿真不是实时执行的,这意味着它不受实时约束。模拟等待或向前移动到完成模拟流所需的任何任务。样本时间步骤之间的实际时间间隔可以变化。

实时的更快到更慢的转换

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

在上图中,较快的块在较慢的块完成执行之前执行第二次。这可能会导致不可预知的结果,因为慢任务的输入数据正在改变。在这种情况下,数据可能无法保持其完整性。

为了避免这种情况,Simulink引擎必须保持1秒(较快)金宝app块的输出,直到2秒(较慢)块完成执行。实现这一点的方法是在1秒和2秒块之间插入一个速率转换块。较慢块的输入在执行过程中不会改变,从而保持数据完整性。

假设Rate Transition块是在其默认(受保护/确定性)模式下使用的。

速率转换块在较慢块的采样率下执行,但具有更快的块的优先级。

当您添加一个Rate Transition块时,该块在2秒块之前执行(它的优先级更高),它的输出值保持不变,而2秒块执行(它以较慢的采样率执行)。

在a中更快地过渡速度较慢金宝app模型

在一个较慢的块驱动较快的块的模型中,Simulink引擎再次首先计算驱动块的输出。金宝app在采样间隔中,只有较快的块执行,模拟进展更快。

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

从前面的图中可以看出,Simulink引擎能够以一种有效的方式模拟具有多个样本率的模型。金宝app然而,Simulink金宝app模拟并不是实时运行的。

实时转换从慢到快

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

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

  • 执行较慢的块的执行是拆分超过一个更快的块间隔。在这种情况下,更快的任务在较慢的任务完成执行之前第二次执行。这意味着要更快的任务的输入可能会有不正确的值。

  • 较快的块在较慢的块之前执行(这与Simulink模拟操作的方式相反)。金宝app在本例中,1 second块首先执行;但是对快速任务的输入还没有计算出来。这可能导致不可预知的结果。

要消除这些问题,必须在较慢和较快的块之间插入一个Rate Transition块。

假设Rate Transition块是在其默认(受保护/确定性)模式下使用的。

下一个图显示了添加速率转换块的时序结果。

图中关于过渡的三个关键点(参见圈出的数字):

  1. 速率转换块输出在1秒任务中运行,但速率较慢(2秒)。速率转换块的输出馈送1个第二任务块。

  2. 速率转换更新使用2秒任务的输出来更新其内部状态。

  3. 1秒任务中的Rate Transition输出使用在2秒任务中更新的Rate Transition状态。

减轻了第一个问题,因为速率转换块以较慢的速率和较慢块的优先级更新。在较慢的块完成执行之后,读取到速率转换块(其是较慢块的输出)。

缓解了第二个问题,因为速率转换块以较慢的速率执行,并且其输出在其驱动的更快块的计算期间不会改变。速率转换块的输出部分以较慢块的采样率执行,但是具有更快的块的优先级。由于速率转换块驱动更快的块并有效地具有相同的优先级,因此在更快的块之前执行它。

请注意

Rate Transition块的这种使用改变了模型。与没有速率转换块的输出相比,较慢块的输出现在延迟了一个时间步长。

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

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

特别是对于多任务应用程序,数据传输中涉及的任务(速率)可能会在编译器无法预料的情况下写入传输的数据、缓冲区和信号量。为了防止编译器以损害传输数据完整性的方式优化汇编代码,代码生成器应用关键字挥发性缓冲区和信号量。代码生成器不适用挥发性到代表转移数据的全局变量,因为挥发性缓冲和信号量通常提供足够的保护。

使用嵌入式编码器®,您可以显式应用挥发性通过应用内置的自定义存储类来转换传输的数据挥发性的输入率转换例如,您可以使用此技术帮助保护外部代码与生成的代码共享的数据的完整性。

或者,为了保护外部代码与生成代码共享的数据,您可以编写自己的C函数,以受保护的方式读取和写入数据。然后,您可以应用自定义存储类GetSet到模型中的数据,这会导致生成的代码调用函数,而不是直接访问数据。

查阅更多有关申请的资料挥发性,请参阅使用const和volatile类型限定符保护全局数据(嵌入式编码).有关GetSet,请参阅通过使用存储类GetSet的函数访问数据(嵌入式编码)

从算法代码和数据中分离速率转换块代码和数据

您可以指定代码生成器是使用模型代码内联为Rate Transition块生成的代码和数据,还是将代码和数据放在模型代码调用的单独函数中。你可以通过选择速率转换块码参数将速率转换块代码和数据与算法代码和数据分离,使您能够独立分析、优化和测试速率转换块和算法代码。默认情况下,速率转换块代码与算法代码和数据内联设置。您可以将代码和数据分开,以便生成的代码包含单独的数据得到功能模型_step函数调用和用于状态数据的专用结构。生成的代码还包含单独的开始初始化功能模型_initialize函数调用。

示例模型

打开示例模型rtwdemo_ratetrans.这个多速率、多任务模型包含几个在不同模式下运行的速率转换块。

open_system ('RTWDEMO_RATETRANS');set_param ('RTWDEMO_RATETRANS'“SystemTargetFile”“呃,tlc”);set_param ('RTWDEMO_RATETRANS''generatecomments'“关闭”);

速率转换块的单独代码

在“配置参数”对话框中速率转换块码参数设置为函数.为模型生成代码。代码在文件中rtwdemo_ratetrans.crtwdemo_ratetrans.h

CurrentDir = PWD;[〜,cgdir] = rtwdemodir();SLBUILD('RTWDEMO_RATETRANS');
###成功完成rtwdemo_ratetrans的构建过程:模型重建行动的原因  ================================================================================================== rtwdemo_ratetrans代码生成和编译代码生成信息文件不存在。建造时间:0小时0米22.55秒
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;struct {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);
void rtwdemo\u rateTransu\u step0(void){(rtM->Timing.RateInteraction.TID0\u 1)+if((rtM->Timing.RateInteraction.TID0\u 1=0;}rtwdemo\u rate detaintegs2f\u get(rtY.Out1);rtwdemo\u rateTru tru integrationlys2f\u get(rtY.Out2);memcpy(&rtY.Out3[0],&rtDW.outportforsiz3[0]),real bufferu)rtwdemo_rate_DetAndIntegF2S_set(rtU.In1);rtwdemo_rate tr_integrationlyf2s_set(rtU.In2)}void rtwdemo_rate trans_step1(void){real_T rtb_DetAndIntegF2S[20];real_T rtb_integrationlyf2s[20];real_ttmp;int32_ti;uint32_算法_ELAPS;rtwdemo_rate_detantegf2s[20];rtwdemo_rate_detantegf2s get(rtb);integrationyf2s);integratefu(rtDW.bitsForTID1.Algorithm_RESET_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=0.001*(real_-T)Algorithm=0;i<20++(rtDW.Integrator1_SYSTEM_ENABLE==0){rtDW.Integrator1_DSTATE[i]+=tmp*rtDW.Integrator1_PREV_[i]}如果(rtDW.Integrator2_SYSTEM_ENABLE==0){rtDW.Integrator2_DSTATE[i]+=tmp*rtDW.Integrator2_PREV_[i]}如果(rtDW.Integrator3_SYSTEM_ENABLE==0){rtDW[i] =rtDW.Integrator3_-DSTATE[i];rtDW.Integrator1_-PREV_[i]=rtb_-DetAndIntegF2S[i];rtDW.Integrator2_-PREV_[i]=rtb_-integrationlyf2s[i];rtDW.Integrator3_-PREV_[i]=rtU.In3[i]}rtDW.Integrator1_-SYSTEM_-ENABLE=0U;rtDW.Integrator2_-SYSTEM-ENABLE=0U-ENABLE=0U;rtDW.Integrator3=integratoru-detate=rtU-detandetu;rtwdemo_ratetr_integrationlys2f_set(rtDW.Integrator2_DSTATE);rtM->Timing.clockTick1++}void rtwdemo_ratetrans_initialize(void){rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T=true;rtDW.Integrator1_系统启用=1U;rtDW.Integrator2_系统启用=1U;rtDW.Integrator3_系统启用=1U;}

RTWDEMO_RATETRAN_STEP0.RTWDEMO_RATETRANS_STEP1.函数包含呼叫得到职能。这些功能包含速率转换块代码。这些函数定义在文件中rtwdemo_ratetrans_rtb.c

为速率转换块生成内联代码

在“配置参数”对话框中设置速率转换块码参数内联.为模型生成代码。代码在文件中rtwdemo_ratetrans.crtwdemo_ratetrans.h

set_param ('RTWDEMO_RATETRANS'“RateTransitionBlockCode”“内联”);SLBUILD('RTWDEMO_RATETRANS'
# # #开始构建过程:rtwdemo_ratetrans # # #成功完成构建过程:rtwdemo_ratetrans模型建立目标:总结构建模型重建行动的理由  ================================================================================= rtwdemo_ratetrans代码生成和编译生成的代码是过时了。建造时间:0小时0米17.212秒

               

此代码现在在文件中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);
void rtwdemo_ratetrans_step0(void) {int32_T i;int32_T i_0;(rtM - > Timing.RateInteraction.TID0_1) + +;if ((rtM-> timingrateinteraction . tid0_1) > 1) {rtM-> timingrateinteraction . tid0_1) {rtM-> timingrateinteraction . tid0_1)}TID0_1 = 0;}如果(rtM - > Timing.RateInteraction。titi0_1 == 1);着干活[0],&rtDW。DetAndIntegS2F_Buffer0[0], 20U * sizeof(real_T)); / /最大缓存} i = rtDW。IntegOnlyS2F_ActiveBufIdx * 20;For (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_RATETRAN_STEP0.RTWDEMO_RATETRANS_STEP1.

限制

对于具有可变大小信号或位于for Each子系统块内的速率转换块,代码生成器不分离代码和数据。

另见

bdclose ('RTWDEMO_RATETRANS');rtwdemoclean;cd (currentDir)

相关的话题