首页 上一页 1 2 下一页 尾页

(已结贴)工控PLC擂台第75期-PLC的寻址问题 点击:1666 | 回复:26



玻璃的心

    
  • 精华:30帖
  • 求助:2帖
  • 帖子:962帖 | 5801回
  • 年度积分:0
  • 历史总积分:61250
  • 注册:2010年6月11日
发表于:2012-01-11 17:16:57
楼主
     我们知道PLC编程中,最为繁琐的、最为难理解的就是编程时的寻址问题,因此,这期我们要大家讨论的主题是:大家就自己最熟悉的一类型的PLC,来说明这类PLC有哪几种寻址方式,分别是哪几种,并给出相应的简短的举例的程序;该类型的PLC的寻址空间多大等,最好都能有所涉及。

PLC类型任意选择,回答的最好最完全的,原创最多,阐述最详细,程序越准确者获一等奖!





工控PLC擂台每周一期,本期待74期结束一周后结贴。奖项设置:一等奖2名:50MP,二等奖5名:10MP,三等奖10名:30积分。

MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。

MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。


楼主最近还看过



水中鱼

  • 精华:43帖
  • 求助:4帖
  • 帖子:324帖 | 3802回
  • 年度积分:0
  • 历史总积分:15038
  • 注册:2011年11月10日
发表于:2012-01-11 20:44:33
1楼
S7-200编程语言的基本单位是语句,而语句的构成是指令,每条指令有两部分:一部分是操作码,另一部分是操作数。操作码是指出这条指令的功能是什么,操作数则指明了操作码所需要的数据所在。所谓寻址,就是寻找操作数的过程。S7-200 CPU的寻址分三种:立即寻址、直接寻址、间接寻址。
1.立即寻址
在一条指令中,如果操作码后面的操作数就是操作码所需要的具体数据,这种指令的寻址方式就叫立即寻址。
如:在传送指令中:MOV IN OUT——操作码“MOV”指出该指令的功能把IN中的数据传送到OUT中,其中IN——源操作数,OUT——目标操作数。
若该指令为:MOVD 2505 VD500
功能:将十进制数2505传送到VD500中,这里2505就是源操作数。因这个操作数的数值已经在指令中了,不用再去寻找,这个操作数即立即数。这个寻址方式就是立即寻址方式。而目标操作数的数值在指令中并未给出,只给出了要传送到的地址VD500,这个操作数的寻址方式就是直接寻址。
2.直接寻址
在一条指令中,如果操作码后面的操作数是以操作数所在地址的形式出现的,这种指令的寻址方式就叫直接寻址。比如:A Q【MD100】 A T【DBW100】。程序语句中用方刮号 【 】 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
又如:MOVD VD400 VD500
功能:将VD400中的双字数据传给VD500
3.间接寻址
    在一条指令中,如果操作码后面的操作数是以操作数所在地址的地址形式出现的,这种指令的寻址方式就叫间接寻址。分为存储器间接寻址和寄存器间接寻址
如:MOVD 2505 *VD500
*VD500是指存放2505的地址的地址。如VD500中存放的是VB0,则VD0则是存放2505的地址。该指令的功能:将十进制数2505传送给VD0地址中。
       存储器间接寻址的地址给定格式是:地址标识符+指针。指针所指示存储单元中所包含的数值,就是地址的确切数值单元。

存储器间接寻址具有两个指针格式:单字和双字。

单字指针是一个16bit的结构,从0-15bit,指示一个从0-65535的数值,这个数值就是被寻址的存储区域的编号。

双字指针是一个32bit的结构,从0-2bit,共三位,按照8进制指示被寻址的位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535的数值,这个数值就是被寻址的字节编号。

指针可以存放在MDIDBL区域中,也就是说,可以用这些区域的内容来做指针。

单字指针和双字指针在使用上有很大区别。下面举例说明:

L     DW#16#35    //3216进制数35存入ACC1

 T     MD2         //这个值再存入MD2,这是个32位的位存储区域

 L     +10          //16位整数10存入ACC13216进制数35自动移动到ACC2

