STEP7——POINTER指针详解
西门子PLC指针寻址教学

L 11 T MW 60
OPN DB[MW 60]
OPN DB 11
z 双字格式的32位指针(用于对I、Q、M...进行寻址)
L P#24.0 T MD 50
LI
W
[MD50]
L IW 24
存储 访问 区域 宽度
地址
SIMATIC S7
Siemens AG 2001. All rights reserved.
地址标识符
Bit 31=0: 内部区域 Bit 31=1: 交叉区域
字节地址(无符号整数)
位地址
z 地址标识符:
000 I/O
010 输出(PIQ) 100 DB寄存器中的数据 110 自有本地数据
001 输入(PII)
011 位(Bit)存储器 101 DB寄存器2中的数据(DI) 111 调用块的LD(本地数据)
本地数据堆栈
SIMATIC S7
Siemens AG 2001. All rights reserved.
Date: File:
2013-4-26 PRO2_04E.3
SITRAIN Training for
Automation and Drives
DB中地址标识符直接寻址
打开的数据块
在数据块中装载和传递
A DBX 0.0
从0字节的第0位开始扫描
L DB19.DBW4 从DB 19中装载数据字4
L “Values”.Number_1 符号访问变量
Number_1. DB19 具有变量名“Values”
A DB10.DBX4.7 从DB 10 的第4个字节的第7位开始扫描
SIMATIC S7
Siemens AG 2001. All rights reserved.
STEP 7 指针编程

