公司动态

PLC数据类型与进制转换实战:从位、字节到BCD码一次讲透

📅 2026/9/1 10:49:16
PLC数据类型与进制转换实战:从位、字节到BCD码一次讲透
PLC编程里最常见的一种“逻辑没毛病、结果对不上”就是数据类型和进制转换出了问题。程序不报错但比较结果总是反的模拟量换算老是差一位通过通信读上来的数据像乱码这类故障根子大多数都不在梯形图逻辑而在数据类型没理清或者进制理解有偏差。这一讲作为PLC实操系列的二十三讲我把数据类型、存储结构和进制转换一次性讲透然后按西门子、三菱和汇川的常用环境分别演示一套能直接照着做的验证流程。文章内容不挑具体硬件型号重点看思路和判断标准学完至少能自己排查掉七成以上的数据错乱问题。1. 先搞懂PLC运算的最小单元位、字节、字、双字1.1 位是PLC里最小的状态表达PLC的底层运算说到底只有两种状态有电和没电通和断对应数字就是1和0。这个最小单位叫Bit中文常叫“位”。一个位只能表达两个状态所以用来描述按钮、继电器、电机接触器这类开关量非常合适。比如X0输入是一路按钮Y0输出是一路接触器梯形图里X0控制Y0本质上就是某一个位从0变1再让另一个位从0变1。到这里大部分人都能理解。但实际调试时位并不是单独存在的它会被组合成字节、字、双字来读写。这也是很多人第一次看监控表时发懵的原因明明只按了一个按钮却看到某个地址里出现了一个很大的数字其实那是多个位一起组成的数据。1.2 字节、字、双字的容量关系数据量从小到大排列如下位Bit1个二进制位值为0或1。字节Byte8个位能表达256种状态无符号范围是0到255。字Word16个位由2个字节组成无符号范围是0到65535。双字DWord32个位由4个字节组成无符号范围是0到4294967295。这里要记住一个核心关系1字等于2字节等于16位1双字等于4字节等于32位。很多程序里地址编号是连续的比如MW10占了MB10和MB11两个字节如果不知道这个结构你往MW10里写数据监控MB10时只看到一个不完整的值就很难判断数据到底对不对。注意在西门子PLC里MB、MW、MD这类地址经常交叉占用。MW10和MB10不能同时用来存两组无关数据否则后写入的数据会覆盖掉前面的结果。1.3 为什么数据类型必须显式声明PLC里的每个变量不能只叫“数值1”它必须有一个明确的数据类型。原因是同一个32位二进制串按无符号整数看可能是4294967295按有符号整数看是-1按浮点数看又是另一个完全不同的值。CPU本身不理解“数字多少”它只负责按你指定的类型去解释这一段二进制串。所以编程软件里所有变量都有类型下拉框比如Bool、Byte、Int、Real。把这个下拉框理解成“解释规则”就好数据存储形式一样解释规则不同结果就不同。做项目时从一开始就为每个变量设定好类型比后面到处猜要省时间得多。2. PLC里的常用数据类型从布尔量到实数2.1 无符号与有符号0到65535为什么有时会变成负数无符号整数就是把全部位都用来表达数值16位的范围是0到65535有符号整数用最高位做符号位范围是-32768到32767。很多刚入门的人把0到65535的数据直接存进INT变量里结果发现大于32767后显示成了负数这不是PLC坏了而是数据溢出后发生了补码解释。举个例子把十进制的40000二进制转为1001110001000000刚好16位。如果这个地址被声明为无符号WORD监控显示40000如果同一个地址被声明为有符号INT显示就成了-25536。输入没变存储的位模式也没变只是解释方式变了。做项目时先问自己这个量会不会为负取值范围到底是多少再决定用WORD还是INT。2.2 INT、DINT、REAL多数指令出错的重灾区实际项目里最常用的是INT、DINT、REAL这三种。INT16位有符号整数适合温度、速度、计数器等整数值。DINT32位有符号整数适合大范围计数、累计量、编码器位置。REAL32位浮点数适合模拟量换算、PID参数、带小数点的计算。容易出错的点在于指令之间的类型不匹配。西门子博途环境下MOVE指令可以直接把INT给REAL吗不一定有些情况下软件会报类型错误有些情况会强制你加转换指令。三菱和汇川环境下不同类型的数据也不能直接放进同一个运算指令里否则指令不执行或者结果异常。我最常给的建议是项目里建一个统一的“数据类型约定”表模拟量通道用INT累计量用DINT浮点运算用REAL通信数据尽量用WORD或BYTE然后统一规律不要今天这个变量用INT明天为了省事改成DINT后天又改成REAL。类型一乱排查成本立刻翻倍。2.3 各品牌PLC数据类型命名差异同一套数据概念在不同品牌PLC里命名不一样。西门子Bool、Byte、Word、DWord、Int、DInt、Real。三菱Bit、Word、DWord在软元件里直接体现但编程变量常见的整数类型有16位、32位之分。汇川沿用了IEC标准较多类型命名和西门子接近。千万不要因为名称不同就怀疑自己学错了。核心还是记住每个类型占多少位有没有符号能不能表达小数。只要把这三件事弄清楚换到任何一个品牌都只需要重新记一下指令名。3. 进制转换的核心规则手算、心算和程序算法3.1 二进制、十进制、十六进制的基本关系进制转换在PLC里不是数学考试而是日常调试工具。PLC内部只认二进制但人看二进制太累所以编程软件用十进制显示用十六进制检查寄存器内容通信报文里也常见十六进制。四者关系如下表进制基数数字组成PLC里常见场景二进制20、1位状态、指令表底层表达八进制80到7部分PLC的输入输出地址编号十进制100到9人机交互、触摸屏、一般变量显示十六进制160到9、A到F寄存器值、通信报文、查故障代码二进制转十六进制最简单的方法是从右往左每4位一组。比如二进制10101100从右往左分成1010和1100两组1010对应十六进制A1100对应C结果就是0xAC。这个方法比逐位乘权重快而且不容易错。二进制转十进制可以从左往右按2的幂累加。10101100从高位到低位分别是1×128、0×64、1×32、0×16、1×8、1×4、0×2、0×1加起来1283284172。而0xAC的十六进制转十进制是10×1612172三个结果一致。3.2 BCD码和普通十六进制不要混为一谈BCD码是PLC里很经典的坑。BCD码不是简单地把十进制数转成十六进制而是把十进制每一位单独转成4位二进制。比如十进制25普通十六进制是0x19但BCD码需要把2转成0010把5转成0101结果是00100101也就是0x25。这导致在监控表或触摸屏上看到的值和实际数值经常差一截。很多编码器、温控仪表、称重仪表、老式文本屏会使用BCD码如果你按十六进制去读会得到一个看起来正常但实际不对的数据。三菱PLC里有BCD和BIN指令作用就是完成“普通二进制和BCD编码”之间的转换。西门子环境里处理仪表通信时也经常要手动拼BCD字节。处理这类问题时先确认通信协议里的描述写的是HEX还是BCD再决定要不要转。3.3 用PLC程序做进制转换的基本思路PLC里做进制转换可以不用手算很多指令能直接完成复制指令MOV把数据从源地址搬到目标地址不改变位模式。转换指令CONV把同一位宽的数据从一种类型解释转换为另一种类型比如INT转REAL。数值处理指令比如三菱的BCD、BIN西门子里通过转换函数或SCL计算。如果现场没有现成指令也可以使用四则运算实现“除基取余”例如连续除以16取余得到十六进制每一位。但常规项目不建议自己写复杂换算逻辑驱动和仪表通常直接提供十六进制或十进制寄存器能省则省。4. 实操一西门子PLC环境下的数据类型与转换4.1 先做最小实验用MOVE指令验证存储结构建议实际动手时不要直接上完整程序而是先建一个最小实验。第一步新建一个项目PLC选S7-1200、S7-1500、200 SMART都可以。第二步在DB块里建立几个变量变量名数据类型初始值Data_WordWord0Data_IntInt0Data_RealReal0.0Data_ByteByte0第三步写一段梯形图用一个常ON触点把十六进制16#1234通过MOVE指令传给Data_Word。然后在线监控观察Data_Word的值。你会发现Data_Word显示4660因为16#1234转换成十进制就是4660。再把同时建的Data_Int也赋值为16#8000观察显示值。0x8000按WORD看是32768但按INT看是-32768。这就是同一个二进制串在不同类型下的差异。最小实验做一次比背十遍概念都管用。4.2 CONV指令的用法和常见误区西门子博途里的转换指令叫CONV可以把一种类型转换成另一种类型。常见用法INT转REAL用于模拟量换算、PID运算前。REAL转DINT用于浮点结果转成整数显示。BYTE转INT用于通信数据包的单字节组合。需要注意CONV转换不是简单的重新解释有时会改变数值的表示方式有时会因为目标类型范围不够而溢出。实际使用中先把源数据在线监控里看好当前值再考虑要不要转换。REAL转INT时如果是负数或带小数还要想清楚是四舍五入还是截断。举例模拟量模块输入0到27648对应0到10V要换算成0到100的温度值。常见写法是先把AIW或IW拿到手的INT值转成REAL再除以27648乘以100最后转成DINT或INT给触摸屏用。如果不转REAL直接用INT做除法整数除法会丢掉小数部分结果会变成0或者跳变明显。4.3 模拟量换算里的数据类型配合模拟量处理是最容易暴露数据类型问题的地方。西门子模拟量模块通常返回16位整数默认范围0到27648。如果直接用这个值和设定温度比较数值单位对不上所以中间必须有一层换算。推荐流程读取模拟量原始值类型是INT。用CONV指令把INT转成REAL。做线性换算例如实际值 原始值 / 27648.0 × 量程上限。把结果转回DINT或保留REAL用于触摸屏显示和报警比较。这里还要警惕模块断电、断线时返回值变成32767或-32767的情况。这些极限值不是正常量程数据程序里要加范围判断。否则断了一根线触摸屏显示的温度冲到最大报警也会跟着乱报现场第一反应就会怀疑模块坏了实际就是数据没做边界过滤。5. 实操二三菱和汇川环境里的转换指令与通信判断5.1 三菱FX系列的BIN和BCD指令三菱FX系列里控制字地址通常用D寄存器比如D0、D100。写入的数据默认为十进制整数底层是二进制存储。但很多老式仪表、编码器或者文本屏希望收到BCD编码这时就要用到BCD指令。示例流程把D0里的十进制数值转换成BCD结果传到D10。如果D01234执行BCD指令后D10里保存的0x1234在线监控如果按十进制看是4660按十六进制看才是1234。反向操作时用BIN指令把D10里的BCD值还原成普通二进制数值。这个例子非常典型。只从监控表数值来看很多人以为D10变成了4660就是程序算错了实际上三菱软件里D10默认十进制显示4660只是十六进制1234的十进制表现。只要确认通信协议要求的是BCD数据就是正确的。注意通信协议写明“BCD码”时触摸屏或仪表的寄存器显示值往往和实际数值相差一个“十进制和十六进制”的视觉差。判断标准不是看数值像不像而是看协议描述。5.2 汇川PLC中的常用转换指令汇川PLC整体指令风格和IEC标准更接近数据类型概念和西门子有相似之处比如支持INT、DINT、REAL等类型。编程时同样要遵守类型匹配原则不同类型做运算前需要转换。汇川环境里常见的做法是使用转换指令或直接在结构化文本里使用类型转换函数。如果在梯形图里碰到类型不匹配软件会提示但提示不意味着程序不能下载有些情况下只是警告结果不对要回到数据类型上重新检查。我在实际项目里会优先把通信类寄存器统一配置成Word或DWord再把需要运算的数值通过转换指令变成Int或Real。这样通信层和人机交互层分离排查问题时能快速定位是通信解包错了还是数据运算错了。5.3 通信场景下的数据长度和进制判断PLC做Modbus通信时寄存器默认16位一个寄存器能读到一个Word。如果设备说明书里写“寄存器地址40001数据类型为无符号整数单位0.1℃”那你读到的值要乘以0.1才是实际温度。这里既有数据长度问题也有数值解释问题。如果设备有两个寄存器组合成一个32位浮点数就要考虑字节顺序和字顺序。常见的顺序组合有ABCD、CDAB等顺序不对会导致数值变成天文数字或特别小的数。这种问题不是进制不会算而是没有确认协议格式。排查通信数值异常时我会按这个顺序来先看原始寄存器值确认数据类型是16位还是32位。再看编码方式是普通二进制还是BCD码。再看有无符号是无符号整数还是有符号整数。最后看高低字节顺序是否需要交换。这四层都要和仪表说明书的寄存器表对照。只有说明书齐全才能一次性判断出该用哪种转换。6. 总是出错按这个顺序排查数据类型和进制问题6.1 从现象反推问题层次数据不对的排查不应该从“猜指令”开始而应该从现象分层。如果触摸屏上显示的值和实际设备读数相差很大先看是不是模拟量量程换算问题。如果通信读到的寄存器值一直是0或65535先看数据类型和寄存器地址。如果比较运算结果不稳定先看参与比较的变量是INT还是REAL是否混用了类型。如果程序偶尔报错但下载正常先看是否存在数组越界、数据超出目标范围。不要一上来就改算法。先用监控表把每一个中间量都看一遍找到第一个数值出现异常的位置再顺藤摸瓜。6.2 常见错误一有符号和无符号混用典型场景外部设备返回一个无符号整数40000PLC变量却声明成INT程序里就显示-25536。此时无论是比较、显示还是通信回传都会错。处理方式把变量类型改成Word或DInt确保目标范围能覆盖源数据。如果不是自己项目里的变量最好在程序里加一条范围判断把超出合理范围的数据丢弃或报警。6.3 常见错误二十六进制当成BCD码处理典型场景温控仪表返回BCD码0x2500代表温度250.0℃。如果直接把0x2500按普通十六进制转成十进制结果是9472再除以10就是947.2℃完全乱了。处理方式判断协议里有没有“BCD”字样。有BCD字样时按BCD解码比如0x2500解析为十位2、百位5、个位0、小数位0再合成250.0。不要看到十六进制就按HEX转十进制先把编码方式确认了再动手。6.4 常见错误三通信字节顺序颠倒典型场景读一个32位浮点数PLC解出来是1.23触摸屏显示成823456000000000000000之类的超大数。处理方式直接按字节交换顺序验证。可以先把原始四个字节按顺序LOW、HIGH、HIGH、LOW或HIGH、LOW、LOW、HIGH组合一遍看哪个结果落在合理范围内。实际项目里这个试错过程一般不超过十分钟。6.5 固定排查清单最后留一份我自己排查数据类故障时会对照的清单检查项判断标准数据类型是否明确每个变量都有类型没有灰色寄存器数值范围是否匹配无符号数不超过上限有符号数不出现负值异常通信协议编码方式明确是HEX、BCD、还是二进制补码字节顺序16位和32位分别检查是否需要交换模拟量量程换算确认原始值上下限和工程量上下限边界值处理断线、超限、初始值都有过滤条件这个清单可以贴在调试工位旁边。每次遇到“数值对不上”按表逐项打勾大多数问题都能在半小时内定位。做PLC项目数据类型的功夫不在背概念而在遇到问题时有条理地拆开检查先看存储规则再看进制解释最后查通信顺序。把这一套流程练熟后面再接触运动控制、视觉通信、数据库对接都能少走很多弯路。