T     MW100      //这个值再存入MW100,这是个16位的位存储区域

OPN  DBW【MW100】 //打开DBW10。这里的【MW100】就是个单字指针,存放指针的区域是M区,MW100中的值10,就是指针间接指定的地址,它是个16位的值!

L     L#+10   //32位形式,把10放入ACC1,此时,ACC2中的内容为:16位整数10

T     MD104  //这个值再存入MD104,这是个32位的位存储区域

A     I【MD104】 //I1.2进行与逻辑操作!

=     DIX【MD2】 //赋值背景数据位DIX6.5

A  DB【MW100】.DBX【MD2】 //读入DB10.DBX6.5数据位状态
=  Q【MD2】 //赋值给Q6.5

A  DB【MW100】.DBX【MD2】 //读入DB10.DBX6.5数据位状态

=  Q【MW100】 //错误!!没有Q10这个元件

从上面系列举例我们至少看出来一点:

单字指针只应用在地址标识符是非位的情况下。的确,单字指针前面描述过,它确定的数值是0-65535,而对于byte.bit这种具体位结构来说,只能用双字指针。这是它们的第一个区别,单字指针的另外一个限制就是,它只能对TCDBFCFB进行寻址,通俗地说,单字指针只可以用来指代这些存储区域的编号。

相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,还可以对BYTEWORDDWORD寻址,并且没有区域的限制。不过,有得必有失,在对非位的区域进行寻址时,必须确保其0-2bit为全0

【地址寄存器间接寻址】

在先前所说的存储器间接寻址中,间接指针用MDBDIL直接指定,就是说,指针指向的存储区内容就是指令要执行的确切地址数值单元。但在寄存器间接寻址中,指令要执行的确切地址数值单元,并非寄存器指向的存储区内容,也就是说,寄存器本身也是间接的指向真正的地址数值单元。从寄存器到得出真正的地址数值单元,西门子提供了两种途径:

1、              区域内寄存器间接寻址

2、              区域间寄存器间接寻址

地址寄存器间接寻址的一般格式是:

〖地址标识符〗〖寄存器,P#byte.bit〗,比如:DIX【AR1,P#1.5】 M【AR1,P#0.0】

〖寄存器,P#byte.bit〗统称为:寄存器寻址指针,而〖地址标识符〗在上帖中谈过,它包含〖存储区符〗+〖存储区尺寸符〗。但在这里,情况有所变化。比较一下刚才的例子:

DIX 【AR1,P#1.5】

X 【AR1,P#1.5】

DIX可以认为是我们通常定义的地址标识符,DI是背景数据块存储区域,X是这个存储区域的尺寸符,指的是背景数据块中的位。但下面一个示例中的M呢?X只是指定了存储区域的尺寸符,那么存储区域符在哪里呢?毫无疑问,在AR1中!

DIX 【AR1,P#1.5】 这个例子,要寻址的地址区域事先已经确定,AR1可以改变的只是这个区域内的确切地址数值单元,所以我们称之为:区域内寄存器间接寻址方式,相应的,这里的【AR1,P#1.5】 就叫做区域内寻址指针。

 

水中鱼

  • 精华:43帖
  • 求助:4帖
  • 帖子:324帖 | 3802回
  • 年度积分:0
  • 历史总积分:15038
  • 注册:2011年11月10日
发表于:2012-01-11 20:46:59
2楼

AR的格式】

地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1AR2,每个32位。

当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:

0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0

AR0000 0000 0000 0BBB BBBB BBBB BBBB BXXX

这样规定,就意味着AR的取值只能是:0.0 ——65535.7

例如:当AR=D4hex=0000 0000 0000 0000 0000 0000 1101 0100B),实际上就是等于26.4

而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR中内容肯定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同。

AR1000 0YYY 0000 0 BBB BBBB BBBB BBBB B  XXX

比较一下两种格式的不同,我们发现,这里的第31bit被固定为1,同时,第242526位有了可以取值的范围。聪明的你,肯定可以联想到,这是用于指定存储区域的。对,bit24-26的取值确定了要寻址的区域。

