找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 PLC学习 查看内容

PLC指针类型与间接寻址

2022-9-18 11:04| 发布者: gk-auto| 查看: 779| 评论: 0

摘要: 在西门子S7-300和S7-400的编程中经常需要调用一些系统功能或功能块,在输入参数时经常碰到有指针类型的参数,那么你对指针类型了解吗?我第一次接触指针一词是在学习C语言的时候,指针和链表是C语言中的一个重点难点 ...

在西门子S7-300和S7-400的编程中经常需要调用一些系统功能或功能块,在输入参数时经常碰到有指针类型的参数,那么你对指针类型了解吗?我第一次接触指针一词是在学习C语言的时候,指针和链表是C语言中的一个重点难点。在C语言中,指针即存储器地址,在西门子PLC中的指针也是指地址。


下面看看西门子POINTER类型的结构:

参数类型POINTER存储下列信息:

· DB编号(或0,如果数据没有存储在DB中)

· CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)

十六进制代码

存储区

描述

b#16#81

I

输入区域

b#16#82

Q

输出区域

b#16#83

M

位存储区域

b#16#84

DB

数据块

b#16#85

DI

背景数据块

b#16#86

L

本地的数据(L堆栈)

b#16#87

V

先前的本地数据


数据的地址(格式为字节.位)

STEP 7提供指针格式:p#memory_area byte.bit_address. (如果形式参数被声明为参数类型POINTER,只需要指出存储区域和地址。STEP 7将自动地重定输入指针的格式。) 下面的实例说明如何为以M50.0开始的数据输入参数类型POINTER:P#M50.0


存储器间接寻址:

使用存储器间接寻址的程序语句包含一条指令,后面跟有[地址]标识符,最后是一个(地址必须括在方括号内)。根据所用的地址标识符,该指令会将存储于指定地址的数据解释为字或双字指针。完整的数据地址由地址标识符和指针构成,如下例所示。间接寻址的优点是能在程序执行期间动态修改指令的数据地址。


存储器间接寻址使用以下两部分地址:

1. 地址标识符

对于由位逻辑运算寻址的位,可分配地址标识符I、Q、M、L、DIX或DBX。

对于由装载指令寻址的字节、字和双字,可使用存储区I、Q、M、L、D和PI,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID等形式的地址标识符。

 对于由传送指令寻址的字节、字和双字,可使用存储区I、Q、M、L、DB、DI和PQ,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PQB、PQW、PQD等形式的地址标识符。

要寻址定时器、计数器或块,可使用T、C、DB、DI、FB、FC形式的区域标识符。


2. 括在方括号"[ ]"内的字或双字指针的地址

字指针 - 含有定时器(T)、计数器(C)、数据块(DB、DI)或逻辑块(FC、FB)的标识号的字。字指针是十进制整数。

双字指针 - 指含有位、字节、字或双字的确切位置的双字。双字指针的格式为:P#字节.位。指针必须存储在下列区域之一,才能进行存储器间接寻址:

M - 位存储器

L  - 本地数据

D - 数据块(DB或DI)

STAT  静态数据(不是用于具有多重实例能力的块的静态数据)

注意如果要寻址使用存储器间接寻址的字节、字或双字,请确保指针的位号为双字格式0。


字指针实例:

L 5 //将指针值载入ACCU 1。T MW2 //将指针传送到MW2中。

L T[MW2] //将5号定时器的当前时间值载入ACCU 1。

L C[MW2] //将5号计数器的当前计数值载入ACCU 1。

OPN DB[MW2] //将数据块DB5作为共享数据块打开。

OPN DI[MW2] //将数据块DB5作为背景数据块打开。


双字指针实例:

L P#8.7 //将指针值载入ACCU 1。T MD2 //将指针传送到MD2中。A I [MD2] //扫描输入位8.7的状态,并将其= Q [MD2] //信号状态分配给输出位Q 8.7。


区域内寄存器间接寻址:

使用区域内寄存器间接寻址的程序语句包含一条指令和以下组成部分:地址标识符[地址寄存器标识符,地址]。区域内寄存器间接寻址使用以下两部分地址:

关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 06:39 , Processed in 0.069355 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.