回复:请教L区的问题

mkas

  • 帖子

    125
  • 精华

    2
  • 被关注

    12

论坛等级:侠士

注册时间:2013-08-04

普通 普通 如何晋级?

发布于 2014-04-18 10:34:29

15楼

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。
这是论坛里以前的帖子里的内容,希望能对大家有用。
好好学习,天天向上
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54617条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。