【指针偏移运算法则】

在寄存器寻址指针 【AR1/2,P#byte.bit】 这种结构中,P#byte.bit如何参与运算,得出最终的地址呢?

运算的法则是:AR1P#中的数值,按照BYTE位和BIT位分类相加。BIT位相加按八进制规则运算,而BYTE位相加,则按照十进制规则运算。

例如:寄存器寻址指针是:【AR1P#2.6】,我们分AR1=26.4DBX26.4两种情况来分析。

AR1等于26.4

AR126.2

l      P# 2.6

= 29.7这是区域内寄存器间接寻址的最终确切地址数值单元

AR1等于DBX26.4

AR1DBX26.2

l       P# 2.6

= DBX29.7这是区域间寄存器间接寻址的最终确切地址数值单元

AR的地址数据赋值】

【存储器间接寻址应用实例】
  我们先看一段示例程序:
  L 100
  T MW 100 // 16位整数100传入MW100
  L DW#16#8 // 加载双字16进制数8,当把它用作双字指针时,按照BYTE.BIT结构,
   结果演变过程就是:8H=1000B=1.0
  T MD 2 // MD2=8H
  OPN DB 【MW 100】 // OPN DB100
  L DBW 【MD 2】 // L DB100.DBW1
  T MW【MD2】 // T MW1
  A DBX 【MD 2】 // A DBX1.0
  = M 【MD 2】 // =M1.0

彩云之滇东北

  • 精华:37帖
  • 求助:5帖
  • 帖子:148帖 | 2725回
  • 年度积分:0
  • 历史总积分:21121
  • 注册:2005年6月14日
发表于:2012-01-11 20:50:00
3楼
西门子的楼上的都说了                   

青岛黄工

  • [版主]
  • 精华:5帖
  • 求助:89帖
  • 帖子:171帖 | 4776回
  • 年度积分:0
  • 历史总积分:24301
  • 注册:2007年4月02日
发表于:2012-01-12 16:55:30
4楼
先占个位置,再来补充。

zhxl198808

  • 精华:7帖
  • 求助:14帖
  • 帖子:79帖 | 3915回
  • 年度积分:0
  • 历史总积分:22219
  • 注册:2008年9月06日
发表于:2012-01-17 11:22:45
5楼
引用 青岛黄工 的回复内容:先占个位置,再来补充。



chenminglei0509

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 721回
  • 年度积分:0
  • 历史总积分:5079
  • 注册:2011年3月13日
发表于:2012-01-20 20:48:06
6楼

① 立即数,即常数,也称为数据。在OMRON主推PLC的指令系统中,立即数可用#****&****表示,#****可为BCD码,也可为十六进制码,具体由指令确定;&****则是十进制码。

② 直接地址,操作数若为上述的立即数,则指令对这个立即数进行操作;若为地址,则是对这个地址中内容进行操作。

  间接地址,此时,以这个地址的内容为地址,指令对这个地址的内容进行操作。主推PLC支持D区的间接寻址。地址号前加“*”为D区的BCD间接寻址,如D00010中的内容是15,若操作数为*D00010,则要指令要操作的是D00015中的内容;地址号前加“@”则是D区的十六进制间接寻址,如D00010中的内容为15,当操作数是@D00010时,指令要操作的是D00021中的内容。除了支持D区间接寻址外,这些系列PLC还可以使用索引寄存器(IR)和数据寄存器(DR)进行间接寻址。

a.直接寻址索引寄存器  使用MOVR(560)将一个字或位的内部I/O内存地址传送到一个索引寄存器中(IR0IR15)。

MOVR 0010 IR0    CIO 00010 的内部I/O 内存地址储存在IR0

MOVR 000102 IR2  CIO 00102 内部I/O 内存地址储存在IR2

        b.用索引寄存器间接寻址

        ◆基本操作(无偏移)  把含在IR□中的I/O 内存地址中的字或位作为操作数用。在索引寄存器前放一逗号以表示间接寻址(根据指令或操作数可决定所指定的位/ 字)。

