恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

工控调试避坑指南:字节、16进制与进制换算详解

  • 首页
  • 资讯中心
  • /
  • 工控调试避坑指南:字节、16进制与进制换算详解

相关资讯

基于STM32单片机超声波测距测速报警语音播报温度补偿蓝牙/WiFi/视频监控/云平台无线APP-DIY设计S467 2026/10/11 1:41:47
Python后端中间件专题13:“执行两次”不能“通知两次”——幂等消费者 2026/10/11 1:41:47
Python后端中间件专题12:Worker 在 ACK 前死掉——重投、重试与时间限制 2026/10/11 1:41:46

最新资讯

Java后端面试实战:从HashMap到JVM的深度追问与考点拆解
i-have-adhd:神经多样性时代的个人操作系统工程学
轴棱锥MATLAB仿真:贝塞尔高斯光束与环形光束的相位与网格采样实战
西北CMA实验室资质咨询服务公司哪家强
频域模型法加速风储调频仿真:从10分钟到5秒的方法与实践
解决mavros2 ros2版本cpu占用高的问题

今日推荐

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

工控调试避坑指南:字节、16进制与进制换算详解

发布时间:2026/10/11 1:46:47
工控调试避坑指南:字节、16进制与进制换算详解 做现场调试这些年我发现自己反复跟同事讲得最多的不是那些复杂的控制算法反而是字节和16进制这种地基知识。说起来有点讽刺很多搞工控的兄弟PID调得飞起逻辑写得顺溜但一碰到通讯报文、寄存器地址、触摸屏数值转换就开始抓瞎。尤其是有一次同事拿着一张仪表的说明书问我为什么手册上写的数据地址是0x000A他愣是没看明白这跟十进制里的10有什么关系。我当场就意识到这块基础不补后面全是坑。这篇文章我就把这几年在现场摸爬滚打积累的字节与16进制经验掰开揉碎讲清楚。它不解决什么高深的控制理论但能帮你解决一个很现实的问题设备手册上的16进制地址你不会疑神疑鬼通讯报文里的字节对不上号你能一眼看出来做上位机开发也好、写PLC程序也好至少在数据这一层你心里是有底的。适合刚入行的自动化工程师、设备维护人员也适合那些平时编程写得多但很少跟底层数据打交道的人。1. 先把底层的三个概念捋清楚bit、Byte、16进制1.1 位bit到底是个什么东西PLC也好传感器也好仪表也好只要是电子设备内部处理的都是电压信号。一条信号线上有电没电高电平低电平在数字电路里就被抽象成了1和0。这个最小的单位就叫bit中文叫位。一个bit只有两种状态要么是0要么是1。听起来简单但你要想表达更大的数就只能通过增加bit的数量来解决。就好比一个开关只有开和关两种状态但如果给你一排开关你就能通过这些开关的开关组合来表达更多信息。两个bit可以表达00、01、10、11这四种状态也就是十进制里的0到3。三个bit可以表达0到7八个bit可以表达0到255。在工控现场很多时候你看着一个bool变量觉得它就是一个位比如电机的启停、阀门的开闭。但在内部PLC处理的时候它是把这些位按字节组织起来的。这就引出了下一个概念。1.2 字节Byte8个bit组成的最小工作单元一个字节等于8个bit这是计算机领域约定俗成的规定。为什么是8因为8个bit正好能表示256种状态而英文字母加上数字、标点符号用ASCII编码刚好够用早期就是这么定的后来就一直沿用下来了。在工控里字节这个概念比你想象得更重要。Modbus通讯里一个寄存器是16位也就是2个字节S7协议里一条数据可能是几个字节拼接。你去看所有PLC的数据手册存储区的划分基本都是按字节来的MB0、MB1、MB2每个字节有8个位分别是M0.0到M0.7。你可以把字节理解为一个盒子任何数据想进入PLC或者离开PLC都得先放在这个盒子里。一个字节只能装0到255的整数如果超过这个数就得用两个字节甚至更多字节来装。这个装的过程就是字节组合的过程也是很多入行新人最容易懵的地方。1.3 16进制给字节写的速记符号16进制英文叫Hex用0到9和A到F这16个符号来表示数值。A代表十进制的10B代表11C代表12D代表13E代表14F代表15。很多新手看到字母出现在数字里就慌其实完全没必要。16进制说白了就是二进制的缩写。一个16进制的位正好对应4个二进制位bit。为什么是4个因为4个bit能表达16种状态也就是0到15和16进制的一个位能表达的范围完全一致。举个例子二进制的1010你可以把它分成两组10和10每组分别转换成十进制都是2对应到16进制就是22吗不对这里要小心。正确的做法是1010从右往左每4位一组最左边不足4位就补0然后每组独立转成16进制。1010就是十进制的10对应16进制的A所以二进制1010直接写成16进制就是单个A。这里面的关键就是4个bit等于1个16进制位。所以一个字节8个bit正好等于2个16进制位。比如二进制11001010拆成高4位1100和低4位10101100是十进制的12也就是C1010是十进制的10也就是A这个字节的16进制表示就是0xCA。这也是为什么工控人看报文、看寄存器地址到处都是16进制因为一个字节用二进制写是8个字符用16进制写只要2个字符省眼睛而且跟字节边界对得整整齐齐。2. 为什么工控现场离不开16进制2.1 它跟字节的边界是天然对齐的CAD系统里坐标网格对齐了才好画图数据世界里字节边界对齐了才好解释。16进制最妙的地方就在于它的每一位都对应二进制中的固定4位不会像十进制那样在转换时破坏字节的边界感。以字节0x3F为例。它的每一位都对应二进制中的固定4位不会像十进制那样在转换时破坏字节的边界感。0x3F转成二进制就是00111111前两位是0后六位全是1一眼就能看出这是一个低6位全置1的字节。你要是转成十进制63还得先心算一下反应不过来它内部到底是什么结构。在工控里很多状态字、标志位就是这么用的。某个字节的每一位代表一个设备状态第0位代表运行第1位代表故障第2位代表报警。用16进制看0x03一眼就能看出是第0位和第1位同时为1也就是运行中且有故障。如果用十进制3来看你得把3换算成二进制才能反应过来多一道工序。2.2 手册和报文里的通行语言几乎所有工业设备的手册在描述寄存器地址、数据格式、通讯协议的时候用的都是16进制。你翻一台变频器的说明书参数地址那一栏写的肯定是0x2100而不是8448你看一台智能仪表支持的Modbus寄存器列表起始地址写的肯定是0x0000而不是0。通讯报文就更不用说了。你用串口调试助手抓一段Modbus RTU报文看到的那些字节自然就是16进制格式。比如一条写线圈的指令01 05 00 0A FF 00 6D 9A里面的地址、数据、校验全都是16进制的。你要是习惯用十进制读报文每条都得现换算效率太低不说还容易出错。2.3 算起来方便跟二进制一样友好有人说那我直接用二进制看报文不是更直观吗话是没错但一个字节8位一条报文几十上百个字节你拿二进制写着试试眼睛都要花。16进制相当于夹在二进制和十进制中间的一个折中它既有二进制的可读性每一位对应4个bit又有十进制的简洁性2位表示一个字节所以成了工控世界的通用语言。举个我自己的习惯在调试触摸屏时要往某个寄存器里写入一个日期的整数表示比如2025年1月1日有些仪表定义的高16位存年份低16位存天数你用十进制去理解这个寄存器里的数很难一眼看出高16位和低16位的分界点但如果你用16进制看0x07E9 0001高16位和低16位之间就是分界线这感觉太直观了。3. 进制换算的实操方法怎么算都不会错3.1 从16进制转10进制公式往心里记16进制转10进制的公式很简单从右往左每一位的数值乘以16的对应次方然后相加。例如0x2AA在个位值10乘以16的0次方即1得到102在十六位值2乘以16的1次方即16得到32。两者相加0x2A等于42。现场调试的时候遇到底层数据时特别是通讯数据分析这个换算你做一万次都不嫌多。我建议你培养一种感觉0xFF是2550x0A是100x10是160x64是100这几个高频值看到就能条件反射。有时候你从仪表读回一串16进制的数据比如0x01F4用上面的方法算0x01在第二位值1乘以256得2560xF4在第一位值是15乘以16再加上4等于244两者相加是500。很多设备在传送模拟量对应的整数值时用的就是这种高位和低位组合的方式学会这个换算你就能读懂设备到底报了个什么数。3.2 从10进制转16进制除16取余法反过来的操作也简单叫除16取余法。比如要把十进制500转成16进制500除以16商31余4写下4。31除以16商1余15也就是F写下F。1除以16商0余1写下1。从下往上排列得到0x1F4。这个方法虽然简单但我还是要提醒一句现场调试时尽量不要心算一个数算错够你排查半天的。手机上的计算器开到程序员模式或者用电脑上自带的计算器切到Hex模式十进制的500输进去直接切到Hex就出来了又快又稳。3.3 BCD码工控里最容易误当成16进制的李鬼这是我最想单独拿出来讲的一个话题因为太多人在BCD码上栽过跟头。BCD码用4个bit来表示一个十进制数比如十进制25用BCD表示是0x25但这里的25代表的是十进制的25正常16进制0x25等于十进制的37。同一个符号两种解释结果差了12。工控现场什么时候会碰到BCD很典型的就是老的编码器、拨码开关、以及某些仪表的日期时间数据。比如有些PLC读取的实时时钟数据年、月、日、时、分、秒通常是用BCD码存储的。你读出来0x25以为是35十六进制换算成十进制但人家实际上是想表达25日。你如果不做BCD到十进制的转换直接丢给触摸屏显示日期就全错了。判断一个数据到底是BCD还是16进制只有一个可靠方法看手册。手册里如果明确写了BCD格式就必须按BCD处理把每一位十六进制数字直接当作十进制用0x25就是25。如果手册没写那默认按16进制换算。所以我的习惯是拿到任何新设备的协议说明第一件事就是搜BCD三个字母看有没有相关定义。3.4 大小端字节序数据反了的元凶之一字节序是我遇到过的让无数调试人员半夜崩溃的问题。16位数据也就是两个字节比如十六进制0x1234存储的时候有两种方式一种是高字节12在前低字节34在后这叫大端Big-Endian另一种是低字节34在前高字节12在后这叫小端Little-Endian。Modbus协议标准规定用大端传输但很多PLC、触摸屏在内部存储时用的是小端这就导致一个很尴尬的局面你用Modbus从设备读回来的寄存器在报文里看到的是0x12 0x34但放进PLC的数据寄存区里却变成了0x34 0x12也就是反过来了。我建议你在做通讯对接的时候先拿一个已知的值做一次字节序测试。比如给设备写一个地址地址里故意放一个能用两种解释区分的值然后读回来对比一下就知道该不该做高低字交换。这个动作一分钟就能完成省下的是按小时计的超时排查时间。4. 工控里的三个典型场景把前面的知识串起来4.1 解析一条Modbus RTU报文我随便写一条典型的Modbus读取报文01 03 00 00 00 02 C4 0B。抄起分析01是从站地址表示一号设备。03是功能码表示读保持寄存器。00 00是寄存器起始地址十六进制转成十进制就是0。00 02是你想读的寄存器数量也就是读2个寄存器。C4 0B是CRC校验低字节在前。假设从站响应01 03 04 00 64 00 0B F6 4A。这里04表示后面跟着4个字节的数据00 64对应第1个寄存器的值按十六进制转十进制0x0064等于10000 0B对应第2个寄存器等于11。这个过程看起来简单但你平时一定会遇到的是数据对不上。特别是第1个寄存器的值你的上位机读出来如果是100但是显示成了25600那不用怀疑绝对是字节序问题00 64被上位机解释成了0x640025600。这种问题排查起来很费劲但一旦你知道是字节序问题处理起来只需要在组态里勾选一个交换字节序选项即可。4.2 触摸屏上显示的地址跟PLC里的寄存器到底怎么对应很多触摸屏的组态软件里地址写的是4x0001、3x0002这种格式。开头的4代表保持寄存器3代表输入寄存器后面的四位数是PLC的寄存器编号。你要往里面填数据的时候虽然界面上显示的是十进制但在底层通讯时组态软件会自动把它转成十六进制地址。有一次我帮客户做一套小型监控系统触摸屏上的一个数值显示总是比PLC里的实际值大了很多倍数。我拿计算器一算发现正好是256倍也就是PLC里存的是1触摸屏显示的是256。排查到最后是数据来源的传感器上传的是单字节数据而触摸屏寄存器设定的数据类型是单字多出来的高字节部分全被清零了等于给数据补了个底。最终我把数据源的两个字节合并成一个字并把字节序调整一致问题就解决了。这个例子告诉我们数据在跨设备流转时你要关注的不仅是数值本身还有它存储的宽度一个字节还是两个字节和字节顺序。前一个设备把数据放在低字节后一个设备读取的时候可能只读高字节数据就变了。4.3 模拟量采集与工程量转换中的16进制角色模拟量输入模块把4到20毫安的电流信号或者0到10伏的电压信号转换成数字量。这个数字量在PLC内部存储时通常是以十六进制或者十六进制上限形式存在。比如一个12位的模拟量模块转换结果的范围通常是0到4095对应的16进制就是0x000到0xFFF。你在程序里看到AIW0模拟量输入字的值是十六进制的0x0FFF就知道当前是满量程。如果是0x0800那就是一半量程对应12mA或者5V。不用去记那些复杂的斜率公式用16进制一眼就能看出模拟量在量程范围内的相对位置。如果在程序里读出来的值变成0xFFFF那大概率是断线或者超量程。很多新手会把0xFFFF当做一个很大的数去做工程转换结果触发了错误的报警。我习惯在程序里专门做一个判断如果AIW的值等于0xFFFF直接置为无效状态而不是参与运算。这个习惯帮了我很多次。5. 现场调试的问题排查实录与避坑经验5.1 读回来的数爆炸了怎么快速定位原因现象上位机通过Modbus读回来的数据本来应该在0到100之间结果出现了65535、25600之类的极端值。排查顺序先确认通讯是否正常数据是否有效。无效状态下很多设备会返回0xFFFF这就是65535的来源。再看数据类型是否匹配。对方写的是有符号整数你按无符号读负数会变成很大的正数比如-1在无符号下就是65535。然后检查字节序。刚才说过的256倍问题基本就是高低字节颠倒。最后检查数据长度。对方是一个字节的8位数据你按16位来读读出来的数就不对。我在现场的一个经验是把读回来的原始十六进制先打印出来看不要直接看转换后的十进制。原始值往往能一眼暴露问题是出在通讯层还是转换层。比如原始值如果是FF FF直接想都会觉得是无效数据但如果只看转换后的十进制65535你可能还会怀疑半天是不是量程设置出了问题。5.2 日期时间总是乱码BCD码转化没做好设备读回来的日期是0x2025年显示出来却是2085年。为什么因为年用了BCD格式0x20代表200x25代表25合起来是2025但你按普通的十六进制换算0x2025变成了8229直接乱套了。解决办法在程序里写一个BCD转十进制的功能块。核心逻辑很简单对每一位十六进制数字把它当成十进制的同值来处理比如0x25的高位是2低位是5结果就是25。用位运算就能实现低四位与上0x0F高四位右移4位然后两项相加。我的建议是每台设备的通讯程序里都预留好BCD转换的接口随时能调用。因为你不知道今天的设备用不用BCD明天新接的设备可能就在日期时间上编码存储。5.3 校验码老报错先别急着怀疑CRC算法Modbus通讯经常报CRC校验错误这是我最常见的小白问题。CRC校验本身是确定的算法但算不对的原因很多时候不是算法写错了而是参与计算的字节范围弄错了。有些设备是从站地址开始算有些设备是从功能码开始算还有的设备把CRC自身两个字节也算进去了那必定报错。这时候如果你懂字节和16进制的基础就知道该怎么做把原始报文逐字节列出来确认哪一段属于数据段哪一段属于校验段然后按设备手册明确的范围重算校验。别凭感觉改CRC算法容易越改越乱。5.4 几个很快的速算技巧最后分享几个实用速算技巧一个字节的最大值0xFF就是255两个字节最大值0xFFFF就是65535这四个全是F的值是最重要的边界值。看到0x800032768往往意味着符号位是有符号数的负数最小值。在模拟量里0x00代表量程下限0xFFF代表量程上限中间值就是量程中点。16进制转二进制每一位展开4位比如0xA就是10100x5就是0101这个一定熟了。你在分析位状态寄存器的时候这个能力很值钱。在手算的时候用计算器比心算可靠。现场配一台带程序员模式的计算器是工控调试的基本职业素养。我自己做项目这么久最深的一点体会就是基础概念不是拿出来复习的而是在你踩坑的那一刻才显示出它真正的价值。字节与16进制看起来很小但几乎所有通讯异常、数据错乱最终都要回到这个最底层去解释。把这个基础打牢了你在工控这条路上会少掉很多不必要的加班。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号