西门子 STL 间接寻址常问问题集文献涉及产品1
1 如何获得指针或者间接寻址有关的信息
指针的类型包括 16 位指针、 32 位指针、 Pointer(6Byte)和 Any(10Byte)
16位指针用于定时器、计数器、程序块的寻址;32 位指针用于 I/Q/M/L/ 数据块等存储器中位、字节、字以及双字的寻址,其中第0~2 位表示位地址( 0~7)、第3~18 位为字节地址,其余位未定义; Pointer 和 Any 一般应用在复杂数据类型 (比如 Date_and_Time /Array/String 等)在 FB、FC 之间的传递
而 Any 可以看做是对 Pointer 的延伸,因为由 10Byte 组成的 Any 中 Byte4~Byte9 就是一个 Pointer
了解指针的格式十分重要,为正确使用指针,应阅读如下内容:1、 "SIMATIC Programming with STEP 7 V5
5" 05/2010 第 27
4 章 参数类型2、文档: 1008 用于 S7-300 和 S7-400 的语句表 (STL)编程3、文档: F0215,S7-300 和 S7-400寻址1
2 为什么语句LAR1 P##PointerInput 在一个函数 (FC)中是无效的 ,然而,同样的语句在一个功能块 (FB)中是有效的
在 FC 被调用时,复杂数据类型例如指针是被复制到调用者的临时变量区中,在FC 内部对此 V 区地址直接取址放入到地址寄存器AR1 或 AR2 是不被编译器规则接受的(导致 MC7 寄存器信息过长),也就是说在FC 内部通过 P#进行地址寄存器取址仅能支持Temp 临时变量
因此如果需要在FC 中操作指针等复杂输入输出变量地址需要使用累加器进行中转
考虑到程序的一致性、遵守编译器规则和STL 手册中 LAR1 指令说明,