LD IR0         取包含在IR0 中的I/O 内存地址上位的状态。

             MOV #0001 IR1  #0001 传送到包含在IR1 中的I/O 内存地址上的字中。

        ◆常数操作  把偏移值(-2048+2047) 加到包含在IR□中的I/O 内存地址上,并且把结果地址当作操作数用。(指令执行时偏移转换为二进制)

          LD +5 IR0          5 加到包含在IR0 中的I/O 内存地址中,并且取该地址的位状态。

MOV #0001 +31 IR1  31 加到包含在IR1 中的I/O 内存地址上,并且把#0001 传送到该地址的字中。

     DR偏移  把数据寄存器中的带符号二进制内容加到包含在IR□中的I/O 内存地址上并且把结果地址当操作数用。

          LD DR0 IR0          DR0 内容加到包含在IR0 中的I/O 内存地址上,并且取该地址位的状态。

MOV #0001 DR0 IR1   DR0 内容加到包含在IR1 中的I/O 内存地址上,并且把#0001 传送到该地址的字中。

         ◆自动递增  IR□I/O 内存地址后,索引寄存器的内容增加1 2

递增1IR□+

递增2IR□++

           LD IR0 + +       取包含在IR0 中的I/O 内存地址上位的状态,并且使寄存器递增2

MOV #0001 IR1 +  #0001 传送到包含在IR1 中的I/O 内存地址上的字中,并且使寄存器递增1

          ◆自动递减  IR□内容减1 2,然后把寄存器中的I/O 内存地址当操作数用。

递减1– IR□

递减2– –IR□

            LD – – IR0     使IR0 的内容减2,然后取I/O 内存地址上位的状态。

MOV #0001 – IR1  使IR1 的内容减1,然后把#0001传送到该I/O 内存地址的字中

bhdxzgp

  • 精华:8帖
  • 求助:10帖
  • 帖子:197帖 | 5451回
  • 年度积分:0
  • 历史总积分:21613
  • 注册:2006年4月16日
发表于:2012-02-01 22:36:01
7楼

南大傲拓PLC;

寻址方式

寻址,即为梯形图功能模块及其它编程方式访问测点的方法。有下列几种寻址方式可用:

1、   立即寻址

直接以常数作为访问对象。如下图的赋值功能模块,执行功能为把100赋值到%MW0001中,其输入端100即为立即寻址方式。

4.7 立即寻址示意图

  立即寻址方式在数据输入时,十六进制的数据后加字母H,十六进制如果第一个数据为字母,要在前面加0,例如想输入B021H必须写为0B021H,否则系统编译时报错。

2、   直接寻址

直接寻址是以测点类型加测点序号作为访问对象。如图4.7的赋值操作,%MW0001作为一个指定测点,即为直接寻址方式。

作为一种特例,使用测点的名称也属于直接寻址,因为测点名称对应的是一个指定测点。例如:定义测点%I0001的名称为GD_ON,在程序中可以直接使用GD_ON,所指代的就是%I0001

3、   间接寻址

间接寻址,是指访问对象的测点序号不是一个常数,而是另一个测点,即以该测点的当前值作为测点序号。与直接寻址的测点序号不同,间接寻址的测点是从0开始的,即对于一个间接寻址的测点%I【%MW0001】%MW0001的当前值为1,其访问的测点为%I0002,而不是%I0001。如图4.8所示梯形,%Q【%MW0001】即为间接寻址方式。其测点类型为Q,测点序号不是一个常数,而是另一个测点%MW0001。梯形执行的操作为:%MW0001被赋值为0,线圈对开出测点%Q0001输出1

       

4.8 间接寻址示意图


gongkongzhy

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 26回
  • 年度积分:0
  • 历史总积分:307
  • 注册:2011年11月20日
发表于:2012-02-22 23:58:28
8楼
不错;支持一下啊!!!

qiujingsong

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 64回
  • 年度积分:0
  • 历史总积分:304
  • 注册:2006年11月24日
