从临时变量的“先赋值后使用”谈起 点击:1310 | 回复:1



PLC酷客

    
  • [版主]
  • 精华:9帖
  • 求助:31帖
  • 帖子:1460帖 | 7990回
  • 年度积分:457
  • 历史总积分:59176
  • 注册:2004年7月13日
发表于:2013-07-17 19:25:27
楼主

从临时变量的“先赋值后使用”谈起

 

熟练使用临时变量或者说局部变量,可以给我们编程带来方便。在论坛里也经常看到有些朋友提了一些关于临时变量的问题,大家在回答的同时会提示“要先赋值后使用”。这样确实可以保证我们的编程不会出现错误,但是我们也需要了解为什么。
 局部变量可以定义为:IN、IN/OUT、OUT和TEMP四类,再加上无符号裸奔的L**,可以有5种存在形式。
 其中,IN和IN/OUT在子程序调用之初需要从外部获得输入,数据流向是向内,其实就相当于一个初始赋值的过程;OUT虽然连接外部变量,但是数据流向是向外,因此没有初始化。TEMP和裸奔的L**其实可以算作一类,它们通常在子程序中起到在IN和OUT间传递数据的作用。
 可能会有人觉得临时变量在子程序调用完毕后会自动清零,这种印象是错误的。
 子程序中的OUT和TEMP类型临时变量会继承与其同级的前一个子程序中最后的值。这听起来有些拗口,简单可以理解为临时变量的数据都是可传递的,但是由于IN和IN/OUT天然的具备初始化,而其他类型没有,这种差异会造成使用中的错误。
 这里不得不提到子程序的嵌套。
 也许有人说了,我没有初始化,也用了上面说的temp和OUT类型,但是没有出错啊。如果这样的话,你很大可能是嵌套使用了子程序,而不是上面说的“同级调用”。
 200PLC支持最多8层子程序嵌套,这些子程序里面都使用了L变量,但是互不影响,这是因为PLC在处理嵌套的子程序中的L时,对L进行堆栈处理。也可以理解为虽然在两个有嵌套关系的子程序中都使用了LW0,但是他们的数据实际是被放在了不同的存储位置。
 下面贴一小段测试程序,有兴趣的可以运行一下看看结果。
 主程序
 LD     SM0.1
 CALL   SBR_0:SBR0
 CALL   SBR_1:SBR1, VW100, VW200, VW300
 子程序0
 LD     SM0.0
 MOVW   111, LW0
 MOVW   333, LW6
 MOVW   555, LW10
 CALL   SBR_2:SBR2, VW400
 子程序1
 //变量定义
 LW0   testout      OUT   WORD
 LW2   test1        OUT   WORD
 LW4   test2        OUT   WORD
 LW6   testtemp     TEMP  WORD
 //
 LD     SM0.0
 MOVW   #testtemp:LW6, #test1:LW2
 
 MOVW   LW10, #test2:LW4
 子程序2
 //变量定义
 LW0    tt          OUT   WORD
 //
 LD     SM0.0
 MOVW   3, LW6
 MOVW   5, LW10
 以上是个人的一些理解,希望可以对初学者有点帮助。有理解错误的地方也请指出。
 下面是官网上一些关于临时变量的解释,大家可以看看:
 http://support.automation.siemens.com/CN/llisapi.dll?func=cslib.csinfo&lang=zh&siteid=cseus&aktprim=0&extranet=standard&viewreg=CN&objid=10805397&treeLang=zh
 个人觉得做好初始化,可以不必像官网里说的把原来的OUT型改用IN/OUT。 

 



楼主最近还看过



fyc871356965

  • 精华:1帖
  • 求助:3帖
  • 帖子:14帖 | 1802回
  • 年度积分:0
  • 历史总积分:2312
  • 注册:2012年1月09日
发表于:2013-07-17 20:19:29
1楼

太好了,感谢楼主的分享,让我们这些初学者可以更多的理解


热门招聘
相关主题

官方公众号

智造工程师