AN2004


AN2004 在GUTTA中使用递归调用
   PDF格式完整版本下载

概述

GUTTA PLC支持若干子程序的调用。在每个子程序调用时,系统会为每个调用分配一段固定大小(取决于L变量区域的大小)的临时变量空间。分配顺序和子程序调用顺序一致,即子程序调用时分配,子程序返回时撤销。由于子程序的调用必然是先调用者后返回,故临时变量空间的分配和撤销也满足先分配者后撤销。正因为如此,临时变量空间的增长类似于栈空间的增长。当子程序钳套达到最大时,临时变量空间达到最大。当所有子程序都返回时,临时变量空间回到最小。

需要注意的是,临时变量空间和子程序并不是对应的,而是和子程序调用对应的。若某个子程序是可以重入的,在不同的时候,临时变量对应的绝对地址是不同的。

临时变量主要有两方面的用途:

和ICE61131中POU的实例化概念不同,临时变量空间位于栈中,子程序返回时,临时变量就撤销了,因此临时变量不能存储全局状态。

利用子程序的递归调用,来进行N!的数学运算,是本文档的内容。这个例子仅仅只是为了说明子程序的参数传递特性,在实际的工程应用中,应该避免这样的用法。

程序说明

http://www.visiblecontrol.com/technologies/anindex/an2004/Recursion.vcw

主程序INT_0(INT0):

INT_0(INT0)只有1个梯级,即在I0.0按下时进行一次N!的运算。MW0表示N,MW0为运算的结果。由于在CPU-EC20系统中,程序钳套的层数不能超过8层,故N的值应该小于8。

子程序SBR_0(SBR0):

SBR_0(SBR0)有3个临时变量的定义。N为输入参数,OUT为输出参数,VAR是临时变量。

NETWORK 0用于递归的中止(否则会无限递归下去)。若N=0,由于0!=1,故直接让输出OUT=1。

NETWORK 1用于递归的调用。若N!=0,先通过自己求出(N-1)!,结果放入VAR中。然后令OUT=N*VAR,即OUT=N!。