数据类型

2026-11-2 Electrical 大约 10 分钟

在西门子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参数计算

# 💡 核心记忆点与工程提示:

  1. 符号区分(INT vs WORD / DINT vs DWORD):长度一样,但在PLC中分配的内存区域或数据类型声明不同。例如做减法 5 - 10,如果用无符号的 WORD 会溢出报错或得到极大值;用有符号的 INT 才能得到 -5。
  2. 位与字节:1个 BYTE = 8个 BOOL;1个 WORD = 2个 BYTE;1个 DWORD = 4个 BYTE。
  3. 精度问题:在PLC数学运算中,整数(INT/DINT)运算速度最快,但遇到除法会产生截断误差(如 10/310/3 结果为 33)。涉及精确比例换算(如 4∼20mA4∼20m**A 对应 0∼100.0∘C0∼100.0∘C)时,务必使用 REAL 类型。
  4. 存储格式:REAL类型遵循 IEEE 754 标准,包含符号位、指数位和尾数位,因此它不能精确表示某些十进制小数(如 0.1+0.2≠0.30.1+0.2\=0.3),编程比较时需留有死区(误差范围)。
  5. 在 PLC 的数据块(DB)和存储器容量卡(比如西门子的存储卡)上经常见到:
    1. Bit(位) = 1个 0 或 1
    2. Byte(字节) = 8 个 Bit
    3. Word(字) = 2 个 Byte = 16 个 Bit(西门子常用)
    4. DWord(双字) = 2 个 Word = 4 个 Byte = 32 个 Bit
    5. KB(千字节) = 1024 个 Byte(注意:计算机里是 1024 进位,不是 1000)
    6. MB(兆字节) = 1024 个 KB
    7. 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 中使用的是字节和位来存储数据的;

  1. Q0.0到Q0.7就是一个字节的8个位;
  2. 这8个位是二进制的0和1表示的;
  3. 所以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。
    • image-20261104103940386
  • 十进制转二进制:除 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。

上次编辑于: 2026年11月4日 11:50