【免费下载】S7300指针类型与间接寻址
详解西门子间接寻址(1)
详解西门子间接寻址
【地点的观点】
完好的一条指令,应当包含指令符 +操作数(自然不包含那些单指令,比方 NOT 等)。此中的操作数是指令要履行的目标,也就是指令要进行操作的地点。
我们知道,在 PLC 中划有各样用途的储存区,比方物理输入输出区 P、映像输入区 I 、映像输出区 Q、位储存区 M 、准时器 T、计数器 C、数据区 DB 和 L 等,同时我们还知道,每个地区能够用位( BIT )、字节( BYTE )、字( WORD )、双字
( DWORD )来权衡,或许说来指定切实的大小。自然准时器 T、计数器 C 不存在
这类权衡体系,它们仅用位来权衡。由此我们能够获得,要描绘一个地点,起码应当
包含两个因素:
1、储存的地区
2、这个地区中详细的地点
比方: A
此中的 A 是指令符,是 A 的操作数,也就是地点。这个地点由两部分构成:
Q:指的是映像输出区
:就是这个映像输出区第二个字节的第0 位。
由此,我们得出,一个切实的地点构成应当是:
〖储存区符〗〖储存区尺寸符〗〖尺寸数值〗 .〖位数值〗,比如:。
DBX200.0
此中,我们又把〖储存区符〗〖储存区尺寸符〗这两个部分合称为:地点表
记符。这样,一个切实的地点构成,又能够写成:
地点表记符+ 切实的数值单元
【间接寻址的观点】
寻址,就是指定指令要进行操作的地点。给定指令操作的地点方法,就是寻
址方法。
在谈间接寻址以前,我们简单的认识一下直接寻址。所谓直接寻址,简单的
说,就是直接给出指令确实切操作数,象上边所说的, A ,就是直接寻址,对
于 A 这个指令来说,就是它要进行操作的地点。
S7300常用操作说明
S7-300常用操作说明
利用STEP7监视输入输出量的方法
DP:高速数据传送
1、打开PLC软件。
运行STEP7,打开PLC软件,将左侧的文件夹层层展开直到选中Blocks,如下图所示:
2、找到VAT块。
在右侧找到V AT_??的块,双击打开。一般此块排列在所有块的最后面,名称以V AT开头,后跟的下划线后的名称可能不一样,可以不管,如有不止一个,可以任意打开一个。如下图:
3、插入VAT块。
如没有找到此块,可以在自行添加一个,操作如下图,在右侧窗口空白处点击鼠标右键,选择Insert New Object(插入新对象)——Variable Table(变量表)
4、选中后将出现如下窗口
5、打开VAT块。
点击OK按钮即可生成V AT_1块。打开V AT块,
如下图:
6、查找监视点地址。
在Address一列中输入想要监视的地址,如需要监视第一流自动转换开关状态,则察看接口表
7、监视数字量输入点。
如上图,察看接口表得知,第一流转换开关的自动档输入点为I0.0,第二流转换开关的自动档输入点为I4.0。将这两个地址输入到V AT窗口中的Address 一栏中,如图:
8、判断监视结果。
在第一行中输入I0.0后,回车后,光标自动移到第二行,第三列的Display format自动设为BOOL类型。在保证工控机与PLC联接正常的情况下,可以点上图方框所示的Monitor Variable按钮,则情况应如下图所示,窗口的标题栏变为高亮的青色,窗口右下角的RUN状态栏有绿色状态条不断闪动。下图所示的监视结果,I0.0结果为绿色,true,I0.4结果为灰色,false,表明第一流转换开关处于手动档,第二流转换开关不处于手动档。
详解西门子间接寻址
详解西门子间接寻址
【地址的概念】
完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。由此我们可以得到,要描述一个地址,至少应该包含两个要素:
1、存储的区域
2、这个区域中具体的位置
Q:指的是映像输出区
由此,我们得出,一个确切的地址组成应该是:
DB X 200 . 0
其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。这样,一个确切的地址组成,又可以写成:
地址标识符+ 确切的数值单元
【间接寻址的概念】
寻址,就是指定指令要进行操作的地址。给定指令操作的地址方法,就是寻址方法。
这样看来,间接寻址就是间接的给出指令的确切操作数。对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。程序语句中用方刮号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。间接由此得名。
西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
s7寻址方式,直接寻址,间接寻址,指针使用
1. 直接地址:例如I0.0,Q1.7,PIW256,PQW512,MD20,T15,C16,DB1.DBB10,L10.0等2. 符号寻址:例如qq,ww.aa等二者的详细描述参见下文:1.1 间接寻址存储器间接寻址:16位指针,例如OPN DB[MW2] 32位指针,例如A I[MD0]寄存器间接寻址:32位指针,例如A I[AR1,P#0.0],A [AR1,P#0.0] 1.2 S7-300/400寻址方式图解2 如何使用指针指针用来指向一个地址。使用这种寻址方式的优点在于可以在程序运行过程中实现变址。 指针用于存储器间接寻址 程序中用于存储器间接寻址的语句包含一个指令、一个地址标识符、以及一个偏移量(偏移量必须在方括号内给出)。 下面给出一个双字格式的指针的例子:L P#8.7 把指针值装载到累加器1T I[MD2] 把指针值传送到MD2A I[MD2] 查询I8.7的信号状态= Q[MD2] 给输出位Q8.7赋值存储区域内部寻址及交叉寻址 程序中采用这些寻址方式的语句包含一个指令以及下列内容:地址标识符、地址寄存器标识符、偏移量。地址寄存器(AR1、AR2)及偏移量必须写在方括号内。 存储区域内部寻址例程 指针不包含指示存储区域的信息:L P#8.7 把指针值装载到累加器1LAR1 把指针从累加器1装载到AR1A I[AR1,P#0.0] 查询I8.7的信号状态= Q[AR1,P#1.1] 给输出位Q10.0赋值偏移量0.0不起作用。输出Q10.0 等于8.7 (AR1) 加偏移量1.1。结果是10.0 ,而不是9.8,参见指针格式。存储区域交叉寻址例程 在存储区域交叉寻址中,指针中包含指示存储区域的信息(例子中为 I 和 Q)。L P#I8.7 把指针值及存储区域标识装载到累加器1LAR1 把存储区域I 和地址8.7装载到AR1L P#Q8.7 把指针值和地址标识符装载到累加器1LAR2 把存储区域Q和地址8.7装载到AR2A [AR1,P#0.0] 查询输入位I8.7的信号状态= [AR2,P#1.1] 给输出位Q10.0赋值偏移量0.0不起作用。输出Q10.0 等于8.7 (AR2) 加偏移量1.1。结果是10.0 ,而不是9.8,
西门子间接寻址详解
完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如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就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。对,就是这个概念。
最新s7300scl编程笔记资料
SCL编程
数组的定义:
二.寻址
1
○2符号寻址
如:DB10.setpoint
“motor1data”.DW12
○3间接寻址
如:E[byteindex,bitindex]
MB[byteindex]
DB10.DW[byteindex]
注:以上运算符的表达式基本大多和我们的数学表达式一样。这里只讲解一下AND,XOR,OR指令。
如:a1:=a1 AND W#16#FFFF
a1:=a1 XOR W#16#FFFF
a1:=a1 OR MW10
注意:当使用程序循环时,请确保不超过循环监测时间。
1.IF语句:
IF 条件0
THEN 语句0;
ELSIF 条件1
THEN 语句1;
ELSIF 条件2
THEN 语句2;
ELSE 语句3;
END_IF;
2.CASE语句:“选择”内的值等于Const内的值就执行那个语句。其它语句不
执行,就执行END_CASE;
CASE 选择OF
Const1:语句1;
Const2:语句2;
………
Constn:语句n;
END_CASE;
3.FOR语句
FOR 变量:=n0 TO n BY m DO
…………………..;
………………….;
END_FOR;
注意:这里的n为整型变量或整数值。m为每循环加几。
4.WHILE语句:只要条件满足,程序循环就重复。
WHILE 条件DO
语句;
END_WHILE;
5.REPEAT语句:只要条件不满足,就重复程序循环。
REPEAT
语句;
UNTIL 条件;
END_REPEAT;
6.CONTINUE语句:在FOR, WHILE, REPEAT循环中终止当前程序通道。
S7300的指令
4.可逆计数器S_CUD
可以看到,可逆计数器方框指令可以完成 计数器的加(CU),减(CD)计数和置初 值(S,PV)以及计数器值清零(R)等功 能,还可以将计数器当前值以不同的格式 输出,整数格式(CV)和BCD格式 (CV_BCD).计数器的状态可以Q端输出, 也可以由计数器的触点输出.
4.可逆计数器S_CUD
如图所示程序
2.若非转移指令(JMPN)
若非转移指令(JMPN)与转移指令相似, 其转移条件是当逻辑位的状态为"0"时.
2.若非转移指令(JMPN)
如图所示程序:当 I0.1的状态为"1", 时,跳转条件不成 立,CPU将按正常 顺序执行程序.当 I0.1的状态为"0" 时,跳转条件成立, CPU将跳过程序段 2,直接执行程序 段3的指令.
OUT
目的地地址
如图3.7.20所示程序
移位指令和循环指令
字左移指令SHL_W 字右移指令SHR_W 双字左移指令SHL_DW 双字右移指令SHR_DW 整数右移指令SHR_I 双整数右移指令SHR_DI 循环指令能够将累加器1整个内容逐位向左或者向 右循环移位.可使用的循环指令有: 双字左循环指令ROL_DW 双字右循环指令ROR_DW
4.可逆计数器S_CUD
(3)计数器触点的状态由计数器的值决定, 如果计数值等于零,则计数器触点的状态 为低电平"0",如果计数值不等于零(无论 等于几),则计数器触点的状态为高电平 "1".
90%的工程师,对PLC指针类型与间接寻址无从下手
90%的工程师,对PLC指针类型与间接寻址无从下手
在西门子S7-300和S7-400的编程中经常需要调用一些系统功能或功能块,在输入参数时经常碰到有指针类型的参数,那么你对指针类型了解吗?我第一次接触指针一词是在学习C语言的时候,指针和链表是C语言中的一个重点难点。在C语言中,指针即存储器地址,在西门子PLC中的指针也是指地址。下面看看西门子POINTER类型的结构:
参数类型POINTER存储下列信息:
•DB编号(或0,如果数据没有存储在DB中)
•CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)
数据的地址(格式为字节.位)
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等形式的地址标识符。
S7300常见问题解答
S7 300 常见问题问答
1:使用CPU 315F和ET 200S时应如何避免出现“通讯故障”消息?
使用CPU S7 315F, ET 200S以及故障安全DI/DO模块,那么您将调用OB35 的故障安全程序。而且,您已经接受所有监控时间的默认设置值,并且愿意接收“通讯故障”消息。 OB 35 默认设置为100毫秒。您已经将F I/O模块的F监控时间设定为100毫秒,因此至少每100毫秒要寻址一次I/O模块。但是由于每100毫秒才调用一次OB 35,因此会发生通讯故障。要确保OB35的扫描间隔和F监控时间有所差别,请确保F监控时间大于OB35的扫描间隔时间。
S7分布式安全系统,一直到V5.2 SP1 和 6ES7138-4FA00-0AB0,6 ES7138-4FB00-0AB0,6ES7138-4CF00-0AB0 都会出现这个问题。在新的模块中,F 监控时间设定为150毫秒.
2:当DP从站不可用时,PROFIBUS上S7-300 CPU的监控时间是多少?
使用CPU的PROFIBUS接口上的DP从站操作PROFIBUS网络时,希望在启动期间检查期望的组态与实际的组态是否匹配。在 CPU属性对话框中的Startup选项卡上给出了两个不同的时间。
3:如何判断电源或缓冲区出错,如:电池故障?
如果电源(仅S7-400)或缓冲区中的一个错误触发一个事件,则CPU操作系统访问OB81。错误纠正后,重新访问OB81。电池故障情况下,如果电池检测中的BATT.INDIC开关是激活的,则 S7-400仅访问OB81。如果没有组态OB81,则CPU不会进入操作状态STOP。如果OB81不可用,则当电源出错时,C PU 仍保持运行。
PLC中指针及间接寻址的应用
S7-200cpu许诺利用指针对下述存储区进行间接寻址:I, Q, V, M, S, T和C。但不能对独立的位或模拟量进行间接寻址。指针为双字值,用来寄存另一个存储器的地址,只能用V, L 或累加器AC1,AC2和AC3作指针。为了生成指针,必需用双字传送指令(MOVD)将某个位置的地址移入另一个位置或累加器作为指针。
MOVD &VB200,AC1
MOVW *AC1,AC0
对指令的操作数的指定方式,我将其明白得为“寻址”。
在程序中绝大部份的指令都带有操作数,所谓的操作数,是执行这一指令时被这一指令加以操作、处置的数值。对指令的操作数的指令方式大致的总结一下,能够归纳为如下几个类型:1:指令的操作数为“当即数”,(如:15、16#F、2#1111等、、、、、、)。
LD M0.0
MOVW +255, VW0
+I +45, VW0
这是一条加法指令,被加数为:255、加数为45执行这条指令后计算出来的“和”寄存在VW0这一存储器内。
LD M0.0
MOVB 15, VB0
这是一条传指令,译为:将15传送至存储器VB0内。
2:指令的操作数没有直接的给出,而是给出它所在的地址。
LD M0.0
MOVW VW0, VW4
-I VW2, VW4
这是一条减法指令,译为:将存储器VW0内的数值减去存储器VW2内的数值,将“差”寄存在存储器VW4内。
3:指令的操作数没有直接的给出,而是给出它所在的地址的“地址”,在S7-200中,将这种寻址方式称之为“指针寻址”。
下面,咱们一路来学习一下关于指针的利用方式:
第三章 S7-300数据类型
【例3-2】 存储器间接寻址的双字格式的指针寻址。
返回上级
5.寄存器间接寻址(1/4)
寄存器间接寻址,简称寄存器寻址。该寻址方式在指令 中通过地址寄存器和偏移量间接获取操作数,其中的地址寄 存器及偏移量必须写在方括号“[]”内。在S7-300中有两个地 址寄存器AR1和AR2,用地址寄存器的内容加上偏移量形成地 址指针,并指向操作数所在的存储器单元。地址寄存器的地 址指针有两种格式,其长度均为双字,指针格式如图所示。
循环程序执行
启动块 (OB 100) 上电后执行一次 输入 模块 循环监视时间的开始
从模块读信号状态,并保存到过程映象区 (PII)
CPU 循环
执行OB1中的程序 (循环执行) 事件 (日期时间中断、硬件中断等) 调用其他 OB,FB,FC
块OB 1
A I 0.1 A I 0.2 = Q8.0
把过程映象输出表(PIQ) 写到输出模块
6.功能块类型(FB、SFB)
这种数据类型仅可以在FB的静态变量区定义,用于实 现多背景DB。
返回上级
4
参数数据类型
参数类型是一种用于逻辑块(FB、FC)之间传递参数 的数据类型,主要有以下几种: (1)TIMER(定时器)和COUNTER(计数器)。 (2)BLOCK (块):指定一个块用作输入和输出,实 参应为同类型的块。 (3)POINTER (指针):6字节指针类型,用来传递DB 的块号和数据地址。 (3)ANY : 10 字节指针类型,用来传递 DB 块号、数据 地址、数据数量以及数据类型。
西门子S7-300高级编程培训4间接寻址和地址寄存器
Date: File:
2011-9-5 PRO2_04E.10
SITRAIN Training for
Automation and Drives
内部区域, 内部区域,寄存器间接寻址
AR 1或AR2中的内部区域指针: 或 中的内部区域指针: 中的内部区域指针
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
向FB和FC传递指针的特点 和 传递指针的特点
在参数里传递的指针不能直接用于存储器间接寻址。 用于存储器间接寻址而传递的指针,在访问之前必须拷贝到临时变量里去
SIMATIC S7
Siemens AG 2001. All rights reserved.
Date: File:
2011-9-5 PRO2_04E.8
SIMATIC S7
Siemens AG 2001. All rights reserved.
Date: File:
2011-9-5 PRO2_04E.7
SITRAIN Training for
Automation and Drives
存储器间接寻址的特性
用于存储16位和 位指针的地址区域 用于存储 位和32位指针的地址区域: 位和 位指针的地址区域:
S7300(STL)指令
S7-300/400语句表指令
助记符分类说明
+ 整数算术运算指令加上一个整数常数(16 位,32 位)
= 位逻辑指令赋值
) 位逻辑指令嵌套闭合
+AR1 累加器指令 AR1 加累加器 1 至地址寄存器 1
+AR2 累加器指令 AR2 加累加器 1 至地址寄存器 2
+D 整数算术运算指令作为双整数(32 位),将累加器 1 和累加器 2 中的内容
相加
–D 整数算术运算指令作为双整数(32 位),将累加器 2 中的内容减去累加器 1
中的内容
*D 整数算术运算指令作为双整数(32 位),将累加器 1 和累加器 2 中的内容
相乘
/D 整数算术运算指令作为双整数(32 位),将累加器 2 中的内容除以累加器 1
中的内容
? D 比较指令双整数(32 位)比较 ==,<>,>,<,>=,<=
+I 整数算术运算指令作为整数(16 位),将累加器 1 和累加器 2中的内容相加–I 整数算术运算指令作为整数(16 位),将累加器 2 中的内容减去累加器 1 中
的内容
*I 整数算术运算指令作为整数(16 位),将累加器 1 和累加器 2中的内容相乘/I 整数算术运算指令作为整数(16 位),将累加器 2 中的内容除以累加器 1 中
的内容
? I 比较指令整数(16 位)比较 ==,<>,>,<,>=,<=
+R 浮点算术运算指令作为浮点数(32 位,IEEE-FP),将累加器1 和累加器 2 中
的内容相加
–R 浮点算术运算指令作为浮点数(32 位,IEEE-FP),将累加器2 中的内容减去
累加器 1 中的内容
指针
指针
S7-300/400 PLC寻址方式
一、直接寻址
1、绝对地址
2、符号地址
二、间接寻址
1、存储器间接寻址(包括16位指针与32位指针)
2、寄存器间接寻址(只有32位指针)
存储器间接寻址
1、16位指针:用于定时器、计数器、程序块(DB、FC、FB)的寻址,16位指针被看作一个无符号整数(0~65535),它表示定时器(T)、计数器(C)、数据块(DB、DI)或程序块(FB、FC)的号,16位指针的格式如下:
寻址格式表示为:区域标识符[ 16位地址指针]
例如使一个计数器向上计数表示为:
CU C [ MW20 ]
上述指令中,’C’为区域标识符,而’MW20’为一个16位指针。
例1
//用于定时器
L 1 A I0.0
T MW0 L S5T#10S
A I0.0 →SD T1
L S5T#10S
SD T[MW0]
例2
//用于打开DB块
L 20
T LW20
OPN DB[LW20]
2、32位指针:用于I、Q、M、L、数据块等存储器中位、字节、字及双字的寻址,32位的地址指针可以使用一个双字表示,第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第31位没有定义,32位指针的格式如下:
存储器32指针仅用于内部区域寻址。
寻址格式表示为:地址存储器标识符[ 32位地址指针]
例如写入一个M的双字表示为:
T MD [ LD0 ]
‘MD’为区域标识符及访问宽度,而‘LD0’为一个32位指针。
32位内部区域指针可用常数表示,表示为P# 字节.位。
如常数P# 10.3为指向第10个字节第3位的指针常数。
s7300的stl语言编程手册
一、STL语言简介
STL(Standard Template Library)是C++标准程序库中的一部分,它提供了一系列通用的模板类和函数,用于实现常见的数据结构和算法。STL提供了一种高效、灵活和可复用的编程方式,被广泛应用于
C++程序的开发中。
二、STL语言的基本概念
1. 容器(Cont本人ners)
STL中的容器是用于存储数据的数据结构,例如向量(vector)、列
表(list)、队列(queue)等。这些容器提供了丰富的操作方法,可
以轻松地进行数据的插入、删除、查找等操作。
2. 迭代器(Iterators)
迭代器是STL中用于遍历容器中元素的工具,它提供了统一的访问容
器元素的接口,可以让程序员方便地对容器中的数据进行操作。
3. 算法(Algorithms)
STL中提供了各种常见的算法,例如排序、查找、计算等,这些算法
可以直接应用于STL容器中的数据,极大地简化了程序的编写和维护。
三、STL语言的编程步骤
1. 包含头文件
使用STL时,首先需要包含对应的头文件,例如使用向量时需要包含<vector>,使用列表时需要包含<list>等。
2. 创建容器
按照需要选择合适的STL容器,并创建对应的容器对象,例如:
```c++
vector<int> vec;
list<string> li;
```
3. 添加数据
使用容器提供的方法,向容器中添加数据,例如:
```c++
vec.push_back(10);
li.push_front("Hello");
S7-300400PLC-ANY指针使用详解
S7-300400PLC-ANY指针使用详解
ANY 指针讲解
STEP 7以10个字节存储参数类型ANY。当构造类型为ANY的参数时,必须确保所有10个字节都被占用,因为调用块估计参数整个内容的值。例如,如果以字节4指定DB编号,也必须以字节6明确地指定存储器区。
STEP 7管理基本和复杂数据类型的数据与参数类型的数据不同。
数据类型的ANY格式
对于基本和复杂数据类型,STEP 7存储下列数据:
∙数据类型
∙重复因子
∙DB编号
∙信息存储的存储区域
∙数据的起始地址
重复因子识别由参数类型ANY传送的指示数据类型的数量。这意味着可以指定数据区,也可以和参数类型ANY结合使用数组和结构。STEP 7将数组和结构识别为数据类型的编号(借助重复因数)。例如,如果要传送10个字,必须为重复因子输入数值10,并且必须为数据类型输入数值04。
地址以格式Byte.Bit存储,此处字节寻址存储在字节7的位0 - 2,节字8的位0 - 7,节字9的位3 - 7。位地址存储在字节9的位0 - 2。
对于类型NIL的空指针,所有来自字节1的字节设置为0。
下表给出参数类型ANY的数据类型或存储区域的编码。
b#16#04WORD字(16位)
b#16#05INT整数(16位)
B#16#06DWORD字(32位)
b#16#07DINT双整数(32位)
b#16#08REAL浮点数(32位)
b#16#09DATE日期
b#16#0A TIME_OF_DAY (TOD)时间
b#16#0B TIME时间
b#16#0C S5TIME数据类型S5TIME b#16#0E DATE_AND_TIME (DT)日期和时间(64位) b#16#13STRING字符串
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2012-06-19 17:24:33)转
释为字或双字指针。完整的数据地址由地址标识符和指针构成,如下例所示。间接寻址的优点是能在程序执行期间动态修改指令的数据地址。
存储器间接寻址使用以下两部分地址:
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。
区域内寄存器间接寻址
使用区域内寄存器间接寻址的程序语句包含一条指令和以下组成部分:地址标识符[地址寄存器标识符,地址]。
区域内寄存器间接寻址使用以下两部分地址:
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等形式的地址标识符。
2. 方括号"[ ]"中的内容包括地址寄存器引用(AR1或AR2)、逗号分隔符","以及双字指针。
双字指针 - 指包含位、字节、字或双字的部分地址的双字。双字指针的格式为:P#字节.位。
注意请记住您现在使用的是两个格式为"P#字节.位"的指针。一个指针已被精确表示出来。另一个指针通过对地址寄存器AR1或AR2的引用来确定。如果要寻址字节、字或双字,请确保指针的位号为0。使用寄存器间接寻址的语句不更改地址寄存器的内容。
指针实例
L P#8.7 //将指针值载入ACCU 1。
LAR1 //用ACCU 1中的指针装载AR1。
A I [AR1, P#0.0] //检查输入位I 8.7并将有符号的状态分配给Q 10.0。
= Q [AR1, P#1.1] //确切地址8.7在AR1中。偏移量不对其产生影响。确切位置10.0由8.7 (AR1)加上1.1 (偏移量)得出,结果是10.0而不是9.8。
区域内寄存器间接寻址实例
A I [AR1,P#4.3] 对其位置是由AR1中的内容加上4个字节,再加上3个位计算得出的输入位,执行逻辑与运算。
= DIX [AR2, P#0.0] 将RLO位状态分配给位于AR2中的实例数据位。
L IB [AR1, P#10.0] 将输入字节载入ACCU 1中。地址由AR1的内容加上十个字节计算得出。
T LD [AR2,P#53.0] 将ACCU 1中的内容传送到本地双字中(该双字的位置由AR2的内容加上53个字节计算得出)。
区域内寄存器间接寻址的特点是:地址标示符在方括号前确定,方括号中的指针均为不含存储区信息(如[AR1,P#4.3]中AR1=P#8.7,两个指针都不含有存储区信息),否则将会与方括号前的地址标示符表示的存储区冲突。
跨区域寄存器间接寻址
使用跨区域寄存器间接寻址的程序语句包含一条指令和以下组成部分:地址标识符[地址寄存器标识符,地址]。
跨区域寄存器间接寻址使用以下两部分地址:
1. 对已寻址的数据对象(地址标识符)大小的规定
数据对象
大小规定
位(无规定表示是一个位)
B 字节
W 字
D 双字
2. 方括号"[ ]"中的内容包括地址寄存器引用(AR1或AR2)、逗号分隔符","以及双字指针。
双字指针 - 指包含位、字节、字或双字的部分地址的双字。指针具有以下区域内格式:P#字节.位。
注意事先必须已将跨区域双字指针载入到由寄存器间接地址引用的地址寄存器中。跨区域双字指针 - 包含位的部分地址(对于位逻辑指令)或字节、字或双字的部分地址(对于装载和传送指令)的双字。地址前面的区域标识符位于用来指定字节和位。跨区域双字指针格式为:P#区域标识符字节.位。
对于由位逻辑指令寻址的位,可以分配跨区域指针区域标识符I、Q、M、DIX或DBX。
对于由装载或传送指令寻址的字节、字和双字,可以分配跨区域指针区域标识符
I、Q、M、DIX、DBX或P。
注意要在指针中指定外设输入或PI区域,请以P#Px.y形式输入指针。区域被指定为P。在跨区域指针中不能使用外设输出PQ区域。请记住您正使用两个指针:作为偏移量,直接在地址中表示的区域内双字指针,例如P#4.0。
存储在地址寄存器(AR1或AR2)中的跨区域双字指针,例如P#Q4.0。
如果要访问通过直接寻址方式进行寻址的字节、字或双字,请确保这两个指针的位号均为0。使用寄存器间接寻址的语句不更改地址寄存器的内容。
跨区域寄存器间接寻址的第一个实例:
L P# I8.7 //将指针值和区域标识符载入ACCU 1。
LAR1 //将存储区I和地址8.7存入AR1。
L P# Q8.7 //将指针偏移量和区域标识符载入ACCU 1。
LAR2 //将存储区Q和地址8.7存入AR2。
A [AR1, P#0.0] //检查输入位I 8.7并将其信号状态分配给输出位Q 10.0。
= [AR2, P#1.1] //偏移量0.0没有任何作用。输出位10.0由8.7 (AR2)加上1.1 (偏移量)得出,结果是10.0而不是9.8。
跨区域寄存器间接寻址的第二个实例:
A I 0.0
JC M002
L P#M10.0 //将指针值和区域标识符载入ACCU 1。
LAR1 //将存储区M和地址10存入ACCU 1。
JU M001
M002: L P#Q0.3 //将指针值和区域标识符载入ACCU 1。
LAR1 //将存储区Q和地址0.3存入ACCU 1。
M001: A I 0.4
= [AR1, P#0.1] //I 0.0用于控制哪个指针用于此语句。将I 0.4的信号状态分配给存储器位M 10.1,或者分配给输出Q 0.4。
跨区域寄存器间接寻址实例
A [AR1,P#4.3] 对于其位置是由AR1中的内容加上4个字节,再加上3个位计算得出的位,执行逻辑与运算。位的存储区在AR1的位24、25和26中指出。
= [AR2, P#0.0] 将RLO位信号状态分配给位于AR2中的位。位的存储区在AR1的位24、25和26中指出。