在工业控制中,经常会使用到变址运算的功能。那在S7-1200中,我们需要怎么实现变址的效果呢?PEEK/POKE指令为我们提供了一个实现方法。
让我们先认识一下PEEK/POKE指令吧。
在S7-1200里面,PEEK/POKE指令仅在SCL中可用。指令位于“基本指令”--“移动操作”--“读/写存储器”中。如“图1”所示。
图1 PEEK/POKE指令位置
PEEK:读取存储地址,可读取Byte、Word、Dword类型的数据寄存器;
PEEK_BOOL:读取位存储地址,可读取Bool类型的数据寄存器;
指令格式如下:
#Peeker := PEEK(AREA := 16#84,
DBNUMBER:= 1,
BYTEOFFSET:= 2);
#Peeker_BOOL := PEEK_BOOL(AREA := 16#84,
DBNUMBER := 1,
BYTEOFFSET :=2,
BITOFFSET := 1);
其中#Peeker、#Peeker_BOOL为PEEK指令读取返回出来的寄存器值。
AREA为读取的寄存器区域:16#81对应输入I区;16#82对应输出Q区;16#83对应位存储区M区;16#84对应数据块DB区。
DBNUMBER为读取的数据块DB编号。当AREA为“16#84”时,如读取“DB10”,则“DBNUMER”为10。如果AREA不是“16#84”,则DBNUMER应设为“0”。
BYTEOFFSET为字节偏移量,决定读取寄存器的起始地址。如读取DB10.DBD56,则BYTEOFFSET为“56”。
BITOFFSET为位偏移量,PEEK_BOOL指令中需要填写。如读取DB1.DBX5.3,则BYTEOFFSET为“5”,BITOFFSET为“3”。
POKE(AREA := 16#84,
DBNUMBER:= 1,
BYTEOFFSET:= 2,
VALUE:= BYTE#7);
POKE(AREA := 16#84,
DBNUMBER:= 1,
BYTEOFFSET:= 2,
BITOFFSET:= 4,
VALUE:= TRUE);
其中AREA、DBNUMBER、BYTEOFFSET、BITOFFSET这些引脚和PEEK指令是一致的。VALUE为写入到寄存器中的值。
下面我们以一个案例来讲解PEEK和POKE的使用吧。
例程1:求和DB1数据块中,从DB1.DBW0~DB1.DBW18十个字的数据之和。
首先,我们新建一个DB1,并在DB1里添加10个INT变量,如图2所示。由于PEEK需要指向juedui地址,因此需要将DB块属性中的“优化的块访问”取消。
图2 数据块DB1内容
然后,我们新建一个FC功能,来编写求和程序,求和程序代码如下图所示。
图3 PEEK求和程序代码
Zui后,运行看看我们的结果吧。
图4 PEEK求和程序运行
例程2:将M0.5~M1.2六个位地址值传送至DB2.DBX0.0~DB2.DBX0.5中;
同例1一样方法新建DB2。
新建一个FC功能,编写程序,程序代码如下图所示。
图5 PEEK/POKE数据批量传送程序
程序运行结果如下:
图6 PEEK/POKE数据批量传送运行结果