首先来了解西门子 POINTER 类型的结构,参数类型 POINTER 会存储这些信息:
- DB 编号:(若数据未存储在 DB 中则为 0)
- CPU 中的存储区域:(参数类型 POINTER 存储器区有着对应的十六进制代码,具体可参考相关图表)
- 数据的地址:格式为字节。位
STEP 7 提供指针格式为 p#memory_area byte.bit_address 。当形式参数声明为参数类型 POINTER 时,仅需指明存储区域和地址,STEP 7 会自动调整输入指针格式。例如,为以 M50.0 开始的数据输入参数类型 POINTER,可表示为 P#M50.0。
存储器间接寻址
运用存储器间接寻址的程序语句,由一条指令、[地址] 标识符以及一个括号构成(地址必须放在方括号内)。依据所使用的地址标识符,指令会把指定地址存储的数据解读为字或双字指针。完整的数据地址由地址标识符和指针共同组成,以下为具体示例。这种寻址方式的优势在于,能在程序执行过程中动态修改指令的数据地址。
存储器间接寻址使用的地址包含两部分:
- 地址标识符:
- 位逻辑运算寻址位:可分配地址标识符 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 形式的区域标识符。
- 括在方括号 "[ ]" 内的字或双字指针的地址:
- 字指针:是含有定时器(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 。
区域内寄存器间接寻址
使用区域内寄存器间接寻址的程序语句,由一条指令以及地址标识符 [地址寄存器标识符,地址] 构成。区域内寄存器间接寻址的地址也包含两部分:
- 地址标识符:与存储器间接寻址类似,对于位逻辑运算寻址位、装载指令寻址字节、字和双字以及传送指令寻址字节、字和双字,都有相应可分配的地址标识符。
- 方括号 "[ ]" 中的内容:包括地址寄存器引用(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 (偏移量) 得出。
- 区域内寄存器间接寻址实例:
- 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 个字节计算得出。
区域内寄存器间接寻址的特点在于,地址标识符在方括号前确定,方括号中的指针均不含存储区信息,否则会与方括号前地址标识符表示的存储区冲突。
跨区域寄存器间接寻址
使用跨区域寄存器间接寻址的程序语句,同样由一条指令以及地址标识符 [地址寄存器标识符,地址] 构成。其地址包含两部分:
- 对已寻址的数据对象 (地址标识符) 大小的规定:数据对象大小规定,位(无规定表示是一个位),B 为字节,W 为字,D 为双字。
- 方括号 "[ ]" 中的内容:包括地址寄存器引用(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 (偏移量) 得出。
- 第二个实例:
- 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 中指出。
- L B [AR1, P#10.0] :将字节(位置由 AR1 的内容加上 10 个字节计算得出)载入 ACCU 1,位的存储区在 AR1 的位 24、25 和 26 中指出。
- T D [AR2,P#53.0] :将 ACCU 1 的内容传送到双字(精确位置由 AR2 的内容加上 53 个字节计算得出),位的存储区在 AR1 的位 24、25 和 26 中指出。
跨区域寄存器间接寻址的特点是,地址标识符在方括号前确定,方括号中的地址寄存器包含存储区信息,如 [AR1,P#4.3] 中 AR1 = P#Q0.3 。
区域内寄存器间接寻址和跨区域寄存器间接寻址应用灵活,可按需选择。区域内寄存器间接寻址针对存储区固定的间接寻址,寻址存储区确定;而跨区域寄存器间接寻址在指令中不确定存储区,由地址寄存器中指针信息确定,因此寻址存储区可变。
4.


