quote:以下是引用LionAL99在2013-11-03 17:35:04的发言:从S7-300/400转到S7-1200时,很多人都会觉得间接寻址没有S7-300下STL编程时方便,因为S7-1200间接寻址是基于数组进行操作的(PEEK及POKE指令除外,关于S7-1200间接寻址下一篇进行说明)。
其实S7-1200提供了变量覆盖及变量部分引用(Slice引用)这一利器,使其在进行间接寻址时一点也不比S7-300差,特别是在SCL编程模式下更便利。
先看一下”变量覆盖“定义,Step 7 V12.0系统手册第2048页说明如下:“要访问声明变量内的数据区域,则可以通过附加声明来覆盖所声明的变量。 这样,可以选择对不同数据类型的已声明变量进行寻址。 例如,可以使用 BOOL 的 ARRAY 对 WORD数据类型变量的各个位寻址”。
简而言之,比如定义了一个word变量(假设变量名为wordTag1),然后对此变量进行覆盖,覆盖类型为Bool类型的数组,数组下标为0~15(假设覆盖变量名为atwordTag1,类型为Array[0..15] of Bool),则可使用该数组配合下标对该word变量的不同位进行间接寻址,如atwordTag1[i],当i=3时表示wordTag1的第3位,改变i的值即可对wordTag1不同位进行寻址。
S7-1200中,能够进行变量覆盖的块是FB或FC,但是有一些限制条件:
1)对于FC,必须设置属性为“标准块访问”,因创建FC时其默认访问属性为“优化的块访问”,必须更改访问属性并重新编译方可;
2)FC中只有Temp区变量可设置为结构化变量覆盖,即对基本型变量设置array或struct型覆盖变量(如上例中所示),对In,Out及InOut区基本型变量只能设置基本型覆盖变量,且长度要一致,实用意义不大;
3)对于FB,属性为“标准访问”或“优化访问”下均可进行变量覆盖,但有区别:标准访问下,可对所有接口参数区进行变量覆盖,只是InOut区对基本型变量只能设置基本型覆盖变量(但与FC下不同,其长度不必要求相同);在优化访问下,如果要对变量进行覆盖,必须将其保持性设置为“在IDB中设置”,这意味着Temp区变量将不能设置覆盖,其它与“标准访问”下无区别。
Step 7 V12中允许在创建块后对其访问属性进行更改,这意味着编程时不必纠结于块的访问属性,初始化设置为“优化访问”以节约资源,当需要进行变量覆盖时再变更其访问属性即可。
特别需要注意的是在FC中对In,Out及InOut区设置变量覆盖,以及对FB中InOut区设置变量覆盖时,只能使用基本型变量对基本型变量进行覆盖,否则编译时会出错,如下图所示,尽管书写程序时并无报警。

V11起直接支持字节位寻址。比如定义一个状态字STW 为一个word.你梯形图中直接可以这样访问,STW.0,STW.1,STW.2...STW15,不需要覆盖