发表于:2012-02-23 11:16:24
9楼

直接寻址,不说了。间接寻址我用过的思路:循环10次,将一个数组分别写到VW0---VW20中。方法:每执行一次程序,VW40+1,VW40=10时清零;VW40每加一时,地址数偏移2,将数组的数值写到偏移后的地址中    

qiujingsong

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 64回
  • 年度积分:0
  • 历史总积分:304
  • 注册:2006年11月24日
发表于:2012-02-23 11:19:39
10楼

CONST

 

number :=12;//数组存放的数据数量

 

END_CONST

 

 

 

VAR_INPUT

 

Tem_actual_input : REAL;//实际温度输入

 

Tem_actual_udt : UDT3;//存放12个温度的结构体变量

 

END_VAR

 

 

 

VAR_IN_OUT

 

Tem_array_1 :ARRAY【1..number】 OF REAL;//从大到小排序的数组

 

END_VAR

 

 

 

VAR_TEMP

 

Index_1 : INT;

 

Index_2 : INT;

 

Tem_temp :REAL;

 

END_VAR

 

 

 

VAR_OUTPUT

 

Tem_actual_output :REAL;//实际值温度输出

 

END_VAR

 

 

 

BEGIN

 

//11组温度放入中间数组

 

Tem_array_1【1】 :=Tem_actual_udt.Tem_01;

 

Tem_array_1【2】 :=Tem_actual_udt.Tem_02;

 

Tem_array_1【3】 :=Tem_actual_udt.Tem_03;

 

Tem_array_1【4】 :=Tem_actual_udt.Tem_04;

 

Tem_array_1【5】 :=Tem_actual_udt.Tem_05;

 

Tem_array_1【6】 :=Tem_actual_udt.Tem_06;

 

Tem_array_1【7】 :=Tem_actual_udt.Tem_07;

 

Tem_array_1【8】 :=Tem_actual_udt.Tem_08;

 

Tem_array_1【9】 :=Tem_actual_udt.Tem_09;

 

Tem_array_1【10】 :=Tem_actual_udt.Tem_10;

 

Tem_array_1【11】 :=Tem_actual_udt.Tem_11;

 

Tem_array_1【12】 :=Tem_actual_udt.Tem_12;

 

//开始冒泡程序

 

FOR Index_1 :=1 TO number-1 BY +1 DO

 

FOR Index_2 :=Index_1+1 TO number BY +1 DO

 

IF Tem_array_1【Index_1】 < Tem_array_1【Index_2】 THEN

 

Tem_temp :=Tem_array_1【Index_2】;

 

Tem_array_1【Index_2】 :=Tem_array_1【Index_1】;

 

Tem_array_1【Index_1】 :=Tem_temp;

 

END_IF;

 

END_FOR;

 

END_FOR;

 

//取中间大小的值作为温度的输出

 

Tem_actual_output :=Tem_array_1【6】;

 

END_FUNCTION

dwb788

  • 精华:0帖
  • 求助:2帖
  • 帖子:7帖 | 57回
  • 年度积分:0
  • 历史总积分:185
  • 注册:2010年9月14日
发表于:2012-02-24 11:47:15
11楼
信捷的PLC 寻址比较方便

dwb788

  • 精华:0帖
  • 求助:2帖
  • 帖子:7帖 | 57回
  • 年度积分:0
  • 历史总积分:185
  • 注册:2010年9月14日
发表于:2012-02-24 11:49:51
12楼
接上图 、  用寻址循环置位

勇者

  • 精华:0帖
  • 求助:1帖
  • 帖子:20帖 | 2756回
  • 年度积分:0
  • 历史总积分:31021
  • 注册:2007年7月13日
发表于:2012-03-02 18:59:44
13楼
1 数据类型
    在V80等OpenPLC内部的每个可寻址的内存在进行访问时,都要通过一些代号来进行寻址的,这些地址代号也含有许多关于数据的其它信息,如数据位,数据类型等。
