1、S7-1200的间接寻址需要通过数据块中的数组来实现。指令 FieldRead通过索引(又称为下标)变量从数组中读取数值,指令 FieldWrite 通过索引变量向数组中写数值,使用这两条指令可以实现间接寻址。索引变量是间接寻址中的地址指针,它的值是要读写的数组元素的索引值。地址指针就像收音机调台的指针,改变指针的位置,指针指向不同电台。改变地址指针中的索引值,指针“指向”数组不同的元素。间接寻址的优点是可以在程序处理期间,通过改变指针的值动态地修改指令中的地址。首先生成一个名为“数据块 1”的全局数据块 DB2,在数据块中生成名为“数组1”的数组 Array110 of Int,其元素的数据
2、类型为 Int。这两条指令没有列入指令列表和高级指令列表,编程时将收藏夹中的空逻辑框插入程序,点击其中红色的“?”,打开下拉式列表框,可以看到列表框底部的指令 FieldWrite或 FieldRead。点击生成的指令框中的“?”,用列表设置要写入或读取的数据类型为 Int(见下图)。两条指令的参数 MEMBER的实参必须是数组的第一个元素“数据块 1”.数组 11。指令的输入参数索引值“INDEX”是要读写的数组中的元素的下标,数据类型为DINT(双整数)。参数“VALUE”是要写入数组元素的值或要读取的数组元素的值。下图中的 FieldWrite指令将常数 25写入数组 1中的元素“数组
3、13”。FieldRead指令读取数组元素“数组 13”的值,将它保存到 MW20。改变INDEX的值,可以读写别的数组元素的值。循环程序用来完成大量的重复的操作。S7-1200 没有像 S7-300 的 LOOP 那样的循环程序专用的指令,为了编写循环程序,可以用 FieldRead 指令实现间接寻址,用普通指令来编写循环程序。生成一个名为“循环程序”的项目。首先生成全局数据块 DB1,在 DB1 中生成有 10 个字节元素的数组,设置各数组元素的初始值。生成一个功能块 FB1,定义它的输入参数 “字节数”(Int) 、“初始下标”(Dint) 、“数组”(Array)和输出参数“异或结果”
4、(Byte) 。在 FB1 的程序段 1 用 MOVE 指令将 “异或结果”清零( 见图 1)。程序段 2 的跳转标签 Back 表示循环的开始。指令 FieldRead 用来实现间接寻址,其参数 INDEX 是要读写的数组元素的下标,其数据类型为 DInt(双整数) 。参数 MEMBER 的实参必须是该数组的第一个元素,参数 VALUE 是读取的数组元素的值。读取数组元素值后,将它与输出变量“异或结果”作异或运算,将地址指针“起始下标”加 1,它指向下一个数组元素。将作为循环次数计数器的输入变量“字节数”减 1。减 1 后如果非 0 则返回标签 Back 处,开始下一次循环的操作。图 1在 OB1 中调用 FB1(见图 2),求 DB1 中的数组 1 从下标为 2 的元素开始的 3 个数组元素的异或值,异或的结果用 MB4 保存。将程序下载到 CPU,将 CPU 切换到 RUN 模式。搬动 I0.2 对应的小开关,在 I0.2 的上升沿调用 FB1。用监视表监视 MB4 中的运算结果,验证了程序的正确性。