在S7-1200的tep7 V11的编程中,有3种方法实现间接寻址,分别是FieldRead / FieldWrite(适用于LAD编程)以及PEEK / POKE指令(适用于SCL编程),另有直接对数组下标变址寻址的间接寻址指令(适用于LAD/SCL编程)。
1) FieldRead及FieldWrite指令
此指令适用于LAD编程,且需预先定义数组,其通过改变数组下标实现读取或写入不同数组元素,从而实现间接寻址,例子下图所示。
先在DB1中建立1个Bool型数组arrayBool1[0..15] of Bool,即此数组中元素为Bool型,下标从0开始,共16个元素。

说明:1.1 可用于间接寻址的变量类型很多,可通过图中“FiledRead”处下拉框选择,未选择前此处显示“???”,选择后即为待读取的数组中元素类型,如上图,数组arrayBool1中元素类型为Bool;
1.2 输入“INDEX”为待读取的数组的下标,注意其可为常数或变量,若为变量,则该变量须为Dint型,否则会编译出错;
1.3 输入“MEMBER”为待读取数组的第1个元素,如数组下标从0开始,则此处须为arrayBool1[0],如若数组下标从-2开始,则此处须为arrayBool1[-2],否则会编译出错;
1.4 输出“VALUE”为读出数组中规定元素值后传送至此,即将此值写入VALUE中,此处要求其数据类型与读取的数组元素类型一致;
1.5 FieldWrite指令与此类似,为将VALUE值写入数组MEMBER[INDEX]中。
总结:FieldRead及FieldWrite需要配合数组进行操作以实现间接寻址,此指令在SCL编程时直接用数组下标来取值,如下所述。
2) SCL/LAD中MEMBER[INDEX]语句
在SCL或LAD编程时,可直接采用MEMBER[INDEX]语句,表示数组MEMBER的第INDEX个元素,实现简化间接寻址,如下两图所示,分别为SCL及LAD编程时采用数组下标间接寻址。

说明:2.1 #wordWelderDnSignalMap为FC的Output参数,#wordTemp为FC的word型Temp参数, atTemp1为其变量覆盖(以Bool型数组覆盖),wordWelderDnSignal为FC的In参数;
2.2 下标index类型不限于Dint(LAD中需指定为Dint),此例中index类型为int;
2.3 可传送多种类型,只要保持数组中元素数据类型与待赋值变量数据类型一致即可。

如上图,利用MOVE指令传送数组元素。
3) PEEK / POKE指令(适用于SCL)
以上间接寻址均需要数组参与,如果想对非数组变量(如I,Q,M区的位,字节,字及双字变量)进行间接寻址,需使用PEEK及POKE指令。
3.1 PEEK指令
PEEK指令共有对Bool操作的PEEK_BOOL指令,对Byte操作的PEEK指令(默认),对字操作的 PEEK_WORD指令及对双字操作的PEEK_DWORD指令;
PEEK_BOOL指令有4个参数,其它PEEK指令参数为3个,如下图所示。

PEEK_BOOL指令参数说明如下:
area:定义读取数据存储区。16#81为I区,16#82为Q区,16#83为M区,16#84为DB区
dbNumber:定义DB编号,或area参数不为16#84,此值必须为0
byteOffset:定义欲读取的字节编号
bitOffset:定义欲读取的位编号
指令返回值:读取相应类型数据的结果
相对于PEEK_BOOL,其它PEEK指令除没有bitOffset参数外,余参数含义皆一致。

说明:第1条指令将M5.2数据写入数组变量arrayWelderInterlockStatus第1个元素中,数据为Bool型
第2条指令将MB4数据写入变量wordWelderInterlockStatus中,数据为Byte型
3.2 POKE指令
POKE指令共有3个:对Bool类型数据操作的POKE_BOOL指令;对字节,字及双字操作的POKE指令,以及对字节,字及双字批量写入的POKE_BLK指令。

POKE指令参数含义如下:
area:area:定义待写入数据存储区。16#81为I区,16#82为Q区,16#83为M区,16#84为DB区
dbNumber:定义DB编号,或area参数不为16#84,此值必须为0
byteOffset:定义待写入的字节编号
value:待写入数值
POKE_BOOL指令参数含义如下:
bitOffset:定义待写入的位编号
其它参数与POKE参数含义相同。
POKE_BLK指令参数含义如下:
area_src:源数据格式,16#81为I区,16#82为Q区,16#83为M区,16#84为DB区
dbNumber_src:定义源数据区DB编号,若源数据为DB区,则此值为0
byteOffset_src:定义源数据区字节编号
area_dest:目标数据格式,16#81为I区,16#82为Q区,16#83为M区,16#84为DB区
dbNumber_dest:定义目标数据区DB编号,若目标数据为DB区,则此值为0
byteOffset_dest:定义目标数据区字节编号
count:定义需传送的字节数
POKE指令一般不需返回值,如果有,只是作为指令是否执行成功标志。
以下为各POKE指令在SCL中应用。