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(结构化日期时间)。
关键结论:数据类型不仅决定取值范围,还决定寻址时的"步长"和"对齐方式"。例如 Int 占 2 字节,Real 占 4 字节,String 占"2 字节头 + 字符数"。

二、存储区: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 字节开始的双字
注意:字和双字寻址必须按偶数字节对齐。例如 IW0、IW2、IW4 合法,IW1 不合法;MD100、MD104 合法,MD102 不合法。这是初学者最容易踩的坑。

四、案例:电机启停与温度采集的数据组织

假设一个场景:按下启动按钮 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 数据类型与存储区寻址关系图 存储区 I 输入映像 I0.0 / IW64 Q 输出映像 Q0.0 / QW2 M 位存储区 M10.2 / MD100 DB 数据块 DB1.DBD40 掉电保持 M区可设范围 DB可设保持 数据类型 Bool / Byte / Word 1 / 8 / 16 位 DWord / LWord 32 / 64 位 Int / DInt / SInt 有符号整数 Real / LReal 32 / 64 位浮点 String / WString 字符序列 Time / Date / DTL 时间与日期 寻址方式与示例 绝对寻址 I0.0 Q0.1 M10.2 MW20 MD30 DB1.DBD40 符号寻址 "Start_Btn" "Motor1".Run 对齐规则 字/双字按偶数字节对齐 IW0 ✓ IW1 ✗ MD100 ✓ MD102 ✗ 类型转换 INT_TO_REAL() REAL_TO_INT()

掌握数据类型与存储区的关系后,编写程序时就能做到"先定类型、再定位置、最后写逻辑"。这是 S7-1200 工程开发中减少编译错误、提升程序可读性的关键一步。