请联系客服QQ
艾特贸易网首页

艾特贸易网

STEP 7逻辑块的调用过程及内存分配

提示:

CPU提供块堆栈(B堆栈)用来存储与处理被中断块的有关信息。当发生块调用或有来自更高优先级的中断时,就有相关的块信息存储在B堆栈里,并影响部分内存和寄存器。(1)用户程序使用的堆栈 图5-8是CPU中的一块特殊的存储区,采用“先入后出”的规则存入和取出数据。堆栈中最上面的存储单元称为栈顶,要保存的数据从栈顶“压入

    CPU提供块堆栈(B堆栈)用来存储与处理被中断块的有关信息。当发生块调用或有来自更高优先级的中断时,就有相关的块信息存储在B堆栈里,并影响部分内存和寄存器。

    (1)用户程序使用的堆栈

    5-8CPU中的一块特殊的存储区,采用“先入后出”的规则存入和取出数据。堆栈中最上面的存储单元称为栈顶,要保存的数据从栈顶“压入”堆栈时,堆栈中原有的数据依次向下移动一个位置。在取出栈顶的数据后,堆栈中所有的数据依次向上移动一个位置。堆栈的这种“先入后出”的存取规则刚好满足块的调用(包括中断处理时块的调用)要求。因此堆栈在计算机的程序设计中得到了广泛的应用。

 堆栈的操作

    5-8    堆栈的操作

    ①局部数据堆栈(L堆栈)。各逻辑块都有它的局部变量(L)存储区,局部变量在逻辑块的变量声明表中生成,只在它被创建的块中有效。局部数据堆栈简称L堆栈,是CPU中单独的存储器区,可用来存储逻辑块的局部变量、组织块的起始信息)、块与块之间传递参数的信息、梯形图程序中的中间逻辑结果等。局部数据可以按位、字节、字和双字来存取,如L0.0LB9LW4LD52,见表5-7

    5-7    全局变量与局部变量

全局变量与局部变量

    如果在逻辑块中使用局部变量,不使用绝对地址或全局符号,不做任何改动,就可以将子程序移植到别的项目中去。局部数据堆栈用来储存块的局部数据区的临时变量、组织块的启动信息、块传递参数的信息和梯形图程序的中间结果。

    CPU分配给当前正在处理的块的临时局部变量的存储器容量是有限的,这一存储区(即局部堆栈)的大小与CPU的型号有关。CPU给每一优先级分配了局部数据区,这样可以保证不同优先级的OB都有它们可以使用的局部数据空间。

    在图5-9中的OB1调用功能FC2的执行被组织块OB81中断,图5-9中给出了局部数据堆栈中局部数据的存放情况。

块堆栈与局部数据堆栈

    5-9    块堆栈与局部数据堆栈

    在局部数据堆栈中,并非所有的优先级都需要相同数量的存储区。通过在STEP 7中设置参数,可以给S7-400 CPU的每一优先级指定不同大小的局部数据区。S7-300 CPU每一优先级的局部数据区的大小是固定的。

    ②块堆栈(B堆栈)。如果一个块的处理由于调用另外一个块,或者被更高优先级的OB块中止,则CPU将在块堆栈中存储以下信息。

    ·被中断的块的类型(OBFBFCSFBSFC)、编号和返回地址。

    ·从DBDI寄存器中获得的块被中断时打开的共享数据块和背景数据块的编号。

    ·局部数据堆栈的指针。

    利用这些数据,可以在中断它的任务处理完后恢复被中断的块的处理。在多重调用时,堆栈可以保存参与嵌套调用的几个块的信息。

    CPU处于STOP模式时,可以用STEP 7查看块堆栈中保存的进入STOP模式时没有处理完的块,在块堆栈中,块按照它们被处理的顺序排列,如图5-10所示。

调用块时B堆栈与L堆栈的变化

    5-10    调用块时B堆栈与L堆栈的变化

    每个中断优先级对应的块堆栈可以储存的数据的字节数与CPU的型号有关。

    ③中断堆栈(I堆栈)。如果程序的执行被优先级更高的OB中断,操作系统将保存下述寄存器的内容,包括当前的累加器和地址寄存器的内容、数据块寄存器DBDI的内容、局部数据的指针、状态字、MCR(主控继电器)寄存器和块堆栈的指针。

    新的OB执行完后,操作系统读取中断堆栈中的信息,从被中断的块被中断的地方开始继续执行程序。

    CPUSTOP模式时,可以用STEP 7在模块信息中查看中断堆栈保存的数据,由此打出使CPU进入STOP模式的原因。

    (2)功能块与功能的调用时的堆栈操作

    CPU提供块堆栈(B堆栈)用来存储与处理被中断块的有关信息。当发生块调用或有来自更高优先级的中断时,就有相关的块信息存储在B堆栈里,并影响部分内存的寄存器。图5-10显示了调用块时B堆栈的变化。图5-11提供了关于STEP 7的块调用情况。

调用指令对CPU内存的影响

    5-11    调用指令对CPU内存的影响

    ①调用功能块FB时的堆栈操作。当调用功能块FB时,会有以下事件发生。

    ·调用块的地址和返回位置存储在块堆栈中,调用块的临时变量压入L堆栈。

    ·数据块DB寄存器内容与DI寄存器内容交换。

    ·新的数据块地址装入DI寄存器。

    ·被调用块的实参装入DBL堆栈上部。

    ·当功能块FB结束时,先前块的现场信息从块堆栈中弹出,临时变量弹出L堆栈。

    ·DBDI寄存器内容交换。

    当调用功能块FB时,STEP 7并不一定要求给FB的形参赋予实参,除非参数是复合数据类型的I/O形参或参数类型形参。如果没有给FB形参赋予实参,则功能块FB就调用背景数据块内的数值,该数值是在功能块的变量声明表内或背景数据块内设置的形参初始数值。

    ②调用功能FC时的堆栈操作。当调用功能FC时会有以下事件发生。

    ·功能FC实参的指针存到调用块的L堆栈。

    ·调用块的地址和返回位置存储在块堆栈,调用块的局域数据压入L堆栈。

    ·功能FC存储临时变量的L堆栈区被推入L堆栈上部。

    ·当被调用功能FC结束时,先前块的信息存储在块栈中,临时变量弹出L堆栈。

    因为功能FC不用背景数据块、不能分配初始数值给功能FC的局域数据,所以必须给功能FC提供实参。

    STEP 7为功能FC提供了一个特殊的返回值输出参数(关键字为RET_VAL)。当用STEP 7的程序编辑器(Program Editor)以增量模式创建功能FC时,可在FC的变量声明表中专用一个输出参数RET_VAL,并指明其数据类型。


(责任编辑: 艾特贸易网 )

  • 本文关键字:STEP7 

免责声明:本文章仅代表作者个人观点,与艾特贸易网无关。本站大部分技术资料均为原创文章,文章仅作为读者参考使用,请自行核实相关内容,如若转载请注明来源:艾特贸易网 http://www.aitmy.com