在程序中的常数通常要加一个前缀,因此,OpenPLC可以知道如何将它翻译成二进制数。
1.    位(bit)是布尔代数类型的数据元素,现代计算机技术的发展已经不在逐位地读写数据了,位是一组一组(以字节或字的形式)地存在内存中的,因此,对每一位的寻址首先要对字节或字进行寻址,然后再确定是哪一位。
2.    一个字节(Byte)由8位组成,可以是独立的8位数,但通常都是按一个整数(0到255)来看待。一个字(word)则由16位组成,一个16位的内存可以存储独立的16位数,也可以将之看成一个从0到65535之间的整数,或者按有符号数,看作-32768到+32767的整数。新的OpenPLC提供了双精度数,由32位整数组成,大约范围是从-20亿到+20亿之间的整数。
3.    OpenPLC为以定时器和计数器的格式专门预留了16位的内存区域,供OpenPLC的定时器和计数器用。虽然每个OpenPLC的制造商的格式不同,但通常都是包括预设值、累计值和一些状态位。前一章对OpenPLC的定时器和计数器已经作了介绍。
4.    中型以上的OpenPLC预留了32位的浮点数,现在已经出现了64位的OpenPLC,可以进行复杂的科学计算。
5.    对于键盘的文本和字母有ASCII码的方式,每个ASCII码占8位内存。
6.    新型的OpenPLC现在允许数组的使用,对ASCII码的数组则成为字符串。
7.    一组没有共同特点不属同一类型的数,成为一个结构(STRUCTURE),可以由一写现代化的OpenPLC控制器来处理,数据结构中包含数组,甚至还包括其它的数据结构,有的PLC的定时器和计数器是放在数据结构中的。
8.    指针是以PLC能够解释的方式存在数据内存区的内存的地址。指针是用来间接寻址的。
为了防止用户编程时将不同的地址和数据的类型混淆,OpenPLC对于编程时的指令有一些保护措施,如防止改变输入映射表和对ASCII码的区域不能改写等,此外,有的指令也只能操作特定的数据类型。
2 寻址方式
PLC允许程序员采用几种寻址方式来在程序中输入内存的地址:
1、    常数。常数是程序中用到的一个数,编程人员不需要知道它在内存中的地址,但是因为它确实存在于内存的某个地方,因此,常数也有一个寻址方式,就称之为常数方式。
2、    最普通的寻址方式是绝对地址模式。它给出了数据存储的准确的地址,通常以一个字符表示数据类型,随后跟一个数字表示内存的位置,所有的PLC都允许绝对寻址方式。
3、    符号寻址。是绝对寻址的变种。程序员用编程器输入一个表格,给每个绝对地址对应一个字符,程序员只要输入这个字符,编程器就会将他转换为绝对地址。
4、    索引寻址,或者允许程序员采用可交换的数据块的方式。这两种方式十分类似。用索引寻址方式,首先要在预先指定的一个内存的位置中放置一个偏移量,当PLC遇到一个指令包括一个基本地址指向一个偏移量,PLC则将把偏移两与基本地址相加,即得到要处理的数据的绝对地址。一般,如果在地址前面有#号标志的,就表示该地址是一个索引地址。而数据块的方式是,用户程序先调用一个数据块(等于建立一个偏移量),以后的地址就是从该地址起始的加上偏移量的地址。
5、    有些PLC可以采用间接寻址的方式,当PLC遇到一个地址属于间接寻址方式时,PLC首先读出该地址的内容,把该地址作为内存的绝对地址,再去处理该绝对地址的内存。第一个地址放的是一个指针,该指针指向第二个地址。
6、    还有些PLC编程采用正式操作符的方式定义所代表的数值,这样一个程序中的数可以由另一个程序来提供和使用。这样,一个字符的正式的操作符的名称在程序里就被用来代替了实际的地址。由于IEC1131-3标准中,每个不同程序和功能需要在内存中有一部分是只能供自己这个程序使用,不能被其它程序使用。当这个IEC1131-3的标准实现后,将有更多的PLC支持使用正规操作

