指针在接口中的用法

指针在接口中的用法

指针在西门子的PLC中有很重要的地位,本文就部分用法进行记录

  • 指针在接口中的用法
    • 指针的大致分类
      • 16位指针
      • 32位指针
      • 地址寄存器寻址
        • 内部地址寻址
        • 交叉区域寻址
      • pointer指针
      • ANY指针
    • 处理方法
      • Pointer指针
      • ANY指针


指针的大致分类

16位指针

  • 16位的指针主要用于定时器、计数器、程序块的寻址。
    • 例如,可以将一个数字1放入MW0里面,那么T[MW0]即是表示T1,而C[MW0]即是表示C1,FB[MW0]即是表示FB1,FC[MW0]即使FC1,DB[MW0]即使DB1。
    • 此十六位的指针会根据MW0的值不同,而改变寻址的定时器、计数器、程序块的不同。

32位指针

  • 32位的指针主要用于I、Q、M、L、DB块等寄存器中的位,字节,字和双字等的寻址。
    • 一般的将其放在MD或者是LD里面。
    • 在32位指针中,第3位到第18位为需要操作的数据的字节部分的数值
    • 在32位指针中,第0位到第2位为需要操作的数据的位的部分的数值
    • 在32位指针中,第19位到31位为保留位
    • 当对某个数据以字节、字、双字等进行操作寻址时,指针的第0位到第3位必须要为0,这是语法规定
    • 例如,如果将P#1.0放入MD10中,那么对M1.0操作为M[MD10],对MB1操作为MB[MD10],对MW1操作为MW[MD10],对MD1操作为MD[MD10]。而对DB块中进行寻址,就需要用到指令
      • OPN DB1
      • L DBB[MD10]
      • T MB20
        该指令即是把DB1.DBB1中的值送入到MD20中。

地址寄存器寻址

地址寄存器寻址分为内部地址寻址和交叉地址寻址

内部地址寻址

  • 内部地址寻址部分,基本上可以将地址寄存器相当于是32位的指针寻址
    • 内部地址寄存器的寻址规则:
      • 语法定义:地址标识符[AR1,地址偏移量]
      • 例如,
        • OPN DB1
        • L P#10.0
        • LAR1
        • L DBW[AR1,P#12.0]
        • T MW100
          此时,即是将DB1.DBW22的值传到MW100中。

交叉区域寻址

  • 交叉区域寻址,从第0位到第18位和32位指针的寻址方式一样。
  • 当地址寄存器的第31位为1时即是表示在使用交叉区域寻址方式
  • 地址寄存器的第24位到26位为区域标识符
  • 其中

    第24位到26位的值 代表的区域 备注
    000 无地址区 P#0.0
    001 I区 P#I12.0
    010 Q区 P#Q2.0
    011 M区 P#M2.2
    100 DB区 P#DB1.DBX0.0
    101 DI区 P#DI2.DIX2.0
    110 L区 P#L32.0
    111 V区 P#V20.0

在寄存器寻址中,交叉区域寻址最为重要,很多地方都会用到。因为他可以跨区域进行寻址。
其基本语法如下:

OPN DB1
L P#12.0
LAR1
L W[AR1,P#0.0]
T MW60

在这里先是打开DB1块,然后将DBW12的值传送到MW60里面。地址第4行的W指出了使用寻址大小为

pointer指针

  • Pointer指针常用于向FB、FC传递参数时使用。
  • Pointer指针由6个字节组成
  • 用于向被调用的FB、FC传递复合数据类型(array,dt、struct等)的实参
  • 在被调用的FB、FC内部可以间接访问实参的存储器
字节数 代表的区域 备注
Word0 DB块号或0 若为DB区寻址则写入DB块号,若为其他寻址则写入0
Word2的第8到15位 数据区标识符 具体见下面一张表
Word2的第3到7位 写入0 语法要求
Word2的第0到2位 与Word4的第3到15位组合成字节地址 寻址的字节地址
Word4的第3到15位 与Word2的第0到2位组合成字节地址 寻址的字节地址
Word4的第0到2位 位地址 要寻址的位

上面即是对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

ANY指针

  • ANY指针为传递指针的形参数据类型
  • ANY指针的长度为10个字节

处理方法

Pointer指针

      L     P##P1
      LAR1  

//    T     MD  1000


      L     W [AR1,P#0.0]
      T     MW    50

      L     W [AR1,P#2.0]
      T     MW    52

      L     W [AR1,P#4.0]
      T     MW    54

      L     P#2.0
      L     MW    20
      *I    
      T     MD    24

      L     MD    24
      L     MD    52
      +D    
      T     MD    52


      L     MD    52
      LAR1  





      OPN   DB [MW 50]

      L     W [AR1,P#0.0]
      T     MW    10

在以上程序段中,P1为一个Pointer类型的指针输入接口。此案例即是将Pointer指针的值分别拆分送入到MW50,MW52,MW54中。这样便可以对Pointer指针进行分析以及后续的操作。

ANY指针

ANY指针的使用就相对来说简单些。他的每个字节的含义都在资料里面很清楚的说明。在使用的时候,只需要在Temp区声明一个ANY指针类型的变量,然后将输入的值送入到ANY指针的L区的相应位置即可。

你可能感兴趣的:(工作)