指针.docx
- 文档编号:10742703
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:17
- 大小:82.39KB
指针.docx
《指针.docx》由会员分享,可在线阅读,更多相关《指针.docx(17页珍藏版)》请在冰豆网上搜索。
指针
指针
S7-300/400PLC寻址方式
一、直接寻址
1、绝对地址
2、符号地址
二、间接寻址
1、存储器间接寻址(包括16位指针与32位指针)
2、寄存器间接寻址(只有32位指针)
存储器间接寻址
1、16位指针:
用于定时器、计数器、程序块(DB、FC、FB)的寻址,16位指针被看作一个无符号整数(0~65535),它表示定时器(T)、计数器(C)、数据块(DB、DI)或程序块(FB、FC)的号,16位指针的格式如下:
寻址格式表示为:
区域标识符[16位地址指针]
例如使一个计数器向上计数表示为:
CUC[MW20]
上述指令中,’C’为区域标识符,而’MW20’为一个16位指针。
例1
//用于定时器
L1AI0.0
TMW0LS5T#10S
AI0.0→SDT1
LS5T#10S
SDT[MW0]
例2
//用于打开DB块
L20
TLW20
OPNDB[LW20]
2、32位指针:
用于I、Q、M、L、数据块等存储器中位、字节、字及双字的寻址,32位的地址指针可以使用一个双字表示,第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第31位没有定义,32位指针的格式如下:
存储器32指针仅用于内部区域寻址。
寻址格式表示为:
地址存储器标识符[32位地址指针]
例如写入一个M的双字表示为:
TMD[LD0]
‘MD’为区域标识符及访问宽度,而‘LD0’为一个32位指针。
32位内部区域指针可用常数表示,表示为P#字节.位。
如常数P#10.3为指向第10个字节第3位的指针常数。
若把一个32位整型转换为字节指针常数,从上述指针格式可以看出,应要把该数左移3位(或是乘8)即可。
如:
LL#100//Accu0装入32位整形100
SLD3//左移3位
TLD0//LD0得到P#100.0指针常数
例:
DB块间接寻址举例
OPNDB1//打开DB1。
OPNDI3//打开DB3,最多可以同时打开两个DB块。
L4//装载4到累加器1中。
SLD3//累加器1中数值左移3位。
TMD20//将逻辑操作结果传送到MD20中,MD20包含地址指针为P#4.0。
LP#20.0//将地址指针P#20.0装载到MD24中。
TMD24
L320//320转换指针为P#40.0并装载到MD28中。
TMD28
LDBW[MD20]//装载DB1.DBW4。
LDBW[MD24]//装载DB1.DBW20。
+I//相加
LDIW[MD28]//装载DB3.DBW40。
-I//相减。
TDIW2//将运算结果传送到DB3.DBW2中。
例:
M存储器连续区域操作
L0
TMW100
TMD4//初始化MW100和MD4。
OPNDB1//打开DB1。
L100//循环操作的次数,100次。
NEXT:
TMW100//将循环100次装载到MW100中。
LMW2//进行比较的数值存储于MW2。
LDBW[MD4]//与DB块中存储的值进行比较,开始地址为DBW0。
==I
JCm1//如果数值相等跳到m1。
LMD4
LP#2.0
+D
TMD4//将地址指针加2(每个相邻的字地址相差2)。
LMW100
LOOPNEXT//次数减1,跳回next,如果MW100等于0,跳出循环操作LOOP指令。
m1:
FPM10.0
JCNm2
LMD4
LP#2.0
/D
+L#1
TMD8//如果数值相当,记录MD4指针的数据,将转换为数组的位置((地址值/P#2.0)+1)值存储于MD8中。
m2:
NOP0
寄存器间接寻址
定义:
通过CPU的地址寄存器AR1和AR2寻址方式称为寄存器间接寻址,分为内部区域间接寻址和交叉区域寻址。
AR1、AR2均为32位寄存器,寄存器寻址只使用32位指针。
使用寄存器间接寻址方式的程序语句包含以下部分:
指令,地址标识符,地址寄存器标识符,偏移量
1、内部区域寄存器间接寻址
指针格式与存储器间接寻址的32位指针相同,第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第31位没有定义,32位指针的格式如下:
间接寻址表示为:
存储器标识符[ARx,地址偏移量]
如:
LMW[AR1,P#2.0]
‘MW’为被访问的存储器及访问宽度,’AR1’为地址寄存器1,‘P#2.0’为地址偏移量。
例:
DB块寄存器内部寻址
OPNDB1//打开DB1。
LAR1P#10.0//将指针P#10.0装载到地址寄存器1中。
LDBW[AR1,P#12.0]//将DBW22装载到累加器1中。
LAR1MD20//将存储于MD20中的指针装载到地址寄存器1中。
LDBW[AR1,P#0.0]//将DBW装载到累加器1中,地址存储于MD20中。
+I
LAR2P#40.0//将指针P#40.0装载到地址寄存器2中。
TDBW[AR2,P#0.0]//运算结果传送到DBW40中。
例:
DI、DO区寄存器内部寻址
LP#8.7//装载指向第8字节第7位的指针值到累加器1
LAR1//累加器1中的指针装载到AR1
AI[AR1,P#0.0]//I8.7的信号状态
=Q[AR1,P#1.1]//输出Q10.0
2、交叉区域寄存器间接寻址
包含有存储器区域信息的指针,称为交叉区域指针。
,交叉区域指针为32位,寄存器间接寻址要使用地址寄存器AR1或AR2。
32位交叉区域指针,左起0~18位格式与32位内部区域指针相同,19~23位,27~30位未定义,31位为交叉区域指针标识位。
24~26位是存储区域地址标识,8中组合表示8种存储器区域:
000表示没有地址区,例如P#12.0;
001表示输入地址区I,例如P#I12.0;
010表示输出地址区Q,例如P#Q12.0;
011表示标志位地址区M,例如P#M12.0;
100表示数据块(DB)中的数据,例如P#DB
101表示数据块(DI)中的数据,例如P#DI1.DIX12.0
110表示区域地址区L,例如P#L12.0;
111表示调用程序块的区域地址区V,例如P#V12.0;
交叉区域指针格式如下:
交叉区域指针常数表达为:
P#存储器字节.位
例如:
P#Q10.5//指向Q区第10字节第5位的指针常数
P#DB1.DBX32.0//指向DB1区域的第32字节第0位的指针常数
交叉区域寻址表示为:
访问宽度[ARx,偏移量]
例如:
LW[AR2,P#1.0]
‘W’为访问宽度,AR2为地址寄存器2,P#1.0为偏移量。
例1:
M存储区
LP#M20.0
LAR1//将指针P#M20.0放到地址寄存器AR1中
L1234
TW[AR1,P#2.0]//将数值1234存到MW22中
例2:
I存储区
LP#I0.0
LAR2//将指针P#I0.0放到地址寄存器AR2中
LW[AR2,P#0.0]
TMW0//将IW0的状态传送到MW0中
补充举例:
例1:
寄存器交叉区域指针位操作位寻址格式
支持I、Q、M、L、DIX、DBX,正确格式如下:
格式1:
LAR1P#I1.1//AR1=10000001000……0001001
交叉指针输入地址1字节1位1
=16#81000009
格式2:
LP#I1.1
LAR1//AR1=16#81000009,与前面指令效果相同
格式3:
LDW#16#81000009
LAR1//AR1=16#81000009(P#I1.1),同上
格式4:
LDW#16#81000009
TMD0
LAR1MD0//AR1=16#81000009(P#I1.1),同上
格式5:
A[AR1,P#1.2]//相当于AI2.3
格式6:
LDW#16#82000009=100000100000……0001001
LAR1交叉指针输入地址Q字节1位1
A[AR1,P#1.2]//相当于AQ2.3
例2:
寄存器交叉区域指针装载指令(L)寻址格式
支持IB,IW,ID,DBB,DBW,DBD,DIB,DIW,DID,PIB,PIW,PID。
正确格式如下:
LAR1P#I1.0
LB[AR1,P#1.0]//相当于LIB2
LW[AR1,P#1.0]//相当于LIW2
LD[AR1,P#1.0]//相当于LID2
例3:
寄存器交叉区域指针传送指令(T)寻址格式
LAR1P#Q1.0
LB[AR1,P#1.0]//相当于TQB2
LW[AR1,P#1.0]//相当于TQW2
LD[AR1,P#1.0]//相当于TQD2
例4:
寄存器内部区域指针与交叉区域指针混用
当两者混用时,地址区域由内部区域的地址区域为准:
LAR1P#I1.0//虽然AR1=P#I1.0
LQB[AR1,P#0.0]//但是地址区域以内部地址区域的“Q”为准,指令结果//相当于LQB1
使用32位间接寻址时注意事项(包括存储器32位寻址及寄存器寻址)
1>对于字节、字、双字的寻址,存储器中的指针必须要为8的整数倍。
例:
LDBB[MD0]//如果MD0=P#1.3=11,不是8的整数倍,则CPU将报//错停机
2>对于间接寻址务必考虑存储器中所有出现的数值对寻址结果的影响。
例:
LMD[MD0]//MD0中务必为双整数数据,程序中务必不能送其他数
TDBD0//据类型到MD0,例如浮点数
TDBD[DBD0]//如果DBD0=0,这种引用格式容易引起混乱
3>对于字节寻址,存储器每次至少增加8,对于字寻址,存储器每次至少增加16,对于双字寻址,存储器每次至少增加32,否则容易造成访问地址重复错误。
例:
OPNDB1
L0
TMD0//初始化MD0
L1
TDBW[MD0]//将1送至DBW0
L8
LMD0
+D
TMD0//MD0增加8
L2
TDBW[MD0]//将2送至DBW1。
注意:
MD0此时为一个地址指针,
//而不再是数字8。
DBW0与DBW1的共有部分为DBB1,
//将与前面的将1送至DBW0冲突
NOP0
FB/FC的指针参数传递
在使用FB/FC形参传递指针参数时,16位、32位指针是可用的,但POINTER与ANY指针类型也是常见的类型。
1、16指针用于参数传递
例如:
//编写一个FC,作用是启动条件满足后延时3秒输出闭合信号
//定义FC的形参如下:
//程序如下:
L#Pointer16
TLW0//将16位指针装入LW0
A#Start//Start参数=True时
LS5T#3S//计时3秒
SDT[LW0]
AT[LW0]//计时器计时到
=#Motor//输出Motor=True
2、32指针用于参数传递
例如:
编写一个FC,作用是将输入DB块指定的区域(实数)求出平均值
定义形参如下:
//程序如下:
L#DB_No
TLW0//装载DB块号至LW0
OPNDB[LW0]//并打开该DB块
L#Data_1st
TLD2//装载第一个要计算的实数的32指针至LD2
L0
TLD8//将'和'初始为0
L#Len//长度
NEXT:
TLW6//实数的个数装载至LW6,并且进入一个LOOP循环
LDBD[LD2]//读取LD2指针位置的实数
LLD8
+R//与'和'相加
TLD8//结果存到'和'中
LLD2//装入指针
LP#4.0
+D//指针加4个字节
TLD2//结果仍存入LD2,此时LD2指针指向下一个实数
LLW6//循环计数
LOOPNEXT//LOOP循环的结束
L#Len//将实数个数由INT转成REAL
ITD
DTR
TLD12
LLD8//'和'除以实数格式的实数个数
TAK
/R
T#Average_out//得到平均值,通过Average_out输出
3、POINTER数据类型及参数传递
POINTER是一种用于传递指针的形参数据类型,长度为6个字节,即BYTE0~BYTE1存储数据块号(或者0),BYTE2存储存储区域类型,BYTE3~BYTE5存储具体地址。
也可以将BYTE2~BYTE5看成是一个DWORD类型的指针地址。
POINTER用于向被调用的函数FC及函数块FB传递复合数据类型(如ARRAY,STRUCT及DT等)的实参。
在被调用的函数FC及函数块FB内部可以间接访问实参的存储器。
格式如下:
POINTER参数中,数据区含义如下:
POINTER参数中,数据区含义如下:
16进制代码
数据区
简单描述
B#16#81
I
输入区
B#16#82
Q
输出区
B#16#83
M
标志位
B#16#84
DB
数据块
B#16#85
DI
背景数据块
B#16#86
L
区域数据区
B#16#87
V
上一级赋值的区域数据
例1:
P#DB1.DBX1.1的POINTER构成
BYTE0BYTE1BYTE2BYTE3BYTE4BYTE5
16#016#116#8416#016#02#00001001
说明:
数据块号=1,存储区域为DB(16#84),地址为1.1(2#1001)
例2:
P#M2.0的POINTER构成
BYTE0BYTE1BYTE2BYTE3BYTE4BYTE5
16#016#016#8316#016#02#00010000
说明:
数据块号=0,存储区域为M(16#83),地址为2.0(2#10000)
4、ANY数据类型及参数传递
ANY是一种用于传递指针的形参数据类型,可视为POINTER类型的扩展,较POINTER类型为复杂,长度为10个字节,增加的4字节,最高字节(Byte0)固定为B#16#10(S7标志),第二字节(Byte1)为ANY指针所指向区域的数据类型,而接下来的2字节(BYTE3,4)组合为一个INT,为ANY指针所指定区域的长度,称为重复系数(Repetitionfactor)。
其余6字节作用与POINTER类型相同。
格式如下
数据类型含义为:
其中数据类型含义为:
数据类型代码
十六进制代码
数据类型
简单描述
B#16#00
NIL
空
B#16#01
BOOL
位
B#16#02
BYTE
8位字节
B#16#03
CHAR
8位字符
B#16#04
WORD
16位字
B#16#05
INT
16位整形
B#16#06
DWORD
32位双字
B#16#07
DINT
32位双整形
B#16#08
REAL
32位浮点
B#16#09
DATE
IEC日期
B#16#0A
TIME_OF_DAY(TOD)
24小时时间
B#16#0B
TIME
IEC时间
B#16#0C
S5TIME
SIMATIC时间
B#16#0E
DATE_AND_TIME(DT)
时钟
B#16#13
STRING
字符串
B#16#17
BLOCK_FB
FB号
B#16#18
BLOCK_FC
FC号
B#16#19
BLOCK_DB
DB号
B#16#1A
BLOCK_SDB
SDB号
B#16#1C
COUNTER
计数器
B#16#1D
TIMER
定时器
ANY数据类型用于表达参数类型:
ANY数据类型可以用于表达类似于FC1、FB1、T100等参数类型。
当用于表达参数类型时,重复系数=1,字节4、5和7将始终为0,字节8和9用于表达定时器、计数器或块的编号。
例:
假如MY_ANY为ANY数据类型,当MY_ANY=FC1时,ANY数据类型构成如下所示
BYTE0BYTE1BYTE2BYTE3BYTE4BYTE5BYTE6BYTE7BYTE8BYTE9
16#10H16#1816#016#116#016#016#016#016#016#1
例:
假如MY_ANY为ANY数据类型,当MY_ANY=T1时,ANY数据类型构成如下所示
BYTE0BYTE1BYTE2BYTE3BYTE4BYTE5BYTE6BYTE7BYTE8BYTE9
16#10H16#1D16#016#116#016#016#016#016#016#1
ANY数据类型用于表达数据类型:
ANY数据类型可以用于表达类似于P#DB1.DBX1.0BYTE10等数据类型。
当ANY数据类型用于表达数据类型时,ANY数据类型包括10个字节,BYTE0必须为16#10(S7标志),BYTE1为数据类型,BYTE2~BYTE3为重复系数(即参数包括多少个字节、字、双字等),BYTE4~BYTE5为数据块号(或者0),BYTE6~BYTE9为存储具体地址。
例:
假如MY_ANY为ANY数据类型,当MY_ANY=P#DB1.DBX1.0BYTE10时,ANY数据类型构成如下所示
BYTE0BYTE1BYTE2BYTE3BYTE4BYTE5BYTE6BYTE7BYTE8BYTE9
16#10H16#0216#016#A16#016#116#8416#016#016#8
例:
当MW0=2时,复制DB1.DBX0.0BYTE20到DB2.DBX1.0BYTE20
当MW0=3时,复制DB1.DBX0.0BYTE20到DB3.DBX1.0BYTE20
当MW0=4时,复制DB1.DBX0.0BYTE20到DB4.DBX1.0BYTE20
LP##ANY_TEMP0
LAR1
LW#16#1002//写S7标志16#10,及BYTE类型02
TW[AR1,P#0.0]//至ANY的BYTE0及BYTE1
L20//BYTE个数为20个
TW[AR1,P#2.0]//写至ANY的BYTE2及BYTE3
CMP2:
LMW0
L2
==I
JCNCMP3//如不等于2,则跳至下个比较
LMW0//DB号为2
TW[AR1,P#4.0]//写至ANY的BYTE4及BYTE5
JUBLMV//跳至块移动操作
CMP3:
LMW0
L3
==I
JCNCMP4//如不等于3,则跳至下个比较
LMW0//DB号为3
TW[AR1,P#4.0]//写至ANY的BYTE4及BYTE5
JUBLMV//跳至块移动操作
CMP4:
LMW0
L4
==I
JCNEND1//如不等于4,则跳至下个比较
LMW0//DB号为4
TW[AR1,P#4.0]//写至ANY的BYTE4及BYTE5
BLMV:
LDW#16#84000008//目的地址为数据块的BYTE1
TD[AR1,P#6.0]//写至ANY的BYTE6,7,8,9
CALL“BLKMOV”//进行块移动操作SFC21
SRCBLK:
=P#DB1.DBX0.0BYTE20
RET_VAL:
=MW0
DSTBLK:
=#ANY_TEMP0
END1:
NOP0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针