4. S7-1200数据类型与存储区
S7-1200 PLC 的编程本质,是对"数据"和"存放数据的位置"进行组织与操作。数据类型决定了变量占多少位、能表示多大范围、能参与哪些运算;存储区决定了变量放在哪里、CPU 如何找到它、掉电后是否保持。理解这两条主线,是后续编写梯形图、SCL 和功能块的基础。
一、核心原理:数据类型是"解释位串的规则"
PLC 内部所有数据最终都是二进制位串,数据类型只是给这段位串赋予"含义"。例如 16 位 2#0000_0000_0000_1010,按无符号整数解释是 10,按有符号整数解释也是 10,但若按两个字节的字符解释则完全不同。因此,声明变量时必须先确定数据类型。
S7-1200 常用数据类型可分为四类:
- 位与位串类型:Bool(1 位)、Byte(8 位)、Word(16 位)、DWord(32 位)、LWord(64 位)。位串类型不区分正负,常用于状态组合、掩码、通信数据。
- 整数类型:SInt(8 位有符号)、USInt(8 位无符号)、Int(16 位有符号)、UInt(16 位无符号)、DInt(32 位有符号)、UDInt(32 位无符号)、LInt/LWord 等。整数用于计数、索引、状态码。
- 浮点类型:Real(32 位 IEEE 754 单精度)、LReal(64 位双精度)。用于模拟量、温度、流量、PID 运算等需要小数的场合。
- 复合与专用类型:String/WString(字符串)、Char/WChar(字符)、Time(IEC 时间,32 位毫秒)、Date(日期)、Time_Of_Day(时刻)、Date_And_Time(日期时间)、DTL(结构化日期时间)。
二、存储区:I、Q、M、DB 的分工
S7-1200 的存储区按用途和访问方式划分,最常用的是以下四类:
| 存储区 | 含义 | 典型用途 | 掉电保持 |
|---|---|---|---|
| I(输入过程映像) | 每个扫描周期开始刷新输入端子状态 | 读取按钮、限位、传感器 | 否 |
| Q(输出过程映像) | 扫描周期结束将映像写到输出端子 | 驱动接触器、指示灯、阀 | 否 |
| M(位存储区) | CPU 内部中间变量区 | 中间标志、手自动切换、报警位 | 可设置保持范围 |
| DB(数据块) | 结构化数据存储,分全局 DB 和背景 DB | 配方、参数、FB 背景数据 | 可设置保持属性 |
I 和 Q 是"过程映像",不是物理端子本身。CPU 在扫描周期开始时把物理输入复制到 I 区,程序只访问 I 区;周期结束时把 Q 区复制到物理输出。这样保证程序执行期间输入状态稳定,避免同一周期内输入抖动导致逻辑混乱。
M 区适合存放少量中间状态,但不宜大量使用,因为 M 区地址是全局的,容易冲突。工程上更推荐用全局 DB 组织数据,例如 "Data".Motor1_Run、"Data".Temp_SP,可读性和可维护性更好。
三、寻址方式:绝对寻址与符号寻址
S7-1200 支持两种寻址方式:
- 绝对寻址:直接写地址,如
I0.0、Q0.1、M10.2、MW20、MD30、DB1.DBD40。优点是直观,缺点是地址变更后程序需大量修改。 - 符号寻址:使用变量名,如
"Start_Btn"、"Motor1".Run。优点是程序可读、便于复用,是推荐方式。
位、字节、字、双字的寻址关系如下:
I0.0 位寻址,第 0 字节第 0 位
IB0 字节寻址,I0.0 ~ I0.7
IW0 字寻址,I0.0 ~ I1.7(16 位)
ID0 双字寻址,I0.0 ~ I3.7(32 位)
MD100 双字,M100.0 ~ M103.7
DB1.DBW10 数据块 DB1 中第 10 字节开始的字
DB1.DBD20 数据块 DB1 中第 20 字节开始的双字
四、案例:电机启停与温度采集的数据组织
假设一个场景:按下启动按钮 I0.0,电机 Q0.0 运行;温度传感器接入 IW64,量程 0~100℃,对应 0~27648;设定值存放在 DB1 中,类型为 Real。
// 梯形图逻辑(示意)
I0.0 ──┤ ├──( S ) Q0.0
I0.1 ──┤ ├──( R ) Q0.0
// SCL 中温度换算
"Data".Temp_Raw := IW64; // Int
"Data".Temp_Real := INT_TO_REAL("Data".Temp_Raw) * 100.0 / 27648.0;
"Data".Temp_Alarm := "Data".Temp_Real > "Data".Temp_SP;
这里 IW64 是字寻址,读取 16 位整数;"Data".Temp_Real 是 DB 中的 Real,占 4 字节;"Data".Temp_SP 是设定值,也是 Real。类型不匹配时必须显式转换,否则编译报错或结果错误。
五、误区与复盘
误区 1:把 Int 直接当 Real 用。Int 和 Real 的位编码完全不同,必须用 INT_TO_REAL 转换。
误区 2:字/双字地址不对齐。IW1、MD102 这类地址在 S7-1200 中非法,编译会报错。
误区 3:认为 M 区一定掉电保持。M 区默认不保持,需要在 CPU 属性中设置保持范围,或改用保持型 DB。
误区 4:String 当普通字节数组用。String 前两个字节是最大长度和当前长度,直接按字节读写会破坏结构。
复盘建议:在项目初期就规划好 DB 结构,按设备或功能划分数据块;模拟量统一用 Real 存储;状态位用 Bool;计数用 DInt;时间用 Time 或 DTL。这样后续编写 FB、HMI 变量连接和通信映射都会顺畅很多。
掌握数据类型与存储区的关系后,编写程序时就能做到"先定类型、再定位置、最后写逻辑"。这是 S7-1200 工程开发中减少编译错误、提升程序可读性的关键一步。