西门子S7-200 SMART教程第三课
第三课
深入理解S7-200 SMART的存储器结构与数据访问方式
预计学习时间:80分钟
难度级别:基础
关键词:寻址 存储器 数据类型 变量
学习目标:通过本课学习,你将完全掌握S7-200 SMART的存储器结构、各种寻址方式、数据类型的使用方法,并能够正确规划和使用变量存储区。
一、S7-200 SMART存储器结构
S7-200 SMART PLC的存储器被划分为多个区域,每个区域有特定的功能和地址范围。理解这些存储区是正确编程的基础。
I区 输入映像寄存器
地址范围:I0.0 - I31.7
点数:256点(32字节)
功能:存储所有数字量输入点的状态。PLC在每个扫描周期开始时读取所有输入点的状态并存储到I区。
Q区 输出映像寄存器
地址范围:Q0.0 - Q31.7
点数:256点(32字节)
功能:存储所有数字量输出点的状态。程序执行结果写入Q区,扫描周期结束时输出到实际输出点。
M区 中间继电器
地址范围:M0.0 - M31.7
点数:256点(32字节)
功能:程序内部使用的辅助继电器,不直接对应物理输入输出,用于程序逻辑控制。
V区 变量存储器
地址范围:VB0 - VB8191
大小:8KB(8192字节)
功能:用户自定义变量存储区,可存储各种类型的数据,是编程中最常用的存储区。
SM区 特殊存储器
地址范围:SM0.0 - SM179.7
大小:180字节
功能:存储PLC状态信息和系统标志位,如SM0.0始终为1,SM0.5为1Hz脉冲。
T区 定时器
地址范围:T0 - T255
数量:256个
功能:定时器存储区,每个定时器占用3个字(6字节),存储当前值和状态位。
C区 计数器
地址范围:C0 - C255
数量:256个
功能:计数器存储区,每个计数器占用3个字(6字节),存储当前值和状态位。
AI区 模拟量输入
地址范围:AIW0 - AIW62
点数:32点(16字)
功能:存储模拟量输入值,每个模拟量输入占用1个字(2字节),数值范围0-32000。
AQ区 模拟量输出
地址范围:AQW0 - AQW62
点数:32点(16字)
功能:存储模拟量输出值,每个模拟量输出占用1个字(2字节),数值范围0-32000。
1.1 存储器特性对比
|
存储区
|
掉电保持
|
读写特性
|
最大范围
|
扩展性
|
|
I区 输入
|
不保持
|
只读
|
I0.0 - I31.7
|
不可扩展
|
|
Q区 输出
|
不保持
|
可读写
|
Q0.0 - Q31.7
|
不可扩展
|
|
M区 中间
|
部分保持
|
可读写
|
M0.0 - M31.7
|
不可扩展
|
|
V区 变量
|
可设置
|
可读写
|
VB0 - VB8191
|
不可扩展
|
|
T区 定时器
|
TONR保持
|
可读写
|
T0 - T255
|
不可扩展
|
|
C区 计数器
|
可设置
|
可读写
|
C0 - C255
|
不可扩展
|
二、寻址方式详解
2.1 位寻址(Bit Addressing)
位寻址是最基本的寻址方式,直接访问一个二进制位(0或1)。
// 位寻址格式:存储区标识符 + 字节地址.位地址
I0.0 // 输入字节0的第0位
Q0.1 // 输出字节0的第1位
M0.2 // 中间继电器字节0的第2位
V100.3 // 变量字节100的第3位
// 位寻址范围:0.0 - 31.7
// 字节地址:0-31
// 位地址:0-7
2.2 字节寻址(Byte Addressing)
字节寻址以字节(8位)为单位访问数据。
// 字节寻址格式:存储区标识符 + B + 字节地址
IB0 // 输入字节0(包含I0.0-I0.7)
QB0 // 输出字节0(包含Q0.0-Q0.7)
MB0 // 中间继电器字节0
VB100 // 变量字节100
// 字节寻址范围:
// IB0 - IB31 (32个输入字节)
// QB0 - QB31 (32个输出字节)
// MB0 - MB31 (32个中间字节)
// VB0 - VB8191 (8192个变量字节)
2.3 字寻址(Word Addressing)
字寻址以字(16位,2字节)为单位访问数据。
// 字寻址格式:存储区标识符 + W + 字地址
IW0 // 输入字0(包含IB0-IB1)
QW0 // 输出字0(包含QB0-QB1)
MW0 // 中间继电器字0
VW100 // 变量字100(包含VB100-VB101)
// 重要规则:字地址必须是偶数
// 正确:VW0, VW2, VW4, VW6, ...
// 错误:VW1, VW3, VW5, VW7, ...
// 字寻址的字节对应关系:
// VW100 包含 VB100(高字节)和 VB101(低字节)
// 在PLC中,高字节在前,低字节在后
2.4 双字寻址(Double Word Addressing)
双字寻址以双字(32位,4字节)为单位访问数据。
// 双字寻址格式:存储区标识符 + D + 双字地址
ID0 // 输入双字0(包含IB0-IB3)
QD0 // 输出双字0(包含QB0-QB3)
MD0 // 中间继电器双字0
VD100 // 变量双字100(包含VB100-VB103)
// 重要规则:双字地址必须是4的倍数
// 正确:VD0, VD4, VD8, VD12, ...
// 错误:VD1, VD2, VD3, VD5, ...
// 双字寻址的字节对应关系:
// VD100 包含 VB100(最高字节)到 VB103(最低字节)
// 存储顺序:VB100 | VB101 | VB102 | VB103
2.5 寻址方式对比表
|
寻址方式
|
标识符
|
数据长度
|
地址规则
|
示例
|
包含的字节
|
|
位寻址
|
X.Y
|
1位
|
字节.位(0.0-31.7)
|
I0.0, Q0.1
|
单个位
|
|
字节寻址
|
XB
|
8位
|
字节地址(0-8191)
|
IB0, VB100
|
1个字节
|
|
字寻址
|
XW
|
16位
|
偶数地址(0,2,4...)
|
IW0, VW100
|
2个连续字节
|
|
双字寻址
|
XD
|
32位
|
4的倍数(0,4,8...)
|
ID0, VD100
|
4个连续字节
|
重要注意事项:
1. 字地址必须是偶数(0,2,4,6,...)
2. 双字地址必须是4的倍数(0,4,8,12,...)
3. 地址重叠会导致数据错误
4. 不要使用重复的地址
三、数据类型详解
3.1 布尔型 BOOL
长度:1位
取值范围:0或1
存储区:I, Q, M, V, SM
用于表示开关量状态,如按钮、指示灯、继电器等。
示例:
I0.0 // 启动按钮
Q0.0 // 电机运行
M0.0 // 运行标志
V100.0 // 故障标志
3.2 字节型 BYTE
长度:8位(1字节)
取值范围:0-255(无符号)
存储区:I, Q, M, V, SM
用于存储8位二进制数据,如BCD码、ASCII码等。
示例:
VB0 // 存储设备状态字节
MB0 // 中间状态字节
QB0 // 输出状态字节
3.3 整数型 INT
长度:16位(2字节)
取值范围:-32768 到 +32767
存储区:V, M, SM, AI, AQ
用于存储有符号整数,如计数器值、位置值等。
示例:
VW0 // 生产数量
MW0 // 温度设定值
AIW0 // 模拟量输入值
3.4 无符号整数型 WORD
长度:16位(2字节)
取值范围:0-65535
存储区:V, M, SM, AI, AQ
用于存储无符号整数,如定时器当前值、编码器值等。
示例:
VW2 // 定时器当前值
AIW2 // 压力传感器值
AQW0 // 模拟量输出值
3.5 双整数型 DINT
长度:32位(4字节)
取值范围:-2147483648 到 +2147483647
存储区:V, M, SM
用于存储大范围有符号整数,如累计产量、距离值等。
示例:
VD0 // 累计产量
MD0 // 位置设定值
VD4 // 运行时间累计
3.6 实数型 REAL
长度:32位(4字节)
取值范围:±1.175495e-38 到 ±3.402823e+38
存储区:V, M, SM
用于存储浮点数,如温度、压力、流量等工程值。
示例:
VD8 // 温度值 25.5
VD12 // 压力值 0.85
VD16 // 流量值 12.34
3.7 字符串型 STRING
长度:最大254字符
格式:头部+字符串
存储区:V, M
用于存储文本信息,如产品名称、操作提示等。
示例:
VB20 // 字符串起始地址
格式:最大长度 | 实际长度 | 字符数据
例如:"ABC"存储为:03 03 41 42 43
3.8 数据类型转换关系
|
转换类型
|
源类型
|
目标类型
|
转换方法
|
注意事项
|
|
字节到字
|
BYTE
|
WORD
|
MOVB VB0, VW0
|
需注意字节顺序
|
|
字到双字
|
WORD
|
DWORD
|
MOVW VW0, VD0
|
自动填充高16位为0
|
|
整数到实数
|
INT
|
REAL
|
ITD VW0, VD0
DTR VD0, VD4
|
需先转双整数
|
|
实数到整数
|
REAL
|
INT
|
ROUND VD0, VD4
DTI VD4, VW8
|
需先四舍五入
|
四、特殊存储器SM区详解
SM区是系统特殊存储器,包含PLC状态信息和系统标志位,这些位是只读的,由PLC系统自动更新。
|
SM地址
|
名称
|
功能描述
|
状态
|
|
SM0.0
|
Always ON
|
始终为1(TRUE)
|
始终接通
|
|
SM0.1
|
First Scan
|
第一次扫描时为1,之后为0
|
初始化脉冲
|
|
SM0.2
|
Retentive Lost
|
保持数据丢失时为1
|
数据丢失标志
|
|
SM0.3
|
Run After Power Up
|
上电进入RUN时为1
|
上电运行标志
|
|
SM0.4
|
1 Minute Pulse
|
1分钟时钟脉冲(30秒ON/30秒OFF)
|
1分钟周期
|
|
SM0.5
|
1 Second Pulse
|
1秒钟时钟脉冲(0.5秒ON/0.5秒OFF)
|
1秒钟周期
|
|
SM0.6
|
Scan Clock
|
扫描时钟脉冲(本次扫描ON,下次扫描OFF)
|
扫描周期交替
|
|
SM0.7
|
Mode Switch
|
模式开关位置(0=TERM,1=RUN)
|
模式指示
|
|
SM1.0
|
Zero Flag
|
运算结果为0时置1
|
零标志位
|
|
SM1.1
|
Overflow Flag
|
运算结果溢出时置1
|
溢出标志
|
|
SM1.2
|
Negative Flag
|
运算结果为负时置1
|
负数标志
|
// 特殊存储器的典型应用
网络1:利用SM0.5实现指示灯闪烁
LD SM0.5 // 1Hz脉冲
= Q0.0 // 指示灯闪烁
网络2:利用SM0.1进行初始化
LD SM0.1 // 第一次扫描
MOVW 0, VW0 // 清零计数器
MOVW 100, VW2 // 设定初始值
网络3:利用SM1.0判断运算结果
LD I0.0 // 启动运算
MOVW VW10, VW12
-I 50, VW12 // VW12 = VW10 - 50
A SM1.0 // 如果结果为0
= Q0.1 // 结果为零指示灯亮
五、V区地址规划与使用
5.1 V区地址规划原则
1 分区管理
将V区按照功能进行分区,避免地址冲突。
// V区地址规划示例
// 系统标志区:VB0 - VB99
VB0 - VB19 // 系统状态标志
VB20 - VB39 // 错误代码存储
VB40 - VB59 // 操作模式标志
VB60 - VB99 // 系统保留
// 过程变量区:VB100 - VB499
VB100 - VB199 // 模拟量处理
VB200 - VB299 // 数字量状态
VB300 - VB399 // 控制参数
VB400 - VB499 // 临时变量
// 配方数据区:VB500 - VB999
VB500 - VB699 // 配方1参数
VB700 - VB899 // 配方2参数
VB900 - VB999 // 当前配方
// 通信数据区:VB1000 - VB1499
VB1000 - VB1199 // Modbus通信
VB1200 - VB1399 // 以太网通信
VB1400 - VB1499 // 自由口通信
// 用户数据区:VB1500 - VB8191
// 根据实际需要分配
2 数据类型对齐
按照数据类型的要求正确分配地址。
|
数据类型
|
地址要求
|
示例
|
说明
|
|
BOOL
|
任意
|
V100.0 - V100.7
|
可按位使用
|
|
BYTE
|
任意
|
VB200, VB201
|
无特殊要求
|
|
WORD
|
偶数地址
|
VW300, VW302
|
必须是偶数
|
|
DWORD/REAL
|
4的倍数
|
VD400, VD404
|
必须是4的倍数
|
5.2 变量命名规范
// 变量命名建议使用匈牙利命名法
// 前缀表示数据类型
b - BOOL (位变量)
by - BYTE (字节变量)
w - WORD (字变量)
i - INT (整数)
dw - DWORD (双字)
r - REAL (实数)
s - STRING (字符串)
// 中间表示功能
Sta - 状态
Cmd - 命令
Set - 设定值
Act - 实际值
Alm - 报警
Cnt - 计数
// 示例:
bRunSta // 运行状态
bFaultAlm // 故障报警
wProdCnt // 产量计数
iTempSet // 温度设定值
rPressAct // 压力实际值
sProdName // 产品名称
六、综合实例:温度控制系统地址规划
项目要求
设计一个温度控制系统的地址规划,系统包含以下功能:
-
2路温度采集(AIW0, AIW2)
-
1路加热控制(Q0.0)
-
1路冷却控制(Q0.1)
-
温度设定、显示、报警功能
-
运行时间、故障次数记录
地址规划方案
|
地址
|
变量名
|
数据类型
|
功能描述
|
初始值
|
|
I0.0
|
bStartBtn
|
BOOL
|
启动按钮
|
0
|
|
I0.1
|
bStopBtn
|
BOOL
|
停止按钮
|
0
|
|
Q0.0
|
bHeatOut
|
BOOL
|
加热输出
|
0
|
|
Q0.1
|
bCoolOut
|
BOOL
|
冷却输出
|
0
|
|
AIW0
|
wTemp1Raw
|
WORD
|
温度1原始值
|
0
|
|
AIW2
|
wTemp2Raw
|
WORD
|
温度2原始值
|
0
|
|
VW100
|
iTemp1Set
|
INT
|
温度1设定值
|
250
|
|
VW102
|
iTemp2Set
|
INT
|
温度2设定值
|
200
|
|
VW104
|
iTemp1Act
|
INT
|
温度1实际值
|
0
|
|
VW106
|
iTemp2Act
|
INT
|
温度2实际值
|
0
|
|
VD200
|
rTemp1Real
|
REAL
|
温度1工程值
|
0.0
|
|
VD204
|
rTemp2Real
|
REAL
|
温度2工程值
|
0.0
|
|
VW300
|
wRunTime
|
WORD
|
运行时间(分钟)
|
0
|
|
VW302
|
wFaultCnt
|
WORD
|
故障次数
|
0
|
|
VB400
|
bySysSta
|
BYTE
|
系统状态字节
|
0
|
|
VB400.0
|
bAutoMode
|
BOOL
|
自动模式
|
1
|
|
VB400.1
|
bManuMode
|
BOOL
|
手动模式
|
0
|
|
VB400.2
|
bAlarmSta
|
BOOL
|
报警状态
|
0
|
编程示例
// 网络1:温度值转换(模拟量转工程值)
// AIW0范围0-32000对应温度0-100.0℃
LD SM0.0
MOVW AIW0, VW104 // 读取温度1原始值
ITD VW104, VD210 // 整数转双整数
DTR VD210, VD214 // 双整数转实数
/R 320.0, VD214 // 转换为工程值
MOVR VD214, VD200 // 存储到温度1工程值
// 网络2:运行时间累计
LD bRunSta // 运行状态
TON T37, 6000 // 10分钟定时器(6000 * 100ms)
LD T37
EU // 上升沿检测
INCW VW300 // 运行时间加1
// 网络3:温度报警判断
LDR> VD200, 105.0 // 温度1大于105℃
O bFaultAlm // 或已有报警
= bFaultAlm // 置位故障报警
LD bFaultAlm
EU // 报警上升沿
INCW VW302 // 故障次数加1
七、常见问题与解答
|
问题描述
|
可能原因
|
解决方案
|
|
程序编译时报"地址无效"
|
地址超出范围或格式错误
|
检查地址是否在有效范围内,格式是否正确
|
|
数据读写错误
|
地址重叠或数据类型不匹配
|
检查地址是否重复,数据类型是否正确
|
|
实数运算结果异常
|
地址未按4字节对齐
|
确保实数变量地址是4的倍数
|
|
V区数据丢失
|
未设置掉电保持或电池故障
|
在系统块中设置V区保持范围,检查电池
|
|
特殊存储器不工作
|
SM地址使用错误
|
查阅手册确认SM地址和功能
|
八、课后作业
基础题
-
列出S7-200 SMART的8个主要存储区及其地址范围。
-
说明位寻址、字节寻址、字寻址、双字寻址的区别和规则。
-
写出5个常用特殊存储器位(SM位)的地址和功能。
编程题
为以下控制系统规划地址并编写部分程序:
-
3个启动按钮(I0.0, I0.1, I0.2)
-
2个电机输出(Q0.0, Q0.1)
-
1个模拟量输入(AIW0)测量压力
-
需要记录电机运行时间和启动次数
-
需要有自动/手动模式切换
思考题
如果一个项目需要存储100个产品的生产数据,每个产品包含:产品编号(4字节)、生产时间(4字节)、质量数据(4字节),应如何规划V区地址?如何避免地址冲突?