PLC 编程入门最常见的一道坎,不是梯形图怎么写,而是数据类型搞不清楚。很多新手写程序时遇到INT、DINT、REAL、WORD混用的报错,或者上位机读到的数值和触摸屏对不上,本质都是数据类型和进制转换没吃透。
本文从 PLC 数据类型的底层存储讲起,把 BOOL、BYTE、WORD、DINT、REAL 这些常见类型一次说清,然后配合进制转换实操,带你完成二进制、十进制、十六进制、BCD 码的转换练习,最后再讲数据类型转换指令和排错方法。内容以西门子、三菱、汇川 PLC 为主,兼顾 Modbus 通信场景,适合刚入门的电气工程师、PLC 编程初学者和准备做自动化项目毕设的同学收藏。
1. 核心内容速览
本文虽然是一篇教程,但先给你一个信息速览表,方便判断哪些内容对你有用。
| 内容项 | 说明 |
|---|---|
| 核心主题 | PLC 数据类型分类、取值范围、存储长度与进制转换实操 |
| 涉及品牌 | 西门子 S7-200 SMART / S7-1200、三菱 FX 系列、汇川 H5U / EASY 系列 |
| 数据类型 | BOOL、BYTE、WORD、DWORD、INT、DINT、REAL、STRING、TIME 等 |
| 进制范围 | 二进制、八进制、十进制、十六进制、BCD 码 |
| 转换指令 | 西门子I_BI、BI_I、I_DI、DI_R、三菱MOV、汇川DINT_TO_REAL等 |
| 实操工具 | 博途 TIA Portal、GX Works3 / GX Developer、汇川 InoProShop、Windows 计算器 |
| 适合读者 | PLC 入门、自动化专业学生、电气工程师、Modbus 调试人员 |
结论先放前面:数据类型决定了你程序中每个变量的长度和范围,进制转换决定了你能否读懂设备里存的原始码值。两件事都通了,后面学 PID、伺服控制、Modbus 通信都会顺很多。
2. PLC 数据类型到底是什么
2.1 为什么数据类型会决定程序成败
PLC 程序运行的本质,是 CPU 对存储区中的数据进行读写和运算。你写M0.0到M10.3这种位地址时,操作的是 1 位;写MW100时,操作的是 2 个字节 16 位;写MD104时,操作的是 4 个字节 32 位。
如果数据类型不匹配,会出现几种典型的程序故障:
- 把一个
WORD类型变量直接传给一个INT类型变量,编译器报错或者数值被解释成完全不同的数。 - 上位机写入一个 16 位无符号数 65535,PLC 端用
INT接收,变成 -1。 - 触摸屏上显示的温度值翻了好几倍,因为浮点数寄存器被当成了整数读取。
- 伺服电机的运行速度异常,因为目标速度值在
REAL和DINT之间转换时丢精度。
所以,理解数据类型不是理论问题,而是直接影响设备动作的实际问题。
2.2 PLC 数据的最小存储单位
先明确几个基础概念:
| 单位 | 位数 | 说明 |
|---|---|---|
| bit(位) | 1 | 0 或 1,最小存储单位 |
| nibble(半字节) | 4 | 16 种状态 |
| byte(字节) | 8 | 可表示 0~255 或 -128~127 |
| word(字) | 16 | 2 字节 |
| dword(双字) | 32 | 4 字节 |
西门子 PLC 的存储区中,MB表示字节,MW表示字,MD表示双字。三菱和汇川惯用D寄存器表示 16 位数据,用两个连续的D寄存器组成 32 位数据。
在程序里,数据类型就是把"这一段存储区代表什么"这件事显式定下来。比如同样占用 2 字节的数据,INT把它当作有符号整数,WORD把它当作无符号 16 位二进制数,SINT只占 1 字节。
3. PLC 基本数据类型详解
3.1 BOOL:布尔型
- 长度:1 位。
- 取值范围:TRUE / FALSE。
- 在西门子中体现为触点、线圈和
M、I、Q区域的位。 - 在梯形图中通常直接使用位地址,不需要额外声明变量,但在 ST 语言或 HMI 脚本中需要设为 BOOL。
示例:
VAR bStart : BOOL; bStop : BOOL; END_VAR bStart := TRUE; bStop := FALSE;3.2 整型数据家族
整型是 PLC 程序中最常用的一类数据,主要区别在于位数和有无符号。
| 类型 | 位数 | 有无符号 | 取值范围 | 西门子对应 |
|---|---|---|---|---|
| SINT | 8 | 有符号 | -128 ~ 127 | BYTE 的部分使用场景 |
| USINT | 8 | 无符号 | 0 ~ 255 | 无直接地址对应 |
| INT | 16 | 有符号 | -32768 ~ 32767 | MW / DBW |
| UINT | 16 | 无符号 | 0 ~ 65535 | MW / DBW |
| DINT | 32 | 有符号 | -2147483648 ~ 2147483647 | MD / DBD |
| UDINT | 32 | 无符号 | 0 ~ 4294967295 | 无直接地址对应 |
| LINT | 64 | 有符号 | 很大,工艺中少见 | 需要 DB 变量 |
实际使用中,INT最容易踩坑。例如 Modbus 保持寄存器默认是 16 位,如果从站的寄存器值是十六进制FFFF,按无符号理解是 65535,按有符号理解是 -1。通信协议里没有明确说明时,读写双方必须约定同一套解释方式。
示例,西门子博途中的变量声明:
VAR iCounter : INT; dwResult : DINT; uiRegVal : UINT; END_VAR三菱 GX Works 中,D0默认就是 16 位,如果需要 32 位,要用D0和D1组合,适用DD0指令时表示双字。
3.3 实数 REAL:浮点数
- 长度:32 位。
- 采用 IEEE 754 标准表示。
- 适合温度、压力、速度等连续量。
- 取值范围大约为 ±3.4028235E+38,有效精度约为 7 位十进制数字。
REAL 型数据在通信和触摸屏显示时很常用,但要注意:
- 浮点数不能直接和
INT做比较运算,必须先转换。 - 浮点数存储格式特殊,直接用十六进制查看工具读取时,看到的是 4 字节的十六进制序列,只有 PLC 和上位机都按浮点解析才能还原原始值。
- 在博途和汇川 InoProShop 中,
LREAL(64 位)同样存在,但多数工艺场景用REAL足够。
示例:
VAR rTemp : REAL; rSpeed : REAL; END_VAR rTemp := 36.5; rSpeed := 1500.0;3.4 其他常用数据类型
STRING:字符串
- 用于存储人机界面显示文本、报警信息、文件名等。
- 西门子 S7-1200 的
STRING默认长度 254 字节。 - 三菱和汇川的字符串处理能力相对弱一些,更多靠 HMI 处理。
TIME / TON 定时器相关时间类型
- 长度 32 位。
- 以毫秒(ms)为基本单位。
- 通常与定时器指令联用。
VAR tDelay : TIME := T#5s; END_VAR3.5 数据长度速查表
| 类型 | 位数 | 字节数 | 说明 |
|---|---|---|---|
| BOOL | 1 | 0.125(位寻址) | 布尔量 |
| BYTE | 8 | 1 | 无符号字节 |
| WORD | 16 | 2 | 无符号字 |
| DWORD | 32 | 4 | 无符号双字 |
| INT | 16 | 2 | 有符号整数 |
| DINT | 32 | 4 | 有符号双整数 |
| REAL | 32 | 4 | 浮点数 |
| STRING | 可变 | 默认 254 | 字符串 |
4. 不同品牌 PLC 的数据类型差异
4.1 西门子 PLC
西门子 STEP 7 / TIA Portal 中,数据类型规则最严格。变量必须在 PLC 变量表中声明,地址类型和数据类型严格对应。
常见地址写法:
| 地址 | 数据类型 | 说明 |
|---|---|---|
| I0.0 | BOOL | 输入位 |
| IB0 | BYTE | 输入字节 |
| IW0 | WORD / INT | 输入字 |
| ID0 | DWORD / DINT / REAL | 输入双字 |
| Q0.0 | BOOL | 输出位 |
| M0.0 | BOOL | 中间位 |
| MW10 | INT / WORD | 中间字 |
| MD14 | DINT / REAL | 中间双字 |
有一点特别容易混淆:MW10占用的字节是 MB10 和 MB11,MD10占用的字节是 MB10~MB13。所以写程序时,MW12 和 MD10 实际上地址重叠,会造成数据互相覆盖,现场调试时要特别小心。
4.2 三菱 PLC
三菱 FX 系列中,数据寄存器D是 16 位,占用一个地址。32 位数据占用两个连续地址,比如D0和D1。
数据类型上,三菱不像西门子那样强制区分INT和WORD。在梯形图中的MOV指令,可以直接把D0的值传送到D10,有没有符号由后续指令和软件解释决定。这种宽松的机制方便快速编程,但调试时容易忽略溢出问题。
在 GX Works3 中,结构化文本和 FB 函数块支持显式类型声明,和三菱自家扩展指令配合使用。
4.3 汇川 PLC
汇川 InoProShop 的编程环境和三菱 GX Works3 的体验很接近,同时兼容 IEC 61131-3 标准。数据类型包括BOOL、INT、DINT、REAL、STRING、TIME等。
汇川应用中,很多工艺场景涉及伺服控制,伺服轴的目标位置和速度建议使用DINT或REAL,避免 16 位INT溢出。汇川 H5U 系列还支持LREAL,但常规单轴应用用不上。
4.4 Modbus 通信中的数据类型长度
Modbus 是一种非常常见的工业通信协议,常涉及寄存器数据类型问题。
| Modbus 对象 | 数据长度 | 说明 |
|---|---|---|
| 线圈 Coil | 1 bit | 开关量读写 |
| 离散输入 Discrete Input | 1 bit | 只读开关量 |
| 保持寄存器 Holding Register | 16 bit | 读写寄存器 |
| 输入寄存器 Input Register | 16 bit | 只读寄存器 |
如果一个浮点数要放在 Modbus 寄存器中,通常需要占用 2 个保持寄存器,也就是 4 字节 32 位,并且需要约定字节顺序(ABCD 或 CDAB),这正是很多初学者调试上位机时遇到的"数据读出来怎么是乱的"的原因。
5. 进制转换基础
5.1 为什么 PLC 编程必须懂进制
PLC 内部所有数据本质都是二进制。梯形图中的K10是十进制常数,但显示在设备监控表里可能以十六进制呈现。以下场景都会用到进制转换:
- 设备原点开关、限位开关组合成位模式时,需要按二进制位去判断。
- 触摸屏地址和 PLC 软元件地址的对应关系。
- 通信报文解析时,寄存器原始值是十六进制。
- BCD 码来自旋转编码器或 BCD 拨码开关。
- 伺服驱动器参数写入时,需要将十进制数值转成十六进制指令值。
5.2 四种常用进制的表示
| 进制 | 基 | 可用字符 | PLC 编程中的写法 |
|---|---|---|---|
| 二进制 | 2 | 0, 1 | 西门子2#1010 |
| 八进制 | 8 | 0~7 | 西门子地址 I0.0 到 I7.7 |
| 十进制 | 10 | 0~9 | 直接写数字,如 10 |
| 十六进制 | 16 | 0~9, A~F | 16#A或0xA |
三菱中,十六进制常数前加H,例如H0A。汇川类似,十六进制写作16#0A或H0A,具体看软件版本。
6. 进制转换实操计算
6.1 二进制与十进制互转
二进制1011转十进制:
- 从右往左,每一位乘以 2 的 n 次方。
- 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11。
十进制转二进制用短除法:
- 将 25 不断除以 2,记录余数。
- 25 ÷ 2 = 12 余 1
- 12 ÷ 2 = 6 余 0
- 6 ÷ 2 = 3 余 0
- 3 ÷ 2 = 1 余 1
- 1 ÷ 2 = 0 余 1
- 从下往上读余数:11001
所以十进制 25 = 二进制 11001。
6.2 十六进制与十进制互转
十六进制A3F转十进制:
- A×16² + 3×16¹ + F×16⁰
- 10×256 + 3×16 + 15×1 = 2560 + 48 + 15 = 2623。
十进制 300 转十六进制:
- 300 ÷ 16 = 18 余 12(记 C)
- 18 ÷ 16 = 1 余 2
- 1 ÷ 16 = 0 余 1
- 从下往上读:12C
所以十进制 300 = 十六进制 12C。
6.3 常见数值对照表
| 十进制 | 二进制 | 八进制 | 十六进制 | BCD |
|---|---|---|---|---|
| 0 | 0000 | 0 | 0 | 0000 |
| 5 | 0101 | 5 | 5 | 0101 |
| 10 | 1010 | 12 | A | 0001 0000 |
| 15 | 1111 | 17 | F | 0001 0101 |
| 16 | 1 0000 | 20 | 10 | 0001 0110 |
| 255 | 1111 1111 | 377 | FF | 0010 0101 0101 |
6.4 用 Windows 计算器快速验证
Windows 自带的科学计算器可以在"程序员"模式下完成进制互转,还能看到对应位的值。
操作路径:
- 按下
Win + S,输入"计算器"并打开。 - 切换到"程序员"模式。
- 选择 DEC,输入数值。
- 切换到 HEX、BIN、OCT 查看对应进制结果。
- 右侧可以看到位开关状态,方便核对每一位。
输入:255(十进制) BIN:1111 1111 HEX:FF OCT:377注意:程序员模式下输入的十进制如果是负数,显示的是补码形式。例如 -1 的十六进制显示为FFFFFFFF。
6.5 BCD 码实操
BCD 码(Binary-Coded Decimal)用 4 位二进制表示一位十进制数字。比如:
- 十进制 35 的 BCD 码是
0011 0101。 - 十六进制
0x35从表面上看和 BCD 码35一样,但含义完全不同。
PLC 中常遇到旋转编码器输出 BCD 码,或者触摸屏输入时以 BCD 码发送,此时要用 BCD 转换指令:
- 西门子:
BCD_I、I_BCD。 - 三菱:
BCD、BIN。 - 汇川:
BCD_TO_INT、INT_TO_BCD。
示例,三菱 FX 系列:
// 将 D0 中的 BCD 码转换为二进制数值存入 D10 BCD D0 D10 // 将 D10 中的二进制数值转换为 BCD 码存入 D20 BIN D10 D20调试时,先在监控表里看 D0 的数值显示。如果 D0 =H0123,则对应十进制 123,但注意 PLC 监控显示形式不同,有的是十六进制显示,有的是十进制显示,需手动切换。
7. 数据类型转换实操
7.1 为什么要做类型转换
PLC 程序中,不同数据类型之间不能直接赋值或比较。例如INT变量不能直接赋给REAL变量,WORD不能直接传给DINT。此时必须使用转换指令。
常见的转换场景:
- 模拟量模块读取的原始值(
INT)转成工程量(REAL),如 0~27648 转 0~100°C。 - 触摸屏输入的目标值(
REAL)转成DINT给伺服轴。 - Modbus 通信读取的
WORD变量转成INT或REAL参与运算。
7.2 隐式转换与强制转换
隐式转换:PLC 自动完成,只适用于安全范围。例如INT转DINT不会损失数据,部分软件可以自动完成。
强制转换:使用指令或函数完成。可能损失数据或引入舍入误差。例如REAL转INT时,小数部分会被省略,具体舍入方式不同品牌可能不同,有的四舍五入,有的截断。
示例,西门子 ST 语言:
VAR iRaw : INT; rTemp : REAL; iRounded : INT; END_VAR // INT 转 REAL rTemp := INT_TO_REAL(iRaw); // REAL 转 INT,注意精度损失 iRounded := REAL_TO_INT(rTemp);示例,博途 LAD 中的转换指令:在基本指令目录中搜索CONV,选择CONV "Int to Real"即可。
7.3 WORD 与 INT 的转换
WORD和INT占用内存长度相同,都是 16 位,但解释方式不同。WORD无符号,INT有符号。
- 十六进制
16#FFFF作为WORD是 65535。 - 作为
INT是 -1。 - 转换指令:
WORD_TO_INT、INT_TO_WORD。
示例:
VAR wReg : WORD; iVal : INT; END_VAR iVal := WORD_TO_INT(wReg);7.4 三菱与汇川中的类型转换
三菱 FX 系列中,MOV指令最常见。它按位传送数据,不做类型检查,因此很容易出现类型混乱。最好在指令前明确使用DINT相关的双字传送:
// 将 D0, D1 组合成的 32 位数据传送到 D20, D21 DMOV D0 D20汇川 InoProShop 支持 IEC 标准的转换函数:
rValue := DINT_TO_REAL(dPosition); iIntValue := REAL_TO_INT(rValue);还有更多组合,比如WORD_TO_BYTE、DWORD_TO_REAL、BCD_TO_INT,具体函数名参考软件内的函数库。
8. 数据类型与进制转换常见错误
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 程序编译报错,变量类型不匹配 | 将 WORD 传给 INT,或 REAL 直接做比较 | 看编译器提示的具体行 | 使用WORD_TO_INT、REAL_TO_INT显式转换 |
| 上位机读取的数值和 HMI 显示不一致 | 数据长度/字节顺序不一致 | 对比 16 位和 32 位读取方式 | 改成一致的寄存器长度和字节顺序 |
| 模拟量换算倍率错误 | 原始值当作有符号或无符号解释错误 | 查模块手册的原始值范围 | 用正确类型读取后换算 |
| 伺服位置偏差很大 | 32 位数据被读成 16 位 | 检查寄存器组合是否连贯 | 用双字读取,注意D0、D1顺序 |
| BCD 码显示为 16#99 但十进制却不对 | BCD 码没经过转换直接运算 | 确认数据来源是 BCD 格式 | 加BCD或BCD_TO_INT转换 |
| 触摸屏写入负数后变成很大的正数 | 有符号 INT 与无符号 UINT 混用 | 查看变量类型定义 | 统一为 INT,避免 UINT 接受负数 |
| 地址重叠导致数据被覆盖 | MW10 和 MD10 范围重叠 | 检查变量表地址 | 分配地址时留出足够间隔 |
实际调试时还常遇到一个问题:PLC 程序在线修改后数据不刷新。这通常不是数据类型问题,而是没有执行下载或启用了保持功能,需要把 PLC 切到 STOP 再 RUN,或者手动下载块。
9. 最佳实践与建议
9.1 首次编程先列变量表
不要直接写梯形图。先在变量表里把输入、输出、中间变量全部声明好,明确每个变量的数据类型和地址范围。这样能避免大半类型匹配问题。
变量表示例:
| 变量名 | 地址 | 数据类型 | 注释 |
|---|---|---|---|
| StartBtn | I0.0 | BOOL | 启动按钮 |
| SpeedSet | MD10 | REAL | 速度设定值 |
| Position | MD20 | DINT | 当前位置 |
| CmdWord | MW40 | WORD | 通信命令字 |
9.2 保持浮点数与整数分离
在一个程序段中,尽量不让REAL和INT直接混用。需要参与运算的变量,先转换成统一类型。例如模拟量工程量换算,统一用REAL。
9.3 进制转换要形成肌肉记忆
- 十进制
0~255对应十六进制00~FF。 - 十进制
0~65535对应十六进制0000~FFFF。 16#FF是 255,16#FFFF是 65535(无符号)或 -1(有符号)。
遇到一个通信报文值,先确认这是十六进制还是十进制,再确认是有符号还是无符号,最后再看字节顺序。
9.4 批量处理时使用变量名而非绝对地址
工程中如果涉及大量寄存器读写,建议用符号名 + 数据块的方式。西门子博途中建立 DB 块,三菱/汇川用全局标签。不要到处写D100、D101这种裸地址,后期改一处地址会非常痛苦。
9.5 用在线监控验证类型理解
调试时打开 PLC 在线监控表,切换到二进制和十六进制显示,观察同一个地址在不同进制下的值变化。这是最快建立"数据类型 + 进制"直觉的方法。
比如让MW100等于16#A5,监控表里:
- 二进制显示:1010 0101。
- 十进制显示:165。
- 如果用
INT解释:-91。 - 如果用
WORD解释:165。
直观看到同一个 16 位数据在不同类型下的差异,比死记硬背规格表有效得多。
9.6 关于调试安全
如果在真实设备上调试,涉及电机、气缸、机械手等输出动作时,先断开动力电源,用信号强制功能验证逻辑,再上电试动作。涉及伺服和变频器参数写入时,备份当前参数文件。涉及通信报文解析时,先确认从站设备型号和寄存器地址表,避免误写控制字。
10. 总结与后续方向
PLC 数据类型和进制转换是编程技能的底座。本文把 BOOL、BYTE、WORD、DINT、REAL 等类型的内存长度、取值范围和品牌差异讲了一遍,又给出了二进制、十六进制、BCD 码的换算方法和验证工具,最后补充了类型转换指令和调试排错思路。
如果你正在学 PLC,建议先把INT、WORD、DINT、REAL这四种类型的区别搞透,再配合 Windows 计算器做 10 组进制换算练习,然后在一台真实 PLC 上做在线监控试验。这是成本最低、收益最明显的一条路径。
后面可以继续深入的内容包括:模拟量工程量换算、Modbus 通信报文解析、西门子 DB 块的数据结构设计、三菱/汇川伺服轴参数的类型选择、梯形图与 ST 语言混合编程。这些内容都建立在数据类型和进制转换的基础之上。