quote:以下是引用白果在2014-04-18 09:57:41的发言:
1、LZ写这段程序的目的是什么?是判断in1=TRUE时执行加法,=FALSE时保留上一次的值?如果是这样,一楼程序无法达到这个目的,而仅仅执行两个整数相加而已。
2、Temp变量为何要赋值,12楼已经解释的很清楚了。非常重要!
看了论坛里关于临时变量的帖子有了更新的认识,谢谢大家的解答。谢谢!
顺便我把我看的以前的帖子再跟大家分享一下。请大家分析一下如下几种情况:
声明:1.我使用的是STEP7的仿真软件
2.每测试一种情况,我都会事先复位仿真PLC,重新下载程序
情况1:
FC 1:
L 10
T LW0
FC 2:
L LW0
T MW10
FC 3:
L LW0
T MW12
OB 1:
CALL FC1
CALL FC2
OB 35:
CALL FC3
执行的结果是 MW10=10 MW12=0
情况 2:
在FC1/FC2中分别定义临时变量TEMP1
FC 1:
L 10
T #TEMP1
FC 2:
L #TEMP1
T MW10
FC 3:
L LW0
T MW12
OB 1:
CALL FC1
CALL FC2
OB 35:
CALL FC3
执行结果 MW10=10 MW12=0 (A:将FC1/FC2中的临时变量名任意修改;B:或FC1/FC2中只有一个定义临时变量;C:FC3也定义临时变量,变量名任意;结果均同上)
情况 3:
FC 1:
L 10
T LW0
FC 2:
L LW0
T MW10
CALL FC3
FC 3:
L LW0
T MW12
OB 1:
CALL FC1
CALL FC2
执行结果 MW10=0 MW12=0 (因为在FC2中调用了FC3)
根据以上3种情况,请大家分析:
1.临时变量是谁的零时变量
2.临时变量的分配原则
情况1:
FC1和FC2都是被OB1调用,处于同一等级,FC1执行完好,FC1原来使用的临时变量区域又被分配给FC2了,但这个区域并没有被清除,所以在FC2里得到了FC1里临时变量的值。
而FC3是被OB35调用,OB1和OB35不是同一个优先级别,它们分配的临时变量区域是独立的互不影响,所以FC3里的临时变量没有变化。
情况2:
版主笔误了,结果没写出来,应该是和情况1一样
区别在于有没有在Temp里定义临时变量,根据前面的测试,可以这样理解,直接在Temp里定义临时变量是显示定义,使用LW0这样相当于隐式定义。
情况3:
如果在FC1里再定义一个LW2,那么MW10又可以得到FC1里LW0的值了,经过多次测试发现,为FC分配临时变量区域,首先为块调用分配堆栈(V区属于块调用堆栈),调用FC至少分配一个字,调用FB分配3个字,然后分别本块里定义的L区变量(包含显式、隐式定义),最后分配下一级块的临时变量。
以下是FC1、FC2被OB1调用,FC2调用FC3的测试
当FC1分配的临时变量区域大于FC2分配的区域时,FC1使用过的临时变量区域除去重新分配给FC2剩下的就分配给了下一级的FC3了,这时FC3就有可能得到FC1里临时变量的值。
分析结果:
1.临时变量是谁的零时变量
临时变量最上层是属于OB组织块的,下层程序块根据调用结构分配
2.临时变量的分配原则
分配原则:首先为块调用分配块接口堆栈,然后从临时变量最高地址依次分配块里定义的临时变量,最后分配下一级的临时变量。
情况4:
FC1 :
临时变量定义
TEMP1:INT
TEMP2:INT
TEMP3:INT
L 1
T #TEMP1
L #TEMP3
T MW14
FC2 :
临时变量定义
TEMP1:INT
TEMP2:INT
TEMP3:INT
L 2
T #TEMP2
L #TEMP1
T MW10
FC3 :
临时变量定义
TEMP1:INT
TEMP2:INT
TEMP3:INT
L 3
T #TEMP3
L #TEMP2
T MW12
OB1:
CALL FC1
CALL FC2
CALL FC3
执行结果 MW10=1 MW12=2 MW14=3
情况5:
FC1 :
临时变量定义
TEMP1:INT
L 1
T #TEMP1
FC2 :
临时变量定义
TEMP1:INT
TEMP2:INT
L #TEMP2
T MW10
FC3 :
临时变量定义
TEMP1:INT
TEMP2:INT
TEMP3:INT
L #TEMP3
T MW12
OB1:
CALL FC1
CALL FC2
CALL FC3
执行结果 MW10=1 MW12=1
情况4应该没什么疑问吧,3个块的临时变量被重复使用了,区域长度相同应该很好理解。
情况5我在上面说了,为块分配临时变量区域是从最大地址先开始了,对照我上面的图片应该可以解释结果。
FC1使用过的临时变量区域,因为都没有块调用和其他接口,当调用FC2首先分配给最后一个字TEMP2,同样调用FC3时,FC2的最后临时变量TEMP2分配个FC3的最后的TEMP3。
这是论坛里以前的帖子里的内容,希望能对大家有用。