S7-1200 系列 PLC 中 SCL 语言的 PEEK 和 POKE 指令使用详解

一、指令适用条件与生成环境

使用S7-1200 SCL 编程语言的 PEEK 和 POKE 指令,可以实现对 I/O、M 存储器和数据块的读取或写入。 而通过 POKE_BLK 指令,还可以实现数据区域的复制或移动。

适用条件

  • 仅用于 SCL 编程语言。
  • 软件需从 TIA PORTAL V11 SP2 起。
  • S7-1200 CPU 固件从 V2.2 起。
  • 适用操作数为 I、Q、M、DB,且 DB 必须是非优化访问的块。

本文生成环境:

  • 硬件: CPU1214C V4.4
  • 软件:Windows 10 Pro 1903和 TIA PORTAL 专业版 V16

二、项目生成与指令位置

(一)创建 S7-1200 项目文件

在 TIA PORTAL 中创建新项目,双击 "添加新设备",在项目中添加 S7-1200 PLC_1,选择 CPU 1214C DC/DC/DC。

在TIA PORTAL 创建新项目,双击"添加新设备"在项目中添加 S7-1200 PLC_1,CPU 1214C DC/DC/DC。

图1 添加新设备

(二)添加 SCL 逻辑块

展开 PLC_1,双击 "程序块" 中的 "添加新块",选择语言 "SCL",添加 FC 块,名称为 FC1。

(三)添加 PEEK、POKE 指令

双击 FC1 打开 SCL 逻辑块,将指令的 "基本指令> 移动操作 > 读写存储器" 中的 PEEK、POKE 指令拖入程序编辑区。

三、PEEK 指令

(一)指令格式

PEEK 指令用于读取输入(I)、输出(Q)、存储器(M)或数据块(DB)变量,支持位、字节、字、双字操作,且将获取的数据值以返回值的方式赋值给对应的变量。

  • PEEK_BOOL:读位变量。
  • PEEK (_BYTE):读字节变量,其中 BYTE 类型可省略。
  • PEEK_WORD:读字变量。
  • PEEK_DWORD:读双字变量。

PEEK_BOOL,读位变量。

PEEK (_BYTE) ,读字节变量。

PEEK_WORD,读字变量。

PEEK_DWORD,读双字变量。

需要注意的是,在指令列表中只有 PEEK 和 PEEK_BOOL 两个指令,PEEK 相当于 PEEK_BYTE,当需要使用 PEEK_WORD 或者 PEEK_DWORD 时,可以在将指令拖拽到程序编辑区后手动添加后缀,或者在程序中直接输入指令然后通过选择的方式选定。

参数area,根据数据所在区域的不同有四种取值。

|-------|----|-------|
| area值 | 类型 | 说明 |
| 16#81 | I | 输入区变量 |
| 16#82 | Q | 输出区变量 |
| 16#83 | M | M区变量 |
| 16#84 | DB | 数据块变量 |

(二)示例程序

  1. PEEK_BOOL 指令:将 M0.1 的状态值读取到 M0.7。
  2. PEEK (_BYTE) 指令:将 IB20 的值读取到 DB1 的 Byte 类型变量。
  3. PEEK_WORD 指令:在 FC2 中,将 QW30 的值读取到 DB1 的 Word 类型变量。
  4. PEEK_DWORD 指令:在 FC3 中,将变量 DB2.DBD0 的值读取到 DB1 的 DWord 类型变量。

PEEK_BOOL 指令:将 M0.1 的状态值读取到 M0.7。

PEEK (_BYTE) 指令:将 IB20 的值读取到 DB1 的 Byte 类型变量。

PEEK_WORD 指令:在 FC2 中,将 QW30 的值读取到 DB1 的 Word 类型变量。

PEEK_DWORD 指令:在 FC3 中,将变量 DB2.DBD0 的值读取到 DB1 的 DWord 类型变量。

(三)应用案例

将 CPU1214C 本体的起始地址 I0.0 的 14 个 I 点的值,分别送入 DB1 的 14 个 Bool 的数组的每一个元素。通过分析对应关系可知,字节地址是下标整除 8 的商,位地址是下标整除 8 的余数。利用 FOR 循环可快速实现逐个位的赋值。

  • I0.0 -- > 元素0
  • I0.1 -- > 元素1
  • I0.7 -- > 元素7
  • I1.0 -- > 元素8
  • I1.1 -- > 元素9
  • I1.5 -- > 元素13

通过上述对应关系,可以发现规律,数组元素下标从0开始逐个加1,对应的I点输入地址的位变量是从0到7再往复,而字节地址是先是8个0,然后是1,所以总结是字节地址是下标整除8的商,位地址是下标整除8的余数,换成编程语言就是字节地址是下标/8,位地址是下标MOD8。然后就可以利用FOR循环来快速实现逐个位的赋值,如图13所示。结果如图所示。

