你是不是也遇到过这种情况:明明PLC程序逻辑没问题,可监控数据时就是看不懂,翻来覆去查半天,最后发现是数制搞错了?别笑,这几乎是每个自动化工程师的“必修课”。

说白了,PLC的世界里不只一种语言。机器内部只认0和1,但咱们人类习惯用十进制,调试时又得看十六进制,碰上老设备还得懂八进制。这四种数制就像四个“方言”,不懂它们,哪怕你梯形图画得再漂亮,也容易栽跟头。

先搞懂两个核心:基数跟位权

所有数制的底层逻辑其实就两样东西:基数和位权。

打开网易新闻 查看精彩图片

基数,就是这套数制里有多少个“数字符号”。二进制只有0和1,基数是2;十进制有0到9,基数是10;十六进制有0到9和A到F,基数是16。

位权更关键——同一个数字在不同位置,代表的值不一样。比如十进制“123”,1在百位,代表100;2在十位,代表20;3在个位,代表3。这背后就是“逢基进一”的规则。

记住一句话:任何数制转换,本质都是“按权展开,逐项相加”。掌握了这个,后面所有方法你都能自己推导出来。

二进制:PLC的“母语”

打开网易新闻 查看精彩图片

PLC里最简单的就是二进制。一个开关,要么通要么断,对应0和1。所有逻辑运算、数据存储、通讯传输,底层全是二进制。

你平时看到的I/O点状态、继电器线圈,其实都是二进制信号。理解二进制,就是理解PLC的“母语”。别觉得它简单,很多复杂问题追根溯源,最后都卡在这里。

十六进制:二进制的“压缩包”

二进制写起来太长了。比如一个16位的寄存器,要写“1010 1100 0011 1110”,看着就头晕。十六进制就方便了:一位数代表四位二进制,上面那串直接写成“AC3E”。

打开网易新闻 查看精彩图片

在PLC里,存储器地址、通讯数据帧、连续I/O状态,几乎都用十六进制表示。你打开编程软件的监控表,看到“2F”或者“0x2F”,别慌,它对应的就是二进制“0010 1111”。

八进制:老古董但不得不防

有些老式的OMRON、Allen-Bradley PLC,I/O地址还是用八进制编的。比如“I0.7”之后下一个不是“I0.8”,而是“I1.0”,因为八进制里没有数字8和9。

如果你负责维护老旧设备,不了解八进制,连地址都对不上。不过现在新系统基本淘汰了,知道有这么回事就行。

打开网易新闻 查看精彩图片

BCD码:连接数字和显示的桥梁

这个稍微特殊点。BCD码是用4位二进制表示1位十进制数。比如十进制39,BCD码是“0011 1001”,而不是纯二进制的“100111”。

为什么搞这么麻烦?因为有些数字显示设备(比如七段数码管)和拨码开关,只能直接识别BCD码。用纯二进制转换,会有舍入误差,精度不够。

所以碰到需要精确十进制的场合,比如温度、压力仪表,或者HMI上的数值显示,得先搞清楚是BCD码还是纯二进制。

打开网易新闻 查看精彩图片

转换方法:其实就三招

第一招,其他进制转十进制。不管二进制、十六进制、八进制,把每一位数字乘以它的位权,然后加起来。比如二进制“1101”,1×8+1×4+0×2+1×1=13。就这么简单。

第二招,十进制转其他进制。用“除基取余”法。比如25转二进制,不断除以2,取余数,倒着排。得“11001”。转十六进制就除以16。

第三招,二进制和八进制、十六进制互转。用分组法:二进制转八进制,三位一组;转十六进制,四位一组。反过来,每一位八进制或十六进制,直接展开成对应的三位或四位二进制。

打开网易新闻 查看精彩图片

BCD码的转换更简单:十进制每一位单独转成4位二进制,反过来也一样。注意别和纯二进制混淆就行。

实战中怎么用?

看一个最简单的场景。你在监控数据寄存器D100,发现里面值是“1234”。但它是十进制还是十六进制?如果是十六进制,实际数值是4660(因为1×4096+2×256+3×16+4)。你按十进制去算,肯定出错。

再比如,模拟量模块采集的温度值,PLC内部存的是十六进制。你要算实际温度,就得先把它转成十进制,再套线性公式。不懂数制转换,连量程都算不对。

打开网易新闻 查看精彩图片

通讯更典型。Modbus报文里全是十六进制,比如“01 03 02 00 0A 79 8D”。看懂每一段代表的含义,才能判断数据对不对。没有十六进制基础,你只能干瞪眼。

最后,给你个建议。在编程软件里,养成习惯:给变量命名时标注数制,比如“V_Data_BCD”或“V_Addr_Hex”。注释里写清楚,避免自己坑自己。

数制这个东西,看似基础,但真能决定你调试效率。下次遇到数据不对,别急着查程序,先看看是不是数制搞混了。

你平时在PLC编程中,被数制坑过吗?评论区聊聊,说不定能帮到更多人。

打开网易新闻 查看精彩图片