玻璃的心

  • 精华:47帖
  • 求助:2帖
  • 帖子:1303帖 | 5801回
  • 年度积分:0
  • 历史总积分:61251
  • 注册:2010年6月11日
发表于:2012-05-28 22:08:53
14楼
欢迎大家积极参与!!!!!!!!

EBN战略军团-王道火山

  • 精华:2帖
  • 求助:7帖
  • 帖子:101帖 | 1878回
  • 年度积分:0
  • 历史总积分:7858
  • 注册:2012年1月11日
发表于:2012-05-29 09:53:25
15楼
AB的很简单 先占楼 有空再答复!

diaonima

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 617回
  • 年度积分:0
  • 历史总积分:866
  • 注册:2008年5月30日
发表于:2012-05-29 11:02:07
16楼
学习了!我顶!西门子的东西就是难理解!

iceboy851013

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 161回
  • 年度积分:0
  • 历史总积分:3733
  • 注册:2010年8月05日
发表于:2012-05-29 16:11:55
17楼
 西门子S7-300/400PLC的直接寻址方法与S7-200相同。间接寻址方式有“存储器间接寻址”与“寄存器间接寻址”两种。由于S7-300/400具有专用的指针寄存器AR1、AR2,因此,间接寻址建立“地址指针”的方法与指令的表示方法、寻址的范围均与S7-200 PLC有较大的区别,其使用更方便,寻址的范围也更大。
    1.存储器间接寻址
    S7-300/400的存储器间接寻址方式与S7-200 PLC相比,在实际使用中具有两方面明显的区别:
    ①在S7-300/400中,间接寻址不需要建立指针的过程,可以直接在寻址对象的前面加“【】”标记,表示该寻址对象为间接寻址。
    ②间接寻址可以用于二进制位地址。
    【例1】通过局部变量LD10,将输入I22.2读入,与IO.O进行“与”运算,结果输出到QO.1的程序如下:
    LP#22.2    //二进制位数据22.2读入累加器;
    TLD10    //二进制位数据22.2传送到局部变量LD1O中:
    AI【LDIO】    //读入由LDIO确定的输入点;
    AIO.O    //与IO.O进行“与”运算;
    =QO,l    //结果输出到QO.1
    以上指令等效于指令:
    AI22.2
    AIO.O
    =QO.1
    2.寄存器间接寻址
    S7-300/400的寄存器间接寻址是一种利用指针寄存器进行偏移的间接寻址方式,格式为【AR1,m】或【AR2,m】,间接寻址所指定的存储器地址为指针寄存器AR1或AR2的内容与m之和。
    指针寄存器AR1或AR2为双字长寄存器,可以同时存储地址、字节、位等信息,因此,寻址不仅可以在存储器自身的区域内进行(如内部标志M之间、输入I之间等),而且可以在不同的区域内进行(如由内部标志M到输入I等)。
    寄存器各位所代表的含义如下:

