2.4 数据类型与寻址方式
本节将介绍PLC中的数据类型和寻址方法
学习目标
- 掌握PLC常用数据类型
- 理解不同的寻址方式
- 能够正确使用地址进行编程
1. 基本数据类型
1.1 IEC 61131-3标准数据类型
PLC标准数据类型体系:
┌─────────────────────────────────────────────────────┐
│ IEC 61131-3 数据类型 │
├─────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────┐ │
│ │ 基本数据类型 │ │
│ ├─────────────────────────────────────────────┤ │
│ │ 位类型:BOOL, BYTE, WORD, DWORD, LWORD │ │
│ │ 整数型:SINT, INT, DINT, LINT │ │
│ │ 无符号:USINT, UINT, UDINT, ULINT │ │
│ │ 实数型:REAL, LREAL │ │
│ │ 时间型:TIME, DATE, TOD, DT │ │
│ │ 字符串:STRING, WSTRING │ │
│ └─────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 派生数据类型 │ │
│ ├─────────────────────────────────────────────┤ │
│ │ 数组:ARRAY │ │
│ │ 结构:STRUCT │ │
│ │ 枚举:ENUM │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘1.2 位数据类型
| 类型 | 位数 | 范围 | 说明 |
|---|---|---|---|
| BOOL | 1 | 0, 1 | 布尔量,真/假 |
| BYTE | 8 | 0-255 | 字节 |
| WORD | 16 | 0-65535 | 字 |
| DWORD | 32 | 0-4294967295 | 双字 |
| LWORD | 64 | 0-2^64-1 | 长字 |
位数据类型的关系:
LWORD (64位)
├── DWORD (32位) DWORD (32位)
│ ├── WORD (16位) WORD (16位) WORD (16位) WORD (16位)
│ │ ├── BYTE BYTE BYTE BYTE...
│ │ │ └── 8个BOOL1.3 整数数据类型
| 类型 | 位数 | 范围 | 说明 |
|---|---|---|---|
| SINT | 8 | -128 ~ 127 | 短整型(有符号) |
| INT | 16 | -32768 ~ 32767 | 整型(有符号) |
| DINT | 32 | -2^31 ~ 2^31-1 | 双整型(有符号) |
| LINT | 64 | -2^63 ~ 2^63-1 | 长整型(有符号) |
| USINT | 8 | 0 ~ 255 | 无符号短整型 |
| UINT | 16 | 0 ~ 65535 | 无符号整型 |
| UDINT | 32 | 0 ~ 4294967295 | 无符号双整型 |
| ULINT | 64 | 0 ~ 2^64-1 | 无符号长整型 |
1.4 实数数据类型
| 类型 | 位数 | 精度 | 范围 |
|---|---|---|---|
| REAL | 32 | 约7位有效数字 | ±3.4×10^38 |
| LREAL | 64 | 约15位有效数字 | ±1.7×10^308 |
REAL数据在内存中的存储(IEEE 754格式):
符号位 指数部分(8位) 尾数部分(23位)
│ ┌───────────┐ ┌─────────────────────────┐
▼ │ │ │ │
┌─┬────┴───────────┴───┴─────────────────────────┐
│S│ Exponent │ Mantissa │
└─┴────────────────────────────────────────────────┘
31 30 23 22 0
示例:3.14 的存储 = 0x4048F5C31.5 时间数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| TIME | 时间间隔 | T#5s, T#100ms, T#1h30m |
| DATE | 日期 | D#2025-12-01 |
| TOD | 时刻(一天中的时间) | TOD#14:30:00 |
| DT | 日期和时间 | DT#2025-12-01-14:30:00 |
2. 位地址与字节地址
2.1 地址结构
西门子S7系列地址结构:
区域标识 + 字节地址 + 位地址
例如:I0.5
│ │ │
│ │ └── 位地址(0-7)
│ └──── 字节地址(0, 1, 2...)
└────────── 区域标识(I=输入)
地址层次:
字节0 字节1
┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐
│7│6│5│4│3│2│1│0│ │7│6│5│4│3│2│1│0│
└─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘
│ │ │ │
I0.7 I0.0 I1.7 I1.02.2 不同数据宽度的地址表示
西门子S7地址表示方法:
【位地址】1位
I0.0 输入字节0的第0位
Q1.5 输出字节1的第5位
M10.3 标志位字节10的第3位
【字节地址】8位
IB0 输入字节0(包含I0.0~I0.7)
QB2 输出字节2
MB100 标志位字节100
【字地址】16位
IW0 输入字0(包含IB0和IB1)
QW4 输出字4
MW200 标志位字200
【双字地址】32位
ID0 输入双字0(包含IB0~IB3)
QD8 输出双字8
MD300 标志位双字3002.3 地址重叠
地址重叠示意图:
字节0 字节1 字节2 字节3
┌───────┬───────┬───────┬───────┐
│ MB0 │ MB1 │ MB2 │ MB3 │
└───────┴───────┴───────┴───────┘
├───────────────┼───────────────┤
│ MW0 │ MW2 │
└───────────────┴───────────────┘
├───────────────────────────────┤
│ MD0 │
└───────────────────────────────┘
注意:
- MW0 包含 MB0 和 MB1
- MD0 包含 MB0, MB1, MB2, MB3
- 修改 MW0 会影响 MB0 和 MB1 的值3. 输入地址(I)
3.1 概述
输入地址用于访问PLC的物理输入端子状态,对应输入映像寄存器。
输入地址分配示意:
PLC输入端子 输入地址
┌─────────┐
按钮SB1─┤ I0.0 │─────────────▶ I0.0
按钮SB2─┤ I0.1 │─────────────▶ I0.1
传感器S1┤ I0.2 │─────────────▶ I0.2
传感器S2┤ I0.3 │─────────────▶ I0.3
... │ ... │
└─────────┘
程序中使用:
I0.0
────┤├──────────────────( Q0.0 )──3.2 各品牌输入地址表示
| 品牌 | 位地址 | 字节地址 | 字地址 |
|---|---|---|---|
| 西门子 | I0.0 | IB0 | IW0 |
| 三菱 | X0 | - | X0-XF(16点) |
| 欧姆龙 | 0.00 | - | CIO 0 |
| AB | I:0/0 | I:0.0 | - |
4. 输出地址(Q)
4.1 概述
输出地址用于控制PLC的物理输出端子,对应输出映像寄存器。
输出地址分配示意:
PLC输出端子 输出地址
┌─────────┐
电机M1──┤ Q0.0 │◀───────────── Q0.0
指示灯L1┤ Q0.1 │◀───────────── Q0.1
电磁阀V1┤ Q0.2 │◀───────────── Q0.2
报警器A1┤ Q0.3 │◀───────────── Q0.3
... │ ... │
└─────────┘
程序中使用:
I0.0
────┤├──────────────────( Q0.0 )──
电机输出4.2 各品牌输出地址表示
| 品牌 | 位地址 | 字节地址 | 字地址 |
|---|---|---|---|
| 西门子 | Q0.0 | QB0 | QW0 |
| 三菱 | Y0 | - | Y0-YF(16点) |
| 欧姆龙 | 100.00 | - | CIO 100 |
| AB | O:0/0 | O:0.0 | - |
5. 内部标志位(M)
5.1 概述
内部标志位(M)是PLC内部的存储区域,用于存储中间计算结果,不直接对应物理I/O。
内部标志位的作用:
┌──────────────────────────────────────────────────────┐
│ M区(标志位存储区) │
├──────────────────────────────────────────────────────┤
│ ● 存储中间运算结果 │
│ ● 作为程序内部的"虚拟继电器" │
│ ● 实现复杂逻辑的分解 │
│ ● 程序模块之间的信息传递 │
│ ● 状态标志、模式选择等 │
└──────────────────────────────────────────────────────┘5.2 使用示例
使用内部标志位简化复杂逻辑:
控制要求:当条件A和B满足,或条件C和D满足时,输出Y
不使用M(逻辑复杂):
I0.0 I0.1
────┤├────┤├────┬──────────────( Q0.0 )──
│
I0.2 I0.3 │
────┤├────┤├────┘
使用M(逻辑清晰):
网络1:条件1 = A AND B
I0.0 I0.1
────┤├────┤├──────────────────( M0.0 )──
网络2:条件2 = C AND D
I0.2 I0.3
────┤├────┤├──────────────────( M0.1 )──
网络3:输出 = 条件1 OR 条件2
M0.0
────┤├────┬──────────────────( Q0.0 )──
│
M0.1 │
────┤├────┘5.3 各品牌内部标志位表示
| 品牌 | 位地址 | 字地址 | 说明 |
|---|---|---|---|
| 西门子 | M0.0 | MW0 | 标志位 |
| 三菱 | M0 | D0(数据) | 辅助继电器 |
| 欧姆龙 | W0.00 | W0 | 工作区 |
| AB | B3:0/0 | B3:0 | 位文件 |
6. 数据块寻址(DB)
6.1 概述(西门子特有)
数据块(DB)是西门子PLC特有的数据存储区域,用于有组织地存储数据。
数据块结构:
┌─────────────────────────────────────────────────────┐
│ DB1(电机数据块) │
├─────────────────────────────────────────────────────┤
│ 偏移地址 数据类型 变量名 值 │
├─────────────────────────────────────────────────────┤
│ 0.0 BOOL Motor_Run TRUE │
│ 0.1 BOOL Motor_Error FALSE │
│ 2.0 INT Motor_Speed 1500 │
│ 4.0 REAL Motor_Current 12.5 │
│ 8.0 STRING Motor_Name "M001" │
└─────────────────────────────────────────────────────┘
访问方式:
DB1.DBX0.0 访问Motor_Run(位)
DB1.DBW2 访问Motor_Speed(字)
DB1.DBD4 访问Motor_Current(双字/实数)
"DB1".Motor_Run 符号访问(推荐)6.2 数据块类型
| 类型 | 说明 | 用途 |
|---|---|---|
| 全局DB | 可被所有程序访问 | 存储全局数据 |
| 背景DB | 与FB关联 | 存储FB实例数据 |
| 优化DB | S7-1500特有 | 符号访问,效率高 |
6.3 DB寻址方式
DB寻址方式:
【绝对寻址】
DB1.DBX0.0 数据块1,字节0,位0(BOOL)
DB1.DBB4 数据块1,字节4(BYTE)
DB1.DBW10 数据块1,字10(WORD/INT)
DB1.DBD20 数据块1,双字20(DWORD/DINT/REAL)
【符号寻址】(推荐)
"Motor_Data".Run
"Motor_Data".Speed
"Motor_Data".Current
【指针寻址】(高级)
P#DB1.DBX0.0 指向DB1.DBX0.0的指针7. 特殊存储区
7.1 定时器(T)和计数器(C)
定时器和计数器地址:
【西门子】
T1 定时器1
C1 计数器1
【三菱】
T0 定时器0(100ms)
T200 定时器200(10ms)
C0 计数器0
【访问内容】
定时器当前值、定时器状态位
计数器当前值、计数器状态位7.2 系统存储区
西门子系统存储区:
┌────────────────────────────────────────────────────┐
│ 系统存储区 │
├────────────────────────────────────────────────────┤
│ ● 时钟存储器(M区特殊位) │
│ M0.0 - 10Hz脉冲 │
│ M0.1 - 5Hz脉冲 │
│ ... │
│ │
│ ● 首次扫描标志 │
│ 用于初始化程序 │
│ │
│ ● 诊断数据 │
│ 故障信息、状态信息 │
└────────────────────────────────────────────────────┘8. 寻址方式总结
8.1 西门子S7地址一览表
| 区域 | 位 | 字节 | 字 | 双字 | 说明 |
|---|---|---|---|---|---|
| 输入 | I0.0 | IB0 | IW0 | ID0 | 物理输入 |
| 输出 | Q0.0 | QB0 | QW0 | QD0 | 物理输出 |
| 标志 | M0.0 | MB0 | MW0 | MD0 | 内部存储 |
| 数据块 | DBX0.0 | DBB0 | DBW0 | DBD0 | 数据存储 |
| 定时器 | T0 | - | - | - | 定时器 |
| 计数器 | C0 | - | - | - | 计数器 |
8.2 三菱FX地址一览表
| 区域 | 地址范围 | 说明 |
|---|---|---|
| 输入 | X0-X377 | 八进制编号 |
| 输出 | Y0-Y377 | 八进制编号 |
| 辅助继电器 | M0-M7679 | 内部继电器 |
| 状态继电器 | S0-S999 | 步进状态 |
| 定时器 | T0-T255 | 定时器 |
| 计数器 | C0-C255 | 计数器 |
| 数据寄存器 | D0-D7999 | 16位数据 |
8.3 寻址注意事项
寻址注意事项:
┌────────────────────────────────────────────────────┐
│ 1. 注意地址重叠 │
│ MW0 和 MB0、MB1 是重叠的 │
│ 修改一个会影响另一个 │
├────────────────────────────────────────────────────┤
│ 2. 数据类型匹配 │
│ 确保变量类型与地址宽度一致 │
│ INT用字地址,REAL用双字地址 │
├────────────────────────────────────────────────────┤
│ 3. 推荐使用符号寻址 │
│ 比绝对地址更易读、易维护 │
│ 如:Motor_Start 比 I0.0 更清晰 │
├────────────────────────────────────────────────────┤
│ 4. 做好地址规划 │
│ 项目开始前规划好各区域的使用 │
│ 避免地址冲突 │
└────────────────────────────────────────────────────┘本节小结
数据类型与寻址要点:
┌────────────────────────────────────────────────────┐
│ 数据类型 │
│ ───────── │
│ · BOOL(1位) → BYTE(8位) → WORD(16位) → DWORD(32位)│
│ · INT(整型)、REAL(实数)、TIME(时间)等 │
├────────────────────────────────────────────────────┤
│ 地址区域 │
│ ───────── │
│ · I:输入地址(物理输入) │
│ · Q:输出地址(物理输出) │
│ · M:内部标志位(中间变量) │
│ · DB:数据块(结构化数据存储) │
├────────────────────────────────────────────────────┤
│ 地址格式(西门子) │
│ ───────────────── │
│ · 位:I0.0、Q0.0、M0.0 │
│ · 字节:IB0、QB0、MB0 │
│ · 字:IW0、QW0、MW0 │
│ · 双字:ID0、QD0、MD0 │
└────────────────────────────────────────────────────┘练习题
- 解释IW0包含哪些位地址?
- 如果要存储一个温度值(带小数),应该使用什么数据类型和多大的地址空间?
- 设计一个数据块结构,用于存储一台电机的信息(运行状态、故障状态、转速、电流)。