大家好,最近在学习SCL语言,新学的一个指令,感觉很实用,在这里跟大家聊一聊,可能大家在以后也可能用到,纯分享个人观点,不对的地方,欢迎留言区交流指正,感谢您的阅读.
一.POKE指令介绍:
POKE 是西门子S7-1200/1500的直接写入指令,可以绕过变量符号名,直接按「存储区类型 + 地址」写入数据.本质是按绝对地址向PLC的存储区写入数据(DB、M、I、Q等),属于“底层地址操作指令”.
POKE(
area := 16#84, // 存储区类型
dbNumber := 3, // DB块编号(仅DB区需要)
byteOffset := #I, // 字节偏移地址
value := BYTE#0 // 要写入的值
);
各个管脚的定义如下:
1. area :存储区类型代码
| 代码(area) | 对应存储区 | 说明 |
| 输入过程映像区(I) | 直接写物理输入,不建议使用 |
| 输出过程映像区(Q) | 直接写物理输出 |
| 位存储区(M) | 写入M区地址 |
| 数据块(DB) | 写入DB块,你程序里用的就是这个 |
| 定时器(T) | 写入定时器 |
| 计数器(C) | 写入计数器 |
2. dbNumber :DB块编号(仅DB区需要)
- 当 area=16#84 (DB区)时,这个参数必须填写目标DB块的编号。
- 比如 dbNumber := 3 ,就是指定写入 DB3 数据块。
- 其他存储区(如M、I、Q)使用时,这个参数可以省略或填0。
3. byteOffset :字节偏移地址
- 目标地址相对于存储区起始位置的字节偏移量。
- 程序里 byteOffset := #I ,这是可变变量,这里也可以直接写字节偏移的个数
- 注意:偏移量是字节为单位,和变量的数据类型无关。
4. value :要写入的值
- 支持的数据类型:Byte、Word、DWord、Int、DInt等。
- 写入长度由 value 的数据类型决定:
- BYTE#0 → 写入1个字节
- WORD#16#0000 → 写入2个字节
- DINT#0 → 写入4个字节
二.程序编写测试
1.打开博图软件,创建清零数据SCL项目
2.配置CPU1517 PLC,修改PLC属性中相关参数
3.程序块中添加全局DB数据块3,变量定义为ARRY[0..20]个字节.
3.程序块中添加数据清零块FB2,语言为SCL
4.定义背景接口信号INPUT定义清零开始,临时变量I 用于数据的偏移,如下图
5.插入一个上升沿指令,背景数据块选择多重实例.
6.插入IF指令,编写如下程序.
这段程序的核心作用是:
当「清零开始」信号产生上升沿时,用 POKE 指令,把 DB3数据块中从 DB3.DBB0 到 DB3.DBB14 共15个字节 全部清零(写0).
程序很简单,大家自己动手做一下试试,加深一下理解,个人觉得SCL语言不是很难,掌握关键的几个指令如IF/CASE/FOR/WHILE,还有几个常用指令用法就基本能写程序啦,大家有时间多练习练习,好了,今天就到这里,感谢您的阅读,喜欢的点个赞和关注.