quote:以下是引用我心依旧555在2012-02-25 18:29:56的发言:分配本地数据给优先级
本地数据堆栈中,并不是每个优先级都需要同样大小的存储空间。在STEP 7中,通过分配参数,可以为S7-400 CPU和CPU 318的各个优先级分配不同大小的本地数据区。任何不需要的优先级都可以将其取消。这样S7-400 CPU和CPU 318中其他优先级等级的存储器区便增大了。在程序执行期间,取消激活的OB将被忽略,以节省循环时间。
而对于其他的S7-300 CPU,每个优先级被分配了固定大小的本地数据(256个字节),不能对其修改。
-------------------------------------------------------------------------------------------------------------------------------------
从这段资料看来中断的确不会影响本地的临时变量,每个优先级是固定分配本地数据,意味着使用着不同的地址数据区。
但如果假如存在下面的调用结构以及程序不知道这样是否有影响
OB1---->FC1---->FC2(调用关系)
在FC1中未声明局部变量,而间接的寻址使用了
LAR1 P#L0.0
L10
T LW[AR1,P#0.0]
CALL FC2 //在FC2中定义了多个局部变量
L LW0 //这里还能得到了10这个值吗???
如果未声明而间接使用还会为其保留足够的空间吗???
下面帮助文档中的一句话似乎说需要在变量声明期间才会为其保留足够的存储空间:
[

如果在程序中使用了LW0,那么编译后就会为其保留存储空间,如果没有在Temp里定义而使用间接寻址那么就不行了,当然也可以在程序里调用一下LW0这样的和在Temp里定义一样可以保留存储空间。
基于上面的理论,你的问题里,LW0可以得到10这个值,因为你后面访问了LW0,如果你后面没有访问LW0且没在Temp里定义那么可能访问到FC2的临时变量(未经测试),如果没调用FC2则会访问出错,而FC2里的临时变量 则是在下一级。
____________________________________________________________________________
在PLCSIM里测试发现,在FC1里调用FC2系统会自动为FC1分配一个LW0,不能通过间接寻址访问到下一级FC2里的临时变量,如果FC2输入输出参数使用了DB块绝对地址引用,也就是存在V区,那么在FC1里通过间接寻址可访问到V区,FC2里V区也就是FC1里L区域的后部,如果FC1里没定义临时变量,FC2里第一个输入参数使用DB块绝对地址引用,那么在FC2里查看第一个参数的地址将会看到是V1.0,如果在FC1里使用
L P#0.0
LAR1
L LW[AR1,P#1.0] //这里就访问到FC2里V1.0上一个周期留存的数据了
可能系统块调用分配的这个LW0是作为块调用使用的,后8位可以被下一层程序V区使用。
所以使用临时变量不要未经直接或间接定义区域,不要使用间接寻址访问。