四、POKE 写指令

(一)指令格式

POKE 指令可以对输入(I,一般不使用)、输出(Q)、存储器(M)或数据块(DB)变量地址进行写操作,支持位、字节、字、双字操作,还可以进行区域操作,实现区域数据移动,可在指令体内将结果传递给对应变量。

POKE 位操作:

POKE 指令没有 POKE_BYTE、POKE_WORD、POKE_DWORD 指令,实现写入字节、字、双字取决于待写入的变量 value 的数据类型。

POKE 字节、字、双字操作:

说明:POKE指令和PEEK指令不同,没有POKE_BYTE、POKE_WORD、POKE_DWORD指令,实现写入字节、字、双字,取决于待写入的变量value的数据类型,如图所示,不同的数据类型写入的结果不同。

POKE_BLK 指令可将源数据块、I/O 或存储区从 byteOffset 开始的 "count" 个字节,写入目标数据块、I/O 或存储区 byteOffset 开始的区域。

参数area,根据数据所在区域的不同有四种取值。

|-------|----|-------|
| area值 | 类型 | 说明 |
| 16#81 | I | 输入区变量 |
| 16#82 | Q | 输出区变量 |
| 16#83 | M | M区变量 |
| 16#84 | DB | 数据块变量 |

(二)示例程序

  1. POKE_BOOL 指令:将 M0.1 的状态值写入 Q0.7。
  2. POKE 指令:在 FC4 中,将 MW2 的值写入 DB2.DBW20。
  3. POKE_BLK 指令:在 FC5 中,将 DB2.DBB22 开始的 12 个字节的值写入 MB100 开始的地址。

POKE_BOOL 指令:将 M0.1 的状态值写入 Q0.7。

POKE 指令:在 FC4 中,将 MW2 的值写入 DB2.DBW20。

POKE_BLK 指令:在 FC5 中,将 DB2.DBB22 开始的 12 个字节的值写入 MB100 开始的地址。

五、常见问题

(一)如何使用 PEEK 指令将一个 Real 类型变量读取到另一个 Real 类型?

PEEK 指令不检查数据类型,直接读取可能会出现乱码。建议先将原始 Real 变量使用 PEEK 指令转换为 DWord 类型,然后使用 DWORD_TO_REAL 进行转换,可避免误差。

当输入一个浮点数,输出的浮点数是一个乱码似的数,需要使用DWORD_TO_REAL把该数进行转换,但是转换结果会产生一定的误差。

为了解决这个问题,可以先将原始Real变量使用PEEK指令转换为DWord类型,然后使用DWORD_TO_REAL,如图所示。

同样是输入1.2,输出也是1.2了。

所以建议使用第二种方法,也就是先将原始Real变量使用PEEK指令转换为DWord类型,然后使用DWORD_TO_REAL。

(二)如何使用 POKE 指令将一个 Real 类型变量写入到另一个 Real 类型?

直接写入可能会导致精度丢失或结果异常。建议先将原始 Real 类型使用 REAL_TO_DWORD 转换为 DWord 类型,然后使用 POKE 指令。

和问题1类似,因为POKE指令不检查数据类型,所以理论上可以输入一个Real类型变量的地址,返回一个Real类型,但是解决方法和第一个不太一样,如图24 所示。

当输入一个正数,输出的数是通过ROUND取证的一个DINT类型,需要再转换,并且精度丢失,而输入一个负数,输出正常,这种方法肯定是不可取的。

为了解决这个问题,可以先将原始Real类型使用REAL_TO_DWORD转换为DWord类型,然后使用POKE指令,如图所示。

通过以上对 PEEK 和 POKE 指令的详细介绍,相信大家对其在 S7-1200 系列 PLC 的 SCL 编程语言中的使用有了更清晰的认识,在实际应用中可以根据具体需求灵活运用这些指令。

相关推荐
不像程序员的程序媛14 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
Jane Chiu15 小时前
Oracle DBMS_REDEFINITION(在线重定义)
数据库·oracle·分区表
2601_9547064915 小时前
云手机 API 自动化实战:Python 批量控机、挂机脚本完整实现
python·智能手机·自动化
全栈前端老曹15 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
怕孤单的草丛16 小时前
缓存管理面临的主要问题
java·数据库·缓存
我会尽全力 乐观而坚强16 小时前
MySQL零基础入门(二)
数据库·mysql·adb
Asuicao17 小时前
centos7.9版本升级ssh OpenSSH 9.8p1 源码 OpenSSL 1.1.1w 源码包以及安装升级回滚文档
运维·ssh
耍酷的魔镜17 小时前
谈谈如何使用Netty开发实现高性能的RPC服务器
服务器·网络协议·rpc
kali-Myon17 小时前
某校园门禁系统高危 SQL 注入漏洞挖掘复盘
数据库·sql·安全·web安全