ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PLC编程进阶:进制转换与数据类型详解(西门子三菱示例)

PLC编程进阶:进制转换与数据类型详解(西门子三菱示例) 很多同学在学 PLC 时最先接触的是点动、自锁、互锁这类基本指令逻辑简单、现象直观很容易建立信心。可一旦开始处理模拟量采集、变频器通信、触摸屏地址甚至只是读取一个编码器数值就会发现程序里到处是“16 位”“32 位”“十六进制”“BCD 码”这样的词。如果进制转换和数据类型没搞透写出来的程序轻则显示乱码重则设备动作异常排查起来非常痛苦。这篇文章是《PLC 编程》系列的第二十三讲围绕“进制转换与数据类型”这两个核心基础展开。内容定位偏向入门到进阶的中间地带既讲清楚概念也给出可以直接参考的程序示例。本文会结合西门子和三菱两大主流 PLC 平台讲解二进制、十六进制、BCD 码的转换方法梳理位、字节、字、双字、整数、实数等常用数据类型并通过一个完整的实战案例演示进制转换在实际工程中的应用。如果你正在做 PLC 编程入门或者写过一些简单逻辑但还没系统整理过数据类型相关的知识这篇文章值得认真读一遍。1. 为什么 PLC 编程要掌握进制转换与数据类型1.1 一个真实的工作场景想象一下现场有一台变频器通过 Modbus 通信把当前频率传给 PLC。你从变频器手册上看到频率寄存器地址是 0x2100数据格式是“无符号 16 位整数”单位是 0.01 Hz。这时候你要做的不是把地址填到通信指令里就行而是要理解0x2100 是十六进制地址换算成十进制是多少对应 Modbus 报文该如何填写变频器返回的数值是 0x0BB8这个值等于十进制 3000但实际频率是 3000 × 0.01 30.00 Hz。如果 PLC 将返回值错误地当成“有符号整数”处理超出范围后会出现负数频率显示瞬间变成-226.00 Hz。这个例子足以说明进制转换和数据类型不是纸上谈兵的理论而是直接影响通信、运算、显示结果的工程技能。1.2 数据类型决定通信与数值范围PLC 内部的存储单元本质上都是“位”的组合一个位只能表示 0 或 1。8 个位组成一个字节16 个位组成一个字32 个位组成一个双字。同样一段二进制数据以不同数据类型去解释得到的数值完全不同。例如 16 位二进制数1111 1111 1111 1110如果按无符号整数看它是 65534。如果按有符号整数看它是 -2。如果按 16 位十六进制看它是 0xFFFE。如果按两个字节看可能是 0xFF 和 0xFE需要再确认是高字节在前还是低字节在前。很多通信数据解析错误根源不是通信指令写错了而是数据类型没有选对。所以掌握 PLC 数据类型和进制转换是程序可靠性的前提。2. PLC 中的进制系统2.1 二进制和十六进制PLC 底层只认识二进制但在编程软件中直接写一长串 0 和 1 非常不方便所以指令中经常使用十六进制作为二进制的缩写形式。十六进制每一位对应二进制中的 4 位转换非常直观。常用进制对应表十进制二进制十六进制BCD 码000000000010001100019100191001101010A0001 0000151111F0001 0101161 0000100001 0110BCD 码是“用四位二进制表示一位十进制数”例如十进制 16 的 BCD 码不是 0001 0000而是 0001 0110百位 0十位 1个位 6。常见的拨码开关输入、一些老式仪表输出甚至部分编码器模块仍会用到 BCD 码。2.2 八进制在 PLC 中的应用初学 PLC 的人容易忽略八进制但西门子 PLC 的输入输出地址就有典型的八进制体现。比如西门子 S7 系列的 I 区地址I0.0 ~ I0.7 I1.0 ~ I1.7 I2.0 ~ I2.7这里没有 I0.8、I0.9因为字节中的位地址按八进制排列8 到 9 不出现。同样西门子扩展机架的槽号也不是连续十进制而是 0、1、2、4、8、16 等这与八进制/二进制位权有关。三菱 PLC 的输入输出编号则主要使用十进制和十六进制例如 FX 系列的 X0~X7、X10~X17从 X7 之后跳到 X10也有一种“不连续”的感觉。这种编号沿袭了八进制习惯新手分配点位时要注意不要误以为 X8 是存在的。2.3 BCD 码与拨码开关BCD 码Binary-Coded Decimal二进制编码十进制数在 PLC 工程中的典型场景有旋转拨码开关四位拨码可以表示 0~9把十位、个位组合起来形成十进制数字。七段数码管显示某些晶体管输出模块直接输出 BCD 码给七段译码器。仪表通讯协议有些旧式仪表为了用有限的寄存器传更多信息会约定“高四位是整数部分低四位是小数部分”其实质也是 BCD 处理。三菱 PLC 中有两条常用指令BCD和BIN。BCD指令把二进制整数转换成 BCD 码常用于驱动数码管显示。BIN指令把 BCD 码转换成二进制整数常用于读取拨码开关或其他 BCD 设备。比如三菱 FX 系列中MOV K123 D0 ; 将十进制123送入D0 BCD D0 K2Y0 ; 将D0中的数值转换为BCD码输出到Y0开始的8个输出点这里的 K2Y0 表示 Y0 开始的 8 个位表达的是 BCD 码的个位和十位。如果在学习资料中看到类似指令可以对照手册确认细节。3. PLC 常用数据类型详解3.1 位、字节、字、双字在 PLC 中数据类型按大小可以分为名称位数代表符号西门子说明位1 bitBOOL只有 0 和 1 两种状态字节8 bitBYTE范围 0~255字16 bitWORD范围 0~65535双字32 bitDWORD范围 0~4294967295西门子博途TIA Portal中访问位、字节、字、双字的方式非常经典I0.0 // 输入位 IB0 // 输入字节 IW0 // 输入字 ID0 // 输入双字注意 IW0 和 ID0 会重叠占用地址。IW0 占用 IB0 和 IB1ID0 占用 IB0 到 IB3。如果不小心把两个数据都分配在重叠地址修改其中一个会影响另一个。这种“地址重叠”是新手容易踩的坑。三菱 PLC 中对应关系X0~X7 // 输入位 X10~X17 // 同一组输入位 D0 // 16位数据寄存器 D0、D1 // 32位数据寄存器组合在三菱中32 位数据通常用两个连续数据寄存器组合比如D0 D1其中 D0 是低位D1 是高位。不同的 PLC 在“高字在前还是低字在前”上可能不同通信时需要确认。3.2 有符号整数与无符号整数16 位存储单元既能表示 0~65535也能表示 -32768~32767区别在于最高位是否作为符号位。西门子常见整数类型类型位数范围SINT8 bit-128~127USINT8 bit0~255INT16 bit-32768~32767UINT16 bit0~65535DINT32 bit-2147483648~2147483647UDINT32 bit0~4294967295三菱常见整数类型16 位整数-32768~3276732 位整数-2147483648~2147483647无符号整数在部分指令中通过指定寄存器区域间接体现比如数据寄存器 D 本身按有符号/无符号解释取决于指令和寻址方式。实际项目中如果你读取一个 16 位模拟量模块的原始值它可能是 0~27648西门子或 -32768~32767某些模块数据类型选错会把正值变成负值。比如 16 位二进制 0xFFFF按无符号数是 65535按有符号数是 -1。通信协议中如果没有明确说明一般要默认按无符号整数读取再根据范围换算。3.3 实数浮点数当需要处理小数比如温度 26.5℃、压力 1.25 MPa就不能用整数类型而要用实数 REAL。西门子 REAL 占用 32 位遵循 IEEE 754 标准。三菱的浮点数通常用E指令存储和读取32 位浮点数据占用两个数据寄存器。实数在 PLC 中参与运算是“近似值”不能直接判断相等。例如比较浮点数相等时要使用允许误差IF ABS(value - 26.5) 0.01 THEN // 认为相等 END_IF;这类写法在西门子 SCL 和三菱 ST 中都可以实现。3.4 字符串与数组更复杂的程序还会用到字符串STRING、数组ARRAY、结构体STRUCT。西门子 S7-1200/1500 支持这些复合数据类型三菱 FX 系列基本不支持字符串Q 系列与 L 系列部分支持。字符串在触摸屏显示、数据记录、报警文本中有广泛应用但在底层通信中字符串往往还需要转换成字节数组再发送。数组示例PLC 模拟量滤波VAR analogBuffer : ARRAY[0..9] OF INT; // 存储10次采样值 sumValue : DINT; averageValue : INT; END_VAR数据类型越清晰程序的可读性和移植性越好。3.5 西门子与三菱数据类型对照西门子三菱说明BOOL位软元件 X/Y/M/S1 位BYTE部分指令中 K4X0 等8 位WORDD 寄存器16 位无符号 16 位INTD 寄存器16 位有符号 16 位DWORDD、D132 位无符号 32 位DINTD、D132 位有符号 32 位REAL浮点指令软元件2 个 DIEEE 754 浮点实际编程时三菱软件不像西门子那样强制要求声明数据类型D 寄存器既可以当成整数存也可以传给浮点指令当浮点用这种灵活性虽然方便但也容易埋雷。4. 进制转换方法与 PLC 实现4.1 手算转换方法先掌握手工转换再看程序实现会更容易理解。二进制转十六进制从右往左每 4 位一组不足补 0。二进制1010 1111 十六进制A F 结果0xAF十六进制转十进制0x2A 2 × 16 10 42十进制转二进制除以 2 取余逆序排列。42 ÷ 2 21 余 0 21 ÷ 2 10 余 1 10 ÷ 2 5 余 0 5 ÷ 2 2 余 1 2 ÷ 2 1 余 0 1 ÷ 2 0 余 1 逆序101010这些方法在考试和面试中常见但工程中更多是理解 PLC 指令如何完成转换。4.2 在西门子 SCL 中实现进制转换西门子博途支持 SCL结构化控制语言可以用类似高级语言的语法实现进制转换。下面是一个把 16 位无符号整数转换为十六进制字符串的函数示例核心思路是循环取余数。// 文件路径在OB1中调用或建立FC函数 FUNCTION UINT_TO_HEX_STR : String VERSION : 0.1 VAR_INPUT value : UInt; END_VAR VAR_TEMP temp : UInt; idx : Int; hexDigit : Char; hexTable : ARRAY[0..15] OF Char; resultStr : String[8]; END_VAR BEGIN hexTable[0] : 0; hexTable[1] : 1; hexTable[2] : 2; hexTable[3] : 3; hexTable[4] : 4; hexTable[5] : 5; hexTable[6] : 6; hexTable[7] : 7; hexTable[8] : 8; hexTable[9] : 9; hexTable[10] : A; hexTable[11] : B; hexTable[12] : C; hexTable[13] : D; hexTable[14] : E; hexTable[15] : F; resultStr : ; temp : value; idx : 0; WHILE temp 0 DO hexDigit : hexTable[temp MOD 16]; resultStr : CONCAT(hexDigit, resultStr); temp : temp / 16; idx : idx 1; END_WHILE; IF resultStr THEN resultStr : 0; END_IF; UINT_TO_HEX_STR : resultStr; END_FUNCTION这段代码在博途较低版本中可能出现字符连接函数语法差异需要根据实际版本调整。更常见的做法是直接利用 PLC 内置的格式化指令或者把数值交给触摸屏的“显示格式”处理并不一定需要字符串转换。4.3 在三菱指令中实现进制转换三菱 PLC 的核心转换指令是BCD和BIN此外还有HEX转换与通信指令密切相关。以下是一个简单示例把 D0 中的十进制数据用 BCD 码方式输出到 Y0~Y7MOV K123 D0 BCD D0 K2Y0当 D0 123 时K2Y0 的输出状态对应Y0~Y3个位 3 - 0011 Y4~Y7十位 2 - 0010如果还需要百位就需要更大的输出区域比如 K3Y0对应 Y0~Y11。反过来当输入侧接了一组拨码开关例如 X0~X11 组成三位 BCD 码可以把拨码值读入 D0BIN K3X0 D10这样 D10 中就是二进制整数。4.4 进制转换中的注意事项数据长度16 位 BCD 最大只能表示 9999超过后会溢出。32 位 BCD 最大表示 99999999使用时要注意实际范围。负数的处理BCD指令通常不直接支持负数转换遇到负数需要先取绝对值再单独处理符号位。位软元件的组合K4Y0 中的 K4 表示 4 个组每组 4 位共 16 位。K2Y0 表示 2 个组共 8 位。三菱中的 K4 在这里不是“十进制常数 4”的普通含义而是组合位元件的组数刚学时容易看懵。5. 完整实战触摸屏地址与设备数据解析5.1 需求描述假设我们有一台设备通过 Modbus RTU 返回 16 位保持寄存器值。设备手册规定寄存器地址0x0100返回值类型无符号 16 位整数单位0.1 ℃我们需要读取该值在触摸屏上显示实际温度并把温度值同时以十六进制形式显示方便现场对照设备手册排查数据。这个案例虽然简单但包含数据类型选择、地址换算、公式运算、显示格式处理等完整流程。5.2 创建变量与符号表在西门子 S7-1200 中先在 PLC 变量表中建立以下变量名称数据类型地址注释Read_RawUIntMW10从仪表读取的原始值TemperatureRealMD20实际温度单位℃Hex_DisplayWordMW40用于触摸屏显示十六进制原始值Conversion_DoneBoolM50.0转换完成标志在三菱 FX 系列中对应变量可以这样安排D0原始值D1实际温度浮点数需要使用 32 位区比如 D10 D11D20十六进制显示值注意三菱 FX 浮点数需要两个连续数据寄存器例如 D10 和 D11。5.3 编写转换程序西门子 SCL 可以在 OB1 中直接编写// 原始值寄存器读取已经通过Modbus通信指令放到MW10 // 转换为实际温度0.1℃精度 Temperature : UINT_TO_REAL(Read_Raw) * 0.1; // 把原始值传送到MW40触摸屏按十六进制显示 Hex_Display : Read_Raw; Conversion_Done : TRUE;如果你使用梯形图逻辑更直观Network 1: MOVE - EN 执行 IN: MW10 OUT: MW40 Network 2: MUL_R EN: 读取 MW10 并转换为 REAL IN1: MW10自动转换 IN2: 0.1 OUT: MD20不过梯形图中做“整数转实数再乘法”需要调用转换指令不如 SCL 方便。三菱 Q/FX 系列 ST 或梯形图思路MOV D0 D20 ; 原始值送D20触摸屏按十六进制显示 FLT D0 D10 ; 整数转浮点D10 D11存储浮点数 EMUL D10 K0.1 D10 ; 浮点数乘以0.1如果软件不支持EMUL带浮点常数可以先把 0.1 存入浮点寄存器再做浮点乘法。5.4 运行与验证将程序下载到 PLC并启动监控。用 Modbus 调试工具给 PLC 写入寄存器值例如写入十六进制 0x012A十进制 298。观察变量Read_Raw 298 Temperature 29.8 Hex_Display 0x012A在触摸屏上添加两个显示控件一个显示 Temperature格式为“实数 1 位小数”另一个显示 Hex_Display格式为“十六进制”即可完成目标。5.5 结果说明这个案例体现了两个关键点原始数据是 16 位无符号整数需要先选对数据类型再用浮点乘法换算成工程值。十六进制显示不是靠“算法”算出来的而是把同一个数据以不同格式显示。触摸屏和 PLC 变量表都支持格式切换这也说明理解数据类型和进制显示方式非常重要。6. 常见问题与排查思路问题现象常见原因解决思路触摸屏温度显示为负数数据被当成有符号整数处理确认寄存器类型为 UINT改为无符号读取显示值比实际值大了 10 倍或 100 倍单位换算遗漏例如 0.1℃ 忘记乘 0.1核对设备手册确认每份代表的物理量十六进制显示和手册对不上字节顺序不一致检查 Modbus 通信的字节序必要时交换高/低字节数据总是 0~255超过后循环只读取了 8 位16 位数据被拆分检查地址寄存器是字节还是字重点确认使用“读保持寄存器”指令BCD 指令转换结果比实际大BCD 码不是普通十六进制直接按十六进制显示使用 BIN/BCD 指令转换不要直接 MOVE 到显示控件浮点数在触摸屏上显示为 0浮点数占用 32 位触摸屏地址与 PLC 地址未对齐确认触摸屏变量长度选 32 位且地址与 PLC 浮点寄存器一致此外还有一个高频问题在西门子中执行MOVE指令时如果源数据是 INT 而目标是 REAL部分版本不会自动转换必须先调用INT_TO_REAL。很多程序显示不正常的根源就是这种隐式/显式转换没有做。7. 最佳实践与工程建议7.1 命名规范变量命名应体现数据语义和单位例如AI1_Raw_Value AI1_Temperature_Real Encoder_Position_DInt尽量少用 D0、M0 这种原始地址在程序中到处裸奔除非你写的是一次性的调试程序。在博途和 GX Works 中都支持符号名编程多花一点时间建立变量表后续维护会轻松很多。7.2 数据类型统一通信回来的数据先明确协议类型再选择变量类型。建议在通信功能块接口处就统一完成数据类型转换例如把 Modbus 读回的UINT立刻转换为REAL工程值而不是把原始值传给上层的每一个逻辑块。这样后续比较、显示、报警都基于同一个工程值避免每个程序块各自乘系数、各自处理符号位。7.3 注意地址重叠在西门子中MB0、MW0、MD0 是重叠的。如果程序里同时使用 MW0 和 MB2虽然地址不重叠但如果你用了 MW0 和 MB1就需要注意 MP0 到底指哪个字节。最好的做法是数据寄存器区域按宽度分区规划例如 MW0~MW10 存放 16 位数据MD20~MD40 存放 32 位数据两片区域之间留出间隔。7.4 进制转换工具链现场调试时可以准备一个进制计算器或者使用电脑上的开发者工具、手机 App。熟练使用“十六进制转十进制”“浮点数转十六进制”等小工具能明显提高排查速度。7.5 安全与备份凡是涉及数据偏移、地址修改、通信字节序调整的程序变更都要在测试环境下验证后再下装到运行设备。正式项目建议先备份 PLC 工程和触摸屏工程再修改程序。使用BCD或BIN指令时如果目标是输出点更要注意不要强行改变输出状态避免设备误动作。8. 总结与下一步学习路线这篇文章从 PLC 编程中的进制系统开始介绍了二进制、十六进制、八进制和 BCD 码的基本概念然后详细梳理了 BOOL、BYTE、WORD、INT、REAL 等常用数据类型并通过西门子 SCL 和三菱指令做了转换示例。最后用触摸屏显示的场景案例把数据读取、类型转换、进制显示串成了一个完整闭环。学完这一讲你至少应该能回答这几个问题16 位数据在有符号和无符号两种解释下范围分别是多少十六进制 0x2A 等于十进制多少如果这是 BCD 码又代表哪个十进制数为什么通信读取回来的浮点数在 PLC 中经常要交换高低字节下一步可以继续学习模拟量输入输出模块的量程换算例如 0~27648 对应 0~10V。Modbus RTU 通信的具体报文格式把地址、功能码、数据长度和数据类型结合起来。编码器计数器相关高级指令会大量用到双字、有符号整数和十六进制状态判断。进制转换和数据类型在 PLC 编程中属于“越熟练越省心”的内容。希望这篇文章能帮你把最基础的地基打牢。如果你在调试过程中遇到过奇怪的数据显示问题也可以对照本文的类型和字节序表格逐一排查往往很快就能定位到根因。收藏这份笔记用到的时候直接翻出来看会非常方便。
返回列表