数据类型
在西门子S7-200 PLC的程序开发中,准确理解和使用数据类型是构建稳定、可靠控制逻辑的基石。
数据类型决定了变量在内存中的存储方式、占用空间以及可表示的数值范围,是确保指令正确执行和运算结果准确无误的前提。
尽管S7-200系列作为经典机型已停产,但其广泛的应用基础和与后续产品(如S7-200 SMART)的高度兼容性,使得掌握其数据类型知识依然具有重要的学习和参考价值。
# 常用数据类型
S7- 200支持的所有基本数据类型
| 数据类型 | 长度 (位/字节) | 符号属性 | 十进制数值范围 | 十六进制范围 / 备注 | 典型应用场景 |
|---|---|---|---|---|---|
| BOOL (布尔型) | 1位 | 无符号 | 0 或 1 | TRUE (1) / FALSE (0) | 位逻辑操作,如控制线圈通断、继电器状态、开关量 |
| BYTE (字节型) | 8位 (1字节) | 无符号 | 0 ~ 255 | 00 ~ FF | 存储设备状态、ASCII字符码、按位操作 |
| WORD (字型) | 16位 (2字节) | 无符号 | 0 ~ 65535 | 0000 ~ FFFF | 处理不需要正负号的16位数据,如计数值、状态码 |
| INT (整数型) | 16位 (2字节) | 有符号 | -32768 ~ +32767 | 补码形式存储 | 涉及正负数的16位数学运算,如温度偏差、位置偏移 |
| DWORD (双字型) | 32位 (4字节) | 无符号 | 0 ~ 4294967295 | 00000000 ~ FFFFFFFF | 处理不需要正负号的大范围32位数据,如累计流量 |
| DINT (双整数) | 32位 (4字节) | 有符号 | -2147483648 ~ +2147483647 | 补码形式存储 | 需要大范围整数计算(正负数)的场合 |
| REAL (实数型) | 32位 (4字节) | 有符号 (浮点) | 约 ±1.18×10⁻³⁸ 至 ±3.4×10³⁸ | IEEE 754 标准浮点数 | 带小数点的精确运算,如模拟量处理、PID参数计算 |
# 💡 核心记忆点与工程提示:
- 符号区分(INT vs WORD / DINT vs DWORD):长度一样,但在PLC中分配的内存区域或数据类型声明不同。例如做减法
5 - 10,如果用无符号的 WORD 会溢出报错或得到极大值;用有符号的 INT 才能得到-5。- 位与字节:1个 BYTE = 8个 BOOL;1个 WORD = 2个 BYTE;1个 DWORD = 4个 BYTE。
- 精度问题:在PLC数学运算中,整数(INT/DINT)运算速度最快,但遇到除法会产生截断误差(如 10/310/3 结果为 33)。涉及精确比例换算(如 4∼20mA4∼20m**A 对应 0∼100.0∘C0∼100.0∘C)时,务必使用 REAL 类型。
- 存储格式:REAL类型遵循 IEEE 754 标准,包含符号位、指数位和尾数位,因此它不能精确表示某些十进制小数(如 0.1+0.2≠0.30.1+0.2\=0.3),编程比较时需留有死区(误差范围)。
- 在 PLC 的数据块(DB)和存储器容量卡(比如西门子的存储卡)上经常见到:
- Bit(位) = 1个 0 或 1
- Byte(字节) = 8 个 Bit
- Word(字) = 2 个 Byte = 16 个 Bit(西门子常用)
- DWord(双字) = 2 个 Word = 4 个 Byte = 32 个 Bit
- KB(千字节) = 1024 个 Byte(注意:计算机里是 1024 进位,不是 1000)
- MB(兆字节) = 1024 个 KB
- GB(吉字节) = 1024 个 MB
# PLC 存储区与数据类型映射总表
| 地址示例 | 区域名称 | 数据类型 | 英文缩写 | 位宽 | 数值范围(正确描述) | 内部真实进制 |
|---|---|---|---|---|---|---|
| I0.0 / Q0.0 / M0.0 | 位地址 | 布尔型 | BOOL | 1位 | 0 或 1 | 二进制 (0, 1) |
| IB0 / QB0 / MB0 | 字节地址 | 字节型 | BYTE | 8位 | 0 ~ 255 | 底层二进制,显示为十进制 |
| IW0 / QW0 / MW0 | 字地址 | 字型 / 整数 | WORD / INT | 16位 | 无符号: 0 ~ 65535 有符号: -32768 ~ +32767 | 底层二进制,显示为十进制,常写十六进制(16#FFFF) |
| ID0 / QD0 / MD0 | 双字地址 | 双字 / 双整数 | DWORD / DINT | 32位 | 无符号: 0 ~ 4,294,967,295 有符号: -2147483648 ~ +2147483647 | 底层二进制,显示为十进制 |
| VD0 等 | 双字地址 | 实数型 | REAL | 32位 | ±1.18×10⁻³⁸ ~ ±3.4×10³⁸ | IEEE 754 浮点数标准 |
| VB100 等 | 字节组 | 字符串 | STRING | 可变 | 最多 255 个字符 | ASCII 码(每个字符占1字节) |
| 各区域划分 | I区(输入), Q区(输出), M区(辅助), V区(存储), T区(定时器), C区(计数器), SM区(特殊)。每个区都可以按 位(B)、字节(B)、字(W)、双字(D) 进行访问。 |
# 西门子 V 区(数据区)内存连续寻址与重叠关系图
在 S7-200 中,西门子采用**“大端模式”(高位字节在前)**。以下是你在笔记中画出的 V 区地址重叠关系(这在处理指针和通信时极其重要):
| 数据类型 | 地址占用 1 | 地址占用 2 | 地址占用 3 | 地址占用 4 | 说明 |
|---|---|---|---|---|---|
| 位 (Bit) | V0.0 ~ V0.7 | V1.0 ~ V1.7 | V2.0 ~ V2.7 | V3.0 ~ V3.7 | 8个位组成1个字节 |
| 字节 (Byte) | VB0 | VB1 | VB2 | VB3 | 字节是最小寻址单位 |
| 字 (Word) | VW0 (包含VB0+VB1) | VW2 (包含VB2+VB3) | 2个字节组成1个字 | ||
| 双字 (DWord) | VD0 (包含VW0+VW2,即VB0~VB3) | 2个字组成1个双字 |
(注:VD4 包含 VB4~VB7,VD8 包含 VB8~VB11,以此类推)
# PLC 数学运算指令的数据宽度与结果截断规则
你笔记中关于 MUL/DIV 的混乱描述,我帮你修正为正确的指令逻辑表:
| 运算指令类型 | 输入 A 类型 | 输入 B 类型 | 结果类型 | 工程师核心提示 |
|---|---|---|---|---|
16位乘法 (MUL_I) | 整数 (INT/WORD) 16位 | 整数 (INT/WORD) 16位 | 32位双整数 (DINT) | 两个16位相乘,结果可能很大,所以必须用32位寄存器(如VD)接收结果。 |
16位除法 (DIV_I) | 整数 (INT/WORD) 16位 | 整数 (INT/WORD) 16位 | 16位整数 + 16位余数 | 在S7-200中,16位除法会产生两个16位结果:商(存入指定地址)和余数(存入下一个地址)。没有“16进制的除法”这种说法。 |
32位乘/除法 (MUL_DI/DIV_DI) | 双整数 (DINT/DWORD) 32位 | 双整数 (DINT/DWORD) 32位 | 32位双整数 | 32位数的计算,结果依然是32位,超出范围会溢出。 |
浮点数运算 (MUL_R/DIV_R) | 实数 (REAL) 32位 | 实数 (REAL) 32位 | 32位实数 (REAL) | 即 IEEE 754 浮点数计算,用于小数运算,结果也是32位浮点数。 |
# PLC存储的真相
在西门子的
plc中使用的是字节和位来存储数据的;
Q0.0到Q0.7就是一个字节的8个位;- 这8个位是二进制的0和1表示的;
- 所以
plc实际底层操作的是 二进制 0和1来控制通断的;
我们可以把这 8 个位想象成8个并排的开关,来看看它在 PLC 内部是怎样运作的:
# 1. 软件视角(你写的程序)
你在电脑上写梯形图:
- 写一个线圈
( ) Q0.0,你以为是在控制一个继电器。
# 2. 数据视角(二进制)
这 8 个位(Q0.0 ~ Q0.7)本质上就是一排二进制数字。
- 如果
Q0.0和Q0.1亮了,其他不亮,这排二进制就是:0000 0011。 - 换算成十进制就是 3。
# 3. 底层硬件视角(0 和 1 的魔法)
PLC 的 CPU 在执行完你的程序后,会在内存里生成这串 0000 0011 的二进制数据。接下来,它会把这串数据送到输出映像区(Q区)。
在硬件电路上,这就相当于:
| 位地址 | 二进制状态 | 内部硬件动作 | 外部物理现象 |
|---|---|---|---|
| Q0.7 | 0 | 对应的晶体管/光耦 截止(断开) | 外接的指示灯不亮 |
| Q0.6 | 0 | 对应的晶体管/光耦 截止(断开) | 外接的接触器不吸合 |
| ... | ... | ... | ... |
| Q0.1 | 1 | 对应的晶体管/光耦 导通(接通) | 外接的指示灯亮起 |
| Q0.0 | 1 | 对应的晶体管/光耦 导通(接通) | 外接的继电器得电 |
不仅是 Q 区(输出),PLC 的所有操作(I 区输入、M 区中间继电器、V 区数据块)在最底层全都是 0 和 1。
# 拆解 I0.0 的真实含义
在西门子 PLC 中,I0.0 其实是三个部分的组合:
- I:代表 Input(输入区)。
- 前面的 0:代表第 0 号字节(Byte)。
- 后面的 0:代表这个字节里的第 0 号位(Bit)。
所以,I0.0 到 I0.7 的正确读法是:“第 0 个字节里的第 0 位,一直到第 0 个字节里的第 7 位”。
为什么到了 0.7 之后,下一个是 1.0?
因为 1 个字节(Byte)刚好只有 8 个位(Bit)。你可以把它想象成一栋楼和一排房间:
- I0 是第 0 层楼(第 0 个字节)。
- 这层楼只有 8 个房间,门牌号从
0.0、0.1一直排到0.7。 - 第 0 层楼住满了,下一个进来的信号只能去第 1 层楼,也就是
I1.0。
这就是为什么西门子(以及大多数现代 PLC)的地址是 I0.0...I0.7,然后直接跳到 I1.0。
这就是典型的**“八位一组”**的字节寻址方式。
# 物理存储的“绝对底线”
- 位(Bit):它是物理内存的极限,只能是
0或1(断电或通电)。 - 你不能再把 1 个位劈成两半了,物理硬件做不到。一个比特就是一个晶体管或电容的状态。
但是现代计算机和 PLC(比如西门子 S7 系列)的内存架构中,CPU 访问内存是有一个“最小门槛”的。
- 你可以单独读取一个字节(Byte)(如
IB0)或一个字(Word)(如IW0)。 - 你不能直接给 CPU 发送一条指令说:“请把内存第 3 个物理比特(Bit)的数据读出来,其他 7 个我不要。”
- CPU 去内存里拿数据,最少也是拿一整个字节(8个位)回来。
- 而且,从硬件制造的角度(内存条、闪存芯片)来看,每一个存储单元(Cell)的物理大小通常就是一个字节。
在 PLC 和计算机的物理存储层面。1 个“位(Bit)”就是最小的存储单位,它是存储的“原子”。
所以,在日常编程、买内存卡、算容量时,字节确实是最小的“操作和计量单位”。
虽然 CPU 不能直接去内存里“挑”出一个单独的 Bit,但在 PLC 和单片机编程中,位(Bit)依然是最小的数据处理单位。
- 西门子 PLC 的
I0.0、Q0.0就是位操作。你在软件里用一个“常开触点”就能精确读取这 1 个位的状态。- 在逻辑运算(与、或、非)时,底层硬件电路(逻辑门)处理的也确实是单个的位。
# 二进制
二进制就是**“逢二进一”**,只有 0 和 1 两个数字。
# 怎么表示(与十进制互转)
- 二进制转十进制:按权重展开相加。从右往左,第 n 位的权重是 2n−1。
- 十进制转二进制:除 2 取余,逆序排列。
- 例如
11:- 11 ÷ 2 = 5 余 1
- 5 ÷ 2 = 2 余 1
- 2 ÷ 2 = 1 余 0
- 1 ÷ 2 = 0 余 1
- 倒过来读就是
1011。
- 例如
# 怎么计算(四则运算)
加法:
0+0=0,0+1=1,1+0=1,1+1=10(进位)。text
1 0 1 1 (11) + 0 1 1 0 (6) --------- 1 0 0 0 1 (17)1
2
3
4减法:借一当二。
1-0=1,1-1=0,0-0=0,0-1=1(向前借位,借来的是2)。乘法:只有
1×1=1,其他都是 0。除法:和十进制长除法一样,只是只用 0 和 1。
