background image

从临时变量的

先赋值后使用谈起

 

熟练使用临时变量或者说局部变量,可以给我们编程带来方便。在论坛里也经常看到有些
朋友提了一些关于临时变量的问题,大家在回答的同时会提示

“要先赋值后使用”。这样确

实可以保证我们的编程不会出现错误,但是我们也需要了解为什么。
 局部变量可以定义为: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
 //