在SCL语言编程的时候,有两个特别有意思的指令,即读取存储地址和写入存储地址指令,梯形图中貌似没有的。标准地说是两类而不是两个,因为读和写都不止一个指令。先了解这两类指令的基本说明和用法,本篇后面的示例用几行代码就能代替几十(甚至几百)行梯形图,完全验证了西门子SCL语言编程—变量中所说的在数据处理、过程优化、统计运算等方面要优于其它几种编程语言。S7-1200/1500间接寻址常常用到这两个指令。
(一)、PEEK指令用于在指定数据类型的情况下从标准存储区读取存储地址。
在编辑区直接输入“PEEK_”时弹出如下选择:
有BOOL、BYTE、WORD、DWORD、LWORD几种选择,默认为BYTE,可以不写。
PEEK指令参数介绍:
1、area 字节型数据(BYTE),用来指定读取存储区类型,可以选择的存储区有:
- 16#81:Input(I)
- 16#82:Output(Q)
- 16#83:位存储区(M)
- 16#84:DB
- 16#1:外设输入(PI,仅 S7-1500)
2、dbNumber:DInt型数据,读取的存储区编号。如果要读取输入、输出或位存储区中的存储地址,则必须将参数 dbNumber 的值设置为“0”,否则指令将无效。
3、byteOffset:DInt型数据,用来指定读取数据的地址偏移量。
(二)、POKE指令用于在不指定数据类型的情况下将存储地址写入标准存储区。
POKE指令添加到程序中的初始状态:
1、area:Byte型数据,用来指定写入存储区的类型。存储区选择与PEEK指令area参数相同。
2、dbNumber:DInt型数据,用来指定写入数据块的编号,仅在写入数据块时使用;写入其它存储区时设置为0;
3、byteOffse:DInt型数据,用来指定写入数据的地址偏移量
4、value:可以为Byte型、Int型、DInt型数据,用来表示要写入的数据值及类型。必须为变量,不能为常量。POKE指令根据value的数据类型来决定写入多少个字节。
指令介绍再详细也不如实例那样容易让初学者立刻理解弄懂,况且博途的在线帮助功能还是很完善的,所以下面直接来点干货。
IO映射实例:
本例中,本地CPU为 1516-3 PN/DP,分布式I/O为IM155-5 PN ST,本地DI为16路输入共5个模块,地址分配0到9,分布式I/O也是5个16路输入模块,地址分配58到67,见下图:
为了节约篇幅,分布式I/O截图省略,下面是映射子程序部分截图,
全局数据块MappingDada_DI是间接寻址所用数据块,命名方式与DI模块IO地址相似,见下图:
这个实例是实际工程应用,输出映射同样的道理。