西门子 S7-200 PLC 的寻址方式
好的,针对西门子 S7-200 PLC 的寻址方式,我们来做一个系统、详细的详解。S7-200 的寻址方式清晰且经典,是理解其他西门子 PLC 寻址的基础。
核心概念
- 存储区:PLC 中用于存储不同功能数据的区域。
- 地址:数据在存储区中的具体位置。
- 数据类型:数据的大小和格式,决定了寻址的写法。
一、存储区标识符(关键字母)
这是寻址的第一个部分,指明数据存放在哪个区域。
| 区域标识符 | 区域名称 | 主要用途 |
|---|---|---|
| I | 输入映像寄存器 | 读取外部物理输入点(如按钮、传感器)的状态。通常只读。 |
| Q | 输出映像寄存器 | 控制外部物理输出点(如继电器、指示灯)的状态。可读写。 |
| M | 位存储器(中间继电器) | PLC内部的通用辅助继电器,无物理对应点,用于程序中间逻辑。可读写。 |
| V | 变量存储器 | S7-200中最主要、最灵活的存储区,用于存储程序数据、中间结果等。可读写。 |
| SM | 特殊存储器 | 提供特定功能的位或字(如首次扫描位、脉冲、通信状态等)。部分只读。 |
| S | 顺序控制继电器 | 主要用于顺序控制(SCR)指令。 |
| T | 定时器 | 存储定时器当前值和状态位(TON, TOF, TONR)。 |
| C | 计数器 | 存储计数器当前值和状态位(CTU, CTD, CTUD)。 |
| AI | 模拟量输入 | 读取外部模拟量输入值(如0-10V, 4-20mA),只读字。 |
| AQ | 模拟量输出 | 写入外部模拟量输出值,可写字。 |
| AC | 累加器 | 高速读写寄存器(AC0-AC3),常用于数学运算、指针等。 |
| HC | 高速计数器 | 记录高速脉冲,只读双字。 |
| L | 局部存储器 | 仅在调用它的程序块(子程序、中断程序)内有效。 |
二、直接寻址
直接寻址是直接给出数据所在的确切地址。其通用格式为:
区域标识符 + 数据大小标识 + 字节地址.位地址
1. 位寻址(Bit Addressing)
访问一个布尔量(1位)。
- 格式:
区域标识 + 字节地址.位地址 - 例子:
I0.0:输入字节0的第0位。(第一个输入点)Q1.2:输出字节1的第2位。M3.7:位存储器M3字节的第7位。V10.4:变量存储器V10字节的第4位。SM0.1:特殊存储器SM0字节的第1位(此位是“首次扫描ON”位)。
2. 字节、字、双字寻址(Byte, Word, DWord Addressing)
访问一个连续的8位、16位或32位数据。
- 数据大小标识:
- B (Byte):字节,8位,如
VB100 - W (Word):字,16位(2字节),如
VW100 - D (DWord):双字,32位(4字节),如
VD100
- B (Byte):字节,8位,如
- 关键规则:
- 地址必须是对齐的:
VW100由VB100和VB101组成。VD100由VB100,VB101,VB102,VB103组成。 - 不要地址重叠:定义了
VW100后,就不能再用VB101单独存放其他数据,因为它们重叠了。
- 地址必须是对齐的:
- 例子:
VB20:变量存储器的第20个字节。VW20:变量存储器的第20个字(包含VB20和VB21)。VD20:变量存储器的第20个双字(包含VB20,VB21,VB22,VB23)。MB10:位存储器的第10个字节。T37:定时器T37的当前值(16位字,直接写T37即可)。C10:计数器C10的当前值(16位字)。AIW16:模拟量输入字16(如读取第一路模拟量输入)。AQW30:模拟量输出字30。
3. 常数寻址
常数直接写在指令中,无需存储区地址。
- 格式:根据进制不同
- 二进制:
2#1010_0110(2#开头) - 十进制:
100或-50(常用) - 十六进制:
16#ABCD或16#F(16#开头) - ASCII码:
‘Text’(单引号)
- 二进制:
- 例子:
MOVW 16#0A0B, VW100// 将十六进制常数0A0B传送到 VW100。ADDW VW10, 100, VW20// 将 VW10 的值加上常数 100,结果存到 VW20。
三、间接寻址(指针寻址)
间接寻址不是直接给出地址,而是通过一个指针(存放地址的变量) 来找到最终的数据地址。这是S7-200编程中比较高级但强大的技巧。
-
核心:用
*号表示“取指针所指向地址中的值”。 -
步骤:
- 创建指针:指针必须是双字(DWord),使用
&符号获取某个地址(如&VB200),并将其存入一个双字地址(如VD250,AC1)。 - 使用指针:在指令中,通过
*加上指针变量来访问数据。 - 修改指针:可以通过数学运算(如
+D,INCD)改变指针的值,从而遍历数据。
- 创建指针:指针必须是双字(DWord),使用
-
例子:使用指针访问连续的数据块
// 1. 建立指针:将 VB200 的地址存入 AC1(累加器1) MOVD &VB200, AC1 // 现在 AC1 中存放的“值”是 VB200 的地址 // 2. 通过指针写入数据 MOVB 16#FF, *AC1 // 将 16#FF 写入 AC1 所指向的地址(即 VB200) // 3. 移动指针(增加1个字节) INCD AC1 // AC1 = AC1 + 1, 现在 AC1 指向 VB201 // 4. 再次通过新指针写入数据 MOVB 16#AA, *AC1 // 将 16#AA 写入 AC1 所指向的地址(即 VB201)执行后:
VB200 = 16#FF,VB201 = 16#AA。 -
注意事项:
- 指针必须用双字(
VD,LD,AC等)。 - 确保指针值指向合法的PLC存储区。
- 常用于处理数组、循环、配方等需要灵活访问大量数据的场景。
- 指针必须用双字(
四、常用地址举例与对比
| 地址写法 | 含义 | 数据类型 |
|---|---|---|
I0.1 |
数字量输入点,第0字节第1位。 | 位 (Bool) |
Q1.5 |
数字量输出点,第1字节第5位。 | 位 (Bool) |
VW100 |
变量存储区的一个字,包含 VB100(高8位)和 VB101(低8位)。 |
字 (Int) |
VD500 |
变量存储区的一个双字,包含 VB500 到 VB503。 |
双字 (DInt/Real) |
T37 |
定时器T37的当前值(16位整数)。 | 字 (Int) |
C5 |
计数器C5的当前值(16位整数)。 | 字 (Int) |
AIW0 |
第一个模拟量输入通道的数值(0-32000等)。 | 字 (Int) |
AQW4 |
第二个模拟量输出通道的设定值。 | 字 (Int) |
SM0.0 |
“常ON”位,在程序中始终为1。 | 位 (Bool) |
SM0.1 |
“首次扫描ON”位,仅在程序第一次扫描时为1,常用于初始化。 | 位 (Bool) |
S0.0 |
顺序控制继电器位。 | 位 (Bool) |
*AC1 |
AC1累加器中存储的地址所指向的数据。 | 取决于上下文 |
&VB300 |
获取 VB300 的地址值,用于创建指针。 |
双字 (地址) |
重要提醒与常见错误
- 地址重叠:使用了
VW100,又单独使用VB101或VD100,会导致数据混乱。 - 数据类型匹配:确保指令的数据类型与地址类型一致。例如,不能将
VW10(字)直接与VB10(字节)相加。 - 断电保持:
M区和V区都可以在系统块中设置为断电保持,但默认情况下V区保持的范围更大。 - 模拟量地址:
AI和AQ总是以字(W)为单位访问,没有位寻址。 - 间接寻址初始化:使用间接寻址前,务必确保指针已被正确赋值。
掌握以上寻址方式,你就能熟练地在 S7-200 PLC 中存取和操作数据,为编写复杂、高效的控制程序打下坚实基础。

浙公网安备 33010602011771号