地址位(bit31):“0”指针寄存器不含地址符,地址符bit24~bit26应为0:
“1”指针寄存器含地址符,地址符由bit24~bit26指定。
地址符(bit24~bit26):地址位(bit31)为“1”时用于指定存储器地址,地址的编码如下:
000:地址P:
001:地址I;
010:地址Q;
011:地址M;
100:地址DBX;
101:地址DIX;
111:地址L。
    字节编号(bit18~bit3):指定存储器的字节地址,范围为0~65535。
    位编号(bit2~bit0):指定存储器的位地址,范围为0~7。
    指针寄存器可以不含地址符,此时,指针寄存器只需要写入二进制的字节与位数据,地址由逻辑运算指令指定。
    【例2】通过指针寄存器偏移二进制位22.2后,将I32.3读入,与IO.O进行“与”运算,结果输出到QO.1的程序如下:
    LP#22.2    ∥二进制位数据22.2读入累加器1:
    LARI    //累加器l的内容读入指针寄存器ARl:
    AI【ARl,P#10.1】    //将二进制位数据10.1与指针寄存器ARI内容相加,进行间接寻址:
    AIO.O    //与IO.O进行“与”运算:
      QO.1    //结果输出到QO.1;
    以上指令等效于指令:
    AI32.3
    AIO.O
    =QO.1
    在使用二进制位数据时应注意,开关量输入/输出的单位为字节,因此,进行指针寄存器偏移时应利用8进制数进行计算。
    【例3】通过指针寄存器偏移二进制位数据10.5后,将I21.4读入,与IO.O进行“与”运算,结果输出到QO.1的程序如下:
    LP#10.5    ,/将二进制位数据10.5读入累加器1:
    LARI    //将累加器l的内容写入指针寄存器ARl;
    AI【ARI, P#10.7】    //将二进制位数据10.7与指针寄存器ARI内容相加,进行间接寻址;
    AIO.O    ∥与IO.O进行“与”运算;
    =QO.I    //结果输出到QO.1:
    以上指令等效于指令:
    AI21.4
    AIO.O
    =QO.l
    指针寄存器可以含地址符,此时,指针寄存器需要同时写入地址、二进制的字节与位数据,逻辑运算指令不再需要指定地址。
    【例4】将M6.0作为地址指针,将输入IW10的内容写入到MW56中的程序如下:
    L  P#M6.0    //将地址数据M6.0读入累加器l;    ’
    L  AR1    ∥将累加器l的内容写入指针寄存器ARI;
    L  IWIO    //将IWIO的内容读入累加器1:
    T  W【ARI,P#50.0】    /将累加器l的内容写入到MW56(目标地址利用间接寻址方式)
    由于本例属于存储器区域内部寻址,且指针寄存器已经包含了地址M,逻辑运算指令不再需要指定地址。以上指令等效于指令:
  LIW10
  TMW56

a348028603

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 32回
  • 年度积分:0
  • 历史总积分:126
  • 注册:2010年8月19日
发表于:2012-05-29 21:26:03
18楼

求知者来看看,,看了也晕了

天行健

  • 精华:5帖
  • 求助:9帖
  • 帖子:595帖 | 2093回
  • 年度积分:0
  • 历史总积分:23348
  • 注册:2011年6月30日
发表于:2012-05-30 13:26:06
19楼

南大傲拓NA系列PLC寻址方式介绍:

寻址,即为梯形图功能模块及其它编程方式访问测点的方法。有下列几种寻址方式可用:

1、   立即寻址

直接以常数作为访问对象。如下图的赋值功能模块,执行功能为把100赋值到%MW0001中,其输入端100即为立即寻址方式。

                        

  立即寻址方式在数据输入时,十六进制的数据后加字母H,十六进制如果第一个数据为字母,要在前面加0,例如想输入B021H必须写为0B021H,否则系统编译时报错。

2、   直接寻址

直接寻址是以测点类型加测点序号作为访问对象。如图4.7的赋值操作,%MW0001作为一个指定测点,即为直接寻址方式。

作为一种特例,使用测点的名称也属于直接寻址,因为测点名称对应的是一个指定测点。例如:定义测点%I0001的名称为GD_ON,在程序中可以直接使用GD_ON,所指代的就是%I0001

3、   间接寻址

间接寻址,是指访问对象的测点序号不是一个常数,而是另一个测点,即以该测点的当前值作为测点序号。与直接寻址的测点序号不同,间接寻址的测点是从0开始的,即对于一个间接寻址的测点%I【%MW0001】%MW0001的当前值为1,其访问的测点为%I0002,而不是%I0001。如图4.8所示梯形,%Q【%MW0001】即为间接寻址方式。其测点类型为Q,测点序号不是一个常数,而是另一个测点%MW0001。梯形执行的操作为:%MW0001被赋值为0,线圈对开出测点%Q0001输出1

                    

挑山工--王者之师

  • 精华:0帖
  • 求助:1帖
  • 帖子:30帖 | 1083回
  • 年度积分:0
  • 历史总积分:3416
  • 注册:2005年9月03日
发表于:2012-05-31 11:42:10
20楼
顶,支持                                                                                           

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页