A&D CS2 FA 崔坚
SIMATIC Technical Consulting 2007 8月
Page 14
A&D AS CS2 FA Systems Support
寻址方式
直接寻址
存储区地址指针
寄存器间接寻址
POINTER数据 类型指针
ANY数据类型 指针
FB块形参的 编程
32位内部区域指针使用示例
SIMATIC Technical Consulting 2007 8月
Page 13
A&D AS CS2 FA Systems Support
寻址方式
直接寻址
存储区地址指针
寄存器间接寻址
POINTER数据 类型指针
ANY数据类型 指针
FB块形参的 编程
32位内部区域指针
32位内部区域指针地址寻址表示格式为:地址存储器标识符 [地址寄存器,地址偏移常量],例如装载M存储器一个字节表 示为:
JC m1
A&D CS2 FA 崔坚
SIMATIC Technical Consulting 2007 8月
Page 9
A&D AS CS2 FA Systems Support
寻址方式
直接寻址
存存储储区区地地址址指指针针
寄存器间接寻址
POINTER数据 类型指针
ANY数据类型 指针
FB块形参的 编程
的倍数,,如果对相邻 两个双字操作,指针转换为整数值最小必须为32(指针为P#4.0)的
倍数,对字与双字指针 的要求主要防治数据间的冲突,例如DBW[MD2],MD2为16的倍数 时,按照DBW2、DBW4、DBW6寻址,如果为8的倍数,按照DBW1、 DBW2、DBW3寻址,地址间数据冲突。
STEP7 指针编程(崔坚(36))

32位交叉区域指针使用示例
使用交叉区域指针表示方法(例如装载M存储器一个字节)为:
寄存器间接寻址
LAR1 P#M 20.0
//将指针P#M20.0 装载到地址寄存器1中。
A [AR1,P#1.1] //M21.1“与”操作。
= Q 1.2
//如果M21.1为1,输出1.2为1。
L P#I 40.0
32位地址指针
地址寻址表示格式为: 地址存储器标识符[32位地址指针],例如指针存储于LD20中, 装载M存储器一个字节表示
存储区地址指针
32位地址指针也可以使用常数表示,例如装载32位指针常 数 L P# 40.3 (P=指针,字节地址=40,位地址=3)。32位地址 指针数据与双整数可以相互转换,由于指针指到一个位地 址上,每一个位地址加1,相应转换的整数值加1的倍数, 例如P#0.0转换双整数为L#0,P#0.1转换双整数为L#1,每一 个字节地址加1,相应转换的整数值加8的倍数,例如P#3.1 转换双整数为L#25.
//指针指向P#2.4,相当于L DBB2.4,CPU无法识别,将停机。
如果对相邻两个字节操作,指针转换为整数值最小必须为8(指针为 P#1.0)的倍数,如果对 相邻两个字操作,指针转换为整数值最小必须为16(指针为P#2.0)的 倍数,,如果对相邻
两个双字操作,指针转换为整数值最小必须为32(指针为P#4.0)的倍 数,对字与双字指针
寄存器间接寻址
地址寄存器AR1、AR2的限制
寄存器间接寻址
避免方法:
L #ARR_TEST[1]
//装载形参变量ARR_TEST[1 1
//打开OB1
LAR1 P#20.0
//将P#20.0装载到地址寄存器AR1
Step7-数据类型详细说明总结汇总

Step7-数据类型详细说明总结汇总STEP7中的基本数据类型⑴位(BOOL)位数据的数据类型为BOOL(布尔)型,在软件编程中BOOL 变量的值1和0常用英语词TURE(真)和FALSE(假)来表示,对应二进制数中的“1”和“0”,常用于开关量的逻辑运算,存储空间为1位。
⑵字节(BYTE)字节数据长度为8位,数据格式为B#16#,B代表BYTE,表示数据长度为一个字节(8位),#16#表示十六进制,取值范围为B#16#0~B#16#FF。
⑶字(WORD)字数据长度为16位,这种数据可采用4种方法进行描述。
二进制:二进制的格式为2#,如2#101,取值范围为2#0~2#1111_1111_1111_1111,书写时每4位可用下划线隔开,也可直接表示为2#111111111111。
十六进制:十六进制的格式为W#16#,W代表WORD,表示数据长度为16位,#16#表示十六进制,数据取值范围为W #16#0~W#16#FFFF。
BCD码:BCD码的格式为C#,取值范围为C#0~C#999。
BCD码是用4位二进制表示1位十进制数,4位二进制中的0000~1001组合分别表示十进制中的0~9,4位二进制中的1010~1111组合放弃不用。
BCD码的最高4位用来表示符号,十六位BCD码的取值范围为-999~+999。
在STEP7的数据格式中,BCD码的取值只取正值,与最高4位的符号无关。
无符号十进制数:无符号十进制数的格式为B#(×,×),取值范围为B#(0,0)~B#(255,255),无符号十进制数是用十进制的0~255对应二进制数中的0000_0000~1111_1111(8位),16位二进制数就需要两个0~255的数来表示,例如:B#(12,254)=2#0000_1100_1111_111012 254上面4种数据都是描述一个长度位16位的二进制数,无论你使用哪种方式都可以。
STEP7编址详解

完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A Q2.0其中的A是指令符,Q2.0是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区2.0:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗地址标识符例如:DBX200.0。
其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,像上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方括号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式有两大类型:存储器间接寻址和寄存器间接寻址。
step7地址详解

西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
【存储器间接寻址】
存储器间接寻址的地址给定格式是:地址标识符+指针。指针所指示存储单元中所包含的数值,就是地址的确切数值单元。
存储器间接寻址具有两个指针格式:单字和双字。
这样看来,间接寻址就是间接的给出指令的确切操作数。对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。程序语句中用方刮号 [ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。间接由此得名。
完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。由此我们可以得到,要描述一个地址,至少应该包含两个要素:
现在,我们来分析一下上述例子中的A I[MD104] 为什么最后是对I1.2进行与逻辑操作。
通过L L#+10 ,我们知道存放在MD104中的值应该是:
MD104:0000 0000 0000 0000 0000 0000 0000 1010
当是对P区域寻址时,AR=800xxxxx
当是对I区域寻址时,AR=810xxxxx
step7寻址方式

完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A Q2.0 其中的A是指令符,Q2.0是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区2.0:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:DBX200.0。
DB X 200 . 0 其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
指针(pointer)――C C 的精髓.

指针(pointer——C/C++的精髓!你不得不学好它!指针(pointer指针是一种数据类型,用于存放某个变量的地址值。
此时该指针被称为是指向该变量。
一个指针的类型决定于它所指向的变量的类型。
指针既可指向基本数据类型(即预定义数据类型),又可指向数组、函数、类和文件等用户自定义数据类型。
指针可以初始化为0、NULL(即0,这是标准库头文件中定义的符号化常量)或一个地址。
内容为0或NULL的指针不指向任何变量,称为空指针。
例如:int a;int *ptr;指针ptr在下式中被初始化为指向变量a。
ptr = &a;两条语句也可组合地表示为:a = *ptr;其中&为存地址运算符,而*则为取内容运算符。
int a, *ptr;ptr = &a;指针与数组数组名是一个指向该数组的常量指针(其值不能改变),也是该数组中首单元的地址值。
一维数组的指针如下:int arr[5] = { 1, 3, 5, 7, 9 };int *ptra;ptra = arr;数组指针与数组名两者的异同:(1)整型变量指针ptr与整型数组指针ptra的说明格式相同,其间空格可放可不放。
(2)arr既是数组名,又是数组地址,还是数组指针(称为常量指针),三位一体。
因此arr可在一定范围内与ptra等效地使用。
[ ]可在一定范围内与 * 等效地使用。
但arr不准重新赋值。
例如:arr[0]即*arr即*ptra即ptra[0] = 1arr[3]即*(arr+3即*(ptra+3即ptra[3] = 7但arr的使用不如ptra灵活,如:不允许*arr++,而允许*ptra++。
见以下例子:§2.2中[例1]的主程序void main({int arr[5] = {1, 3, 5, 7, 9};for ( int i = 0; i < 5; i++cout << arr[i] << endl; //数组名}其中的for语句可改为:for ( int i = 0; i < 5; i++cout << *(arr+i << endl; //指针// 但不允许arr加减,即不允许:// cout << *(arr++ << endl; not allowed但可使用以下指针ptra:int *ptra = arr;for ( int i = 0; i < 5; i++cout << *(ptra++ << endl;// 此处可以将指针加减(3)字符串与字符数组:字符串一般使用指针(包括变量指针和常量指针两种方式)表示其地址和内容,此地址也即其第一个字符的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参数类型POINTER的格式
下图给出了存储在每个字节中的数据类型。
参数类型POINTER存储下列信息:
•DB编号(或0,如果数据没有存储在DB中)
•CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)
十六进制代码存储区描述
b#16#81I输入区域
b#16#82Q输出区域
b#16#83M位存储区域
b#16#84DB数据块
b#16#85DI背景数据块
b#16#86L本地的数据(L堆栈)
b#16#87V先前的本地数据
•数据的地址(格式为字节.位)
STEP 7提供指针格式:p#memory_area byte.bit_address.(如果形式参数被声明为参数类型POINTER,只需要指出存储区域和地址。
STEP 7将自动地重定输入指针的格式。
) 下面的实例说明如何为以M50.0开始的数据输入参数类型POINTER:
•P#M50.0
•M50.0 (如果形式参数声明为POINTER)。
使用参数类型POINTER
指针用于指向地址。
这种寻址方式的优点是可以在程序处理期间动态地修改语句的地址。
存储器间接寻址的指针
使用存储器间接寻址的程序语句由指令、地址标识符和偏移量组成(偏移量必须在方括号内给出)。
双字格式指针的实例:
区域内部和区域交叉寻址的指针
使用这些寻址方式的程序语句包含指令和下列部分:地址标识符、地址寄存器标识符、偏移量。
地址寄存器(AR1/2)和偏移量必须在方括号内一起指定。
区域内部寻址的实例
指针不包含存储器区的指示:
偏移量0.0没有影响。
输出10.0由8.7 (AR1)加上偏移量1.1计算出来。
结果是10.0而不是9.8,参见指针格式。
区域交叉寻址的实例
在区域交叉寻址中,存储区域在指针中指出(在实例I和Q中)。
偏移量0.0没有影响。
输出10.0由8.7 (AR2)加上偏移量1.1计算出来。
结果是10.0而不是9.8,参见指针格式。