功能(FC)、功能块(FB)和组织块(OB)统称为逻辑块(或程序块)。功能块(FB)有一个数据结构与该功能块的参数完全相同的数据块,称为背景数据块,背景数据块依附于功能块,它随着功能块的调用而打开,随着功能块的结束而关闭。存放在背景数据块中的数据在功能块结束时继续保持。而功能(FC)则不需要背景数据块,功能调用结束后数据不能保持。组织块(OB)是由操作系统直接调用的逻辑块。
逻辑块(OB、FB、FC)由变量声明表、代码段及其属性等几部分组成。
1)局部变量声明表(局部数据)
每个逻辑块前部都有一个变量声明表,称为局部变量声明表,如表7-3所示。
表7-3 局部变量声明表

局部数据分为参数和局部变量两大类,局部变量又包括静态变量和临时变量(暂态变量)两种。
对于组织块(OB)来说,其调用是由操作系统管理的,用户不能参与。因此,OB只有定义在L堆栈中的临时变量。
对于功能(FC),操作系统在L堆栈中给FC的临时变量分配存储空间。由于没有背景数据块,因而FC不能使用静态变量。输入、输出、I/O参数以指向实参的指针形式存储在操作系统为参数传递而保留的额外空间中。
对于功能块(FB),操作系统为参数及静态变量分配的存储空间是背景数据块。这样参数变量在背景数据块中留有运行结果备份。在调用FB时,若没有提供实参,则功能块使用背景数据块中的数值。操作系统在L堆栈中给FB的临时变量分配存储空间。
2)逻辑块局部变量的数据类型
局部变量可以是基本数据类型或复式数据类型,也可以是专门用于参数传递的参数类型。参数类型包括定时器、计数器、块的地址或指针等。图7-22所示的是可以从数据类型的下拉按钮中选择需要的类型。

图7-22 建立的FC功能
3)逻辑块的调用过程及内存分配
CPU提供块堆栈(L堆栈,B堆栈,I堆栈)来存储与处理相关的逻辑块。逻辑块的调用过程及内存分配如图7-23所示。
(https://www.xing528.com)
图7-23 逻辑块的调用及内存分配
(1)调用功能(FC)时的堆栈操作,会有以下事件发生:
●功能(FC)实参的指针存到调用块的L堆栈;
●调用块的地址和返回位置存储在块堆栈,调用块的局部数据压入L堆栈;
●功能(FC)存储临时变量的L堆栈区被推入L堆栈上部;
●当被调用功能(FC)结束时,先前块的信息存储在块堆栈中,临时变量弹出L堆栈。
因为功能(FC)不用背景数据块,不能分配初始数值给功能(FC)的局部数据,所以必须给功能(FC)提供实参。调用功能(FC)时的堆栈操作如图7-24所示。

图7-24 调用功能(FC)时的堆栈操作
(2)调用功能块(FB)时的堆栈操作,会有以下事件发生:
●调用块的地址和返回位置存储在块堆栈中,调用块的临时变量压入L堆栈;
●数据块SDB寄存器内容与IDB寄存器内容交换;
●新的数据块地址装入IDB寄存器;
●被调用块的实参装入SDB和L堆栈上部;
●当功能块FB结束时,先前块的现场信息从块堆栈中弹出,临时变量弹出L堆栈;
●SDB和IDB寄存器内容交换。
当调用功能块(FB)时,STEP 7并不一定要求给FB形参赋予实参,除非参数是复式数据类型的I/O形参或参数类型形参。如果没有给FB的形参赋予实参,则功能块(FB)就调用背景数据块内的数值,该数值是在功能块(FB)的变量声明表或背景数据块内为形参所设置初始数值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
