回复:关于局部变量存储器的理解

醉书生

  • 帖子

    725
  • 精华

    25
  • 被关注

    16

论坛等级:侠士

注册时间:2004-06-13

普通 普通 如何晋级?

发布于 2011-01-04 16:43:49

39楼

局部变量就是一块由系统管理的普通内存(我们暂且称它为H内存),系统程序会为每次子程序调用在H内存中“随机”分配64字节供当前调用的子程序以L名字使用(由此可见L实际上是以指针访问的,所以L内存的速度非常慢,特别是作为位变量访问时)。
每次进入子程序,这64字节的初始化是“不定”的,必须满足先赋值后使用的原则,赋值后的L变量只在当前扫描周期的子程序内部有效,退出子程序后失效。

任何其它通过实验得出来的结论都是不可靠的,而且做这种实验也是完全没有意义的。因为这个跟PLC设计时的内存管理策略有关,在今天这台PLC上得出的结论由内存管理策略决定可能是偶然的,即使今天肯定的,明天PLC版本升级了也许就是错误的。所以这种针对个体得出来的结论没有任何意义。

争论的原因实际上就是L的初值问题,这有几个影响因素:
一是PLC是否会主动初始化所分配的64字节,一般来说是不会的,因为会严重影响内存管理效率而实际上也没有必要。即使设计时主动初始化了,那么可能用0,可能用FF或其它任意值,因此,对用户来说,它仍然是不定的。
二、从H中分配L的策略,我们退出子程序时,L所赋的值“失效”了,并不是说程序会将这个值清掉(同样出于效率的原因不可能这样做),实际上那个值仍然保存在H内存中,但我们下次进入同一子程序时,所分配的L并不一定是H中上次所分配的那一块(当然也有可能是),所以子程序下次使用LB0时,跟上一次所使用的LB0对应的不一定是原来的那个HBx,这也是初值“不定”的原因。
三、同一扫描周期被调用一两个不同子程序,前一个子程序退出后,第二个子程序所分配的L内存在H中对应的正好是为前一个子程序所分配的内存块(是否会出现这种情况取决于PLC本身的设计),所以有可能出现通过L内存在两个子程序中传递值的现象,但是这是不个利用的特性。
生命存在的方式只有两种:腐烂或燃烧
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33126条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

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