S7-200系列PLC的寻址方式
S7-200的寻址方式主要分为三种:立即寻址、直接寻址和间接寻址。其中,直接寻址是最常用、最基本的寻址方式。
1. 立即寻址
这是最简单的一种寻址方式。指令的操作数(数据)直接在指令中给出,是一个明确的常数。
- 特点:数据本身(常量)包含在指令操作码中。
- 格式:通常以 #开头或直接书写数值,但在S7-200的指令中,通常直接书写常数。
- 示例:MOVW 16#1234, VW100// 将十六进制常数 1234传送到VW100中。SET指令虽然不带操作数,但其功能是立即使逻辑结果置位。MOVB 100, VB10// 将十进制常数 100传送到VB10中。
2. 直接寻址(最常用)
这是最核心的寻址方式。指令的操作数是PLC存储区的地址。程序直接使用这个地址来访问数据。
直接寻址的核心在于掌握S7-200的存储区划分和地址格式。
存储区分类:
S7-200将存储器划分为几个不同的区域,每个区域有特定的功能:
| 存储区符号 | 名称与功能 | 位寻址举例 | 字节/字/双字寻址举例 |
| I | 输入映像寄存器。物理输入点的状态映射区,在每个扫描周期的开始阶段刷新。 | I0.0, I1.5 | IB0, IW0, ID0 |
| Q | 输出映像寄存器。物理输出点的状态映射区,在每个扫描周期的结束阶段刷新到实际输出点。 | Q0.0, Q0.7 | QB0, QW0, QD0 |
| M | 位存储器(中间继电器)。在程序内部用于存储中间结果的位存储器。 | M0.0, M10.1 | MB10, MW20, MD30 |
| V | 变量存储器。功能最强大的存储区,可以按位、字节、字、双字访问,用于存储程序中的各种变量和数据。 | V100.0 | VB100, VW100, VD100 |
| SM | 特殊存储器。用于提供PLC状态信息,并控制PLC的特殊功能(如首次扫描脉冲、模拟电位器值等)。只读居多。 | SM0.1(首次扫描ON) | SMB5, SMW22 |
| S | 顺序控制继电器。通常与顺序控制继电器指令(SCR)配合使用,用于组织顺序控制程序的步。 | S0.0, S2.1 | |
| T | 定时器。访问定时器的当前值和位状态。 | T37(定时器位) | T37(当前值,字) |
| C | 计数器。访问计数器的当前值和位状态。 | C0(计数器位) | C0(当前值,字) |
| AI | 模拟量输入。用于读取模拟量扩展模块的输入值。只能进行字读取。 | 无 | AIW0, AIW2 |
| AQ | 模拟量输出。用于向模拟量扩展模块写入输出值。只能进行字写入。 | 无 | AQW0, AQW2 |
| L | 局部变量存储器。用于存储临时数据,仅在创建它的程序块(如子程序)中有效。 | L0.0 | LB0, LW0, LD0 |
| HC | 高速计数器。用于累计比PLC扫描周期更快的脉冲。只能进行双字读取。 | 无 | HC0, HC1(32位) |
| AC | 累加器。用于执行指令时暂存数据的寄存器,可以像字节、字、双字一样使用。 | 无 | AC0, AC1, AC2, AC3 |
地址格式:
直接寻址的地址由两部分组成:区域标识符 + 地址编号。
- 位寻址: 访问一个布尔量(Bit),即开关量(0/1)。格式: [区域标识符] [字节地址] . [位地址]示例:I0.1: 输入字节0的第1位。Q1.5: 输出字节1的第5位。V10.2: 变量存储区字节10的第2位。
- 字节、字、双字寻址: 访问8位、16位、32位的数据。格式: [区域标识符] [数据大小] [起始字节地址]数据大小标识符:B(Byte,字节): 8位,如 VB100W(Word,字): 16位,如 VW100(由VB100和VB101组成,VB100为高字节)D(Double Word,双字): 32位,如 VD100(由VB100到VB103组成,VB100为最高字节)示例:VB100: 变量存储区的第100个字节。VW100: 变量存储区从第100个字节开始的一个字(包含VB100和VB101)。VD100: 变量存储区从第100个字节开始的一个双字(包含VB100, VB101, VB102, VB103)。
重要提示: 字节、字、双字的地址是重叠的。例如,如果你向 VD100写入一个数据,它会覆盖 VW100, VW102, VB100, VB101, VB102, VB103中的所有数据。编程时需特别注意避免地址重叠冲突。
3. 间接寻址
间接寻址是指指令的操作数不是数据的直接地址,而是一个指向该地址的指针。指针本身存储在另一个存储单元中。这为处理数据表、数组等连续数据提供了极大的灵活性。
在S7-200中,间接寻址主要通过指针来实现。
实现步骤:
- 创建指针: 将一个存储区的地址移动到指针变量中。指针必须是双字(DWord)类型。为了表示这是一个地址,需要在地址前加上 &符号(“取地址”符号)。MOVD &VB200, VD500// 将VB200的地址(而不是VB200中的值)存入VD500中。现在VD500就是一个指针,它指向VB200。
- 使用指针间接寻址: 在指令中,通过在指针前加 *符号(“间接寻址”符号)来访问指针所指向地址中的数据。MOVW *VD500, VW300// 将指针VD500所指向的地址(即VB200)中的字数据(即VW200),传送到VW300中。
- 修改指针: 通过数学运算(如加法指令INC)可以改变指针的值,从而访问相邻的数据,这在遍历数组时非常有用。MOVD &VB200, AC1// 将VB200的地址存入累加器AC1。MOVW *AC1, VW300// 将AC1指向的地址(VB200)中的数据(VW200)送到VW300。+I 2, AC1// 将AC1中的地址值增加2个字节(因为下一个字数据在2个字节之后)。MOVW *AC1, VW302// 现在AC1指向VB202,将VW202送到VW302。
注意:
- 只能使用 VD, LD, AC作为指针的存储单元。
- 不能对位地址(如I、Q、M的位)进行间接寻址。
- 确保指针指向的地址是有效的,否则可能导致运行时错误。
总结
| 寻址方式 | 含义 | 优点 | 缺点 | 适用场景 |
| 立即寻址 | 操作数是常数本身 | 简单、直接 | 数据固定,不灵活 | 设置固定参数,如定时器预设值、比较常数等 |
| 直接寻址 | 操作数是数据的直接地址 | 最常用、直观、易于理解 | 处理数据块时不灵活 | 绝大多数PLC逻辑控制程序 |
| 间接寻址 | 操作数是一个指向数据地址的指针 | 非常灵活,适合处理批量数据 | 复杂,容易出错 | 数据块移动、查找表、配方处理、循环操作等 |