从临时变量的“先赋值后使用”谈起
熟练使用临时变量或者说局部变量,可以给我们编程带来方便。在论坛里也经常看到有些朋友提了一些关于临时变量的问题,大家在回答的同时会提示“要先赋值后使用”。这样确实可以保证我们的编程不会出现错误,但是我们也需要了解为什么。
局部变量可以定义为: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。
楼主最近还看过