写在前面
很多 PLC 新手最困惑的问题之一就是:
模拟量模块读回来一个 0~27648 的数字,怎么变成温度、压力、流量?
还有人觉得这个转换公式很简单,不就是线性换算吗?但到了实际项目中,很多人还是会算错、用错,甚至搞不清楚 4~20mA 和 0~10V 的区别。
今天这篇文章,就带你彻底搞懂 PLC 模拟量转换的全部知识——从数学原理、编程实现,到实际项目中到底哪些地方需要用到它。
一、模拟量转换的基本原理
先说清楚一个概念:PLC 是数字系统,只能处理 0 和 1。但工业现场有大量模拟信号——温度、压力、液位、流量、速度、位置等等。
“模拟量输入模块”的作用,就是把这些连续的物理量,转换成 PLC 能读懂的整数值。
1.1 标准信号范围
工业上最常用的模拟量信号有两类:
| 信号类型 | 标准范围 | 分辨率值范围 | 适用场景 |
| 电压信号 | 0~10V / -10~+10V | 0~27648 / -27648~27648 | 位移传感器、电位器 |
| 电流信号 | 4~20mA / 0~20mA | 0~27648 | 压力、温度、流量、液位 |
| 热电阻 PT100 | -200~850℃ | 0~27648(需模块支持) | 高精度测温 |
| 热电偶 | 0~1300℃(K型) | 0~27648 | 高温测量 |
1.2 核心转换公式
这是所有 PLC 工程师必须刻在脑子里的公式:
工程值 = (数字量 ÷ 27648) × (量程上限 - 量程下限) + 量程下限
或者写成更通用的形式:
Y = (X ÷ Xmax) × (Ymax - Ymin) + Ymin
其中:
○X = PLC 读取到的原始数字量(0~27648)
○Xmax = 数字量最大值(西门子一般为 27648)
○Ymin = 传感器量程下限(如 0℃、4mA 对应的值)
○Ymax = 传感器量程上限(如 100℃、20mA 对应的值)
○Y = 最终得到的工程实际值
举个例子——一个 4~20mA 的压力变送器,量程 0~1.6MPa,PLC 读到数字量 13824:
工程值 = (13824 ÷ 27648) × (1.6 - 0) + 0 = 0.5 × 1.6 = 0.8 MPa
简单吧?但这个公式的价值远不止于此。
二、为什么要写转换程序?
很多人觉得:直接把模拟量读出来用不行吗?为什么要多写一段转换程序?
答案很简单:
2.1 数字量没有物理意义
操作工在触摸屏上看到的应该是“温度 85℃”,而不是“AIW 读数是 23500”。
如果你直接把原始值显示出来,现场没人看得懂。
2.2 方便报警和逻辑判断
假设你要设置“温度超过 90℃ 就报警”——如果你不转换,就得算 90℃ 对应多少数字量;如果换了传感器量程,又要重新算。
写了转换程序之后,直接在 HMI 上设置 90℃ 就行,一劳永逸。
2.3 方便调试和排查
当现场人员说“压力不对”的时候,你打开程序看到“当前压力 = 0.35MPa”,比看到“原始值 = 6055”要直观一万倍。
2.4 标准化和复用
把转换逻辑封装成 FB(功能块),以后所有模拟量信号直接调用,不用每次重新写一遍。
三、转换程序的编程实现
不同品牌的 PLC 实现方式略有不同,但核心思路完全一致。以下以最常用的几种为例:
3.1 西门子 S7-1200/1500(SCL 语言)
// 模拟量转换功能块 FB FUNCTION_BLOCK "FB_AnalogScale" VAR_INPUT iRawValue : INT; // 原始值 0~27648 rEngLow : REAL; // 工程量下限 rEngHigh : REAL; // 工程量上限 END_VAR VAR_OUTPUT rEngValue : REAL; // 转换后的工程值 END_VAR BEGIN rEngValue := INT_TO_REAL(iRawValue) / 27648.0 * (rEngHigh - rEngLow) + rEngLow; END_FUNCTION_BLOCK
3.2 西门子 S7-200 SMART(梯形图)
// 使用库指令 S_ITR 直接完成转换 // 输入端填写: // Input = AIW16(模拟量输入通道) // Ish = 27648 // Isl = 0(4mA对应5530,需注意偏移) // Osh = 量程上限 // Osl = 量程下限 // Output = VD100(转换结果)
3.3 三菱 FX 系列
// 三菱使用 SCL 指令或自己编写 // 假设 D0 = 模拟量原始值 0~4000 // 转换到 0.0~100.0(温度) // D100 = 转换结果 DMUL D0 K100 D10 // D0 * 100 DDIV D10 K4000 D100 // D100 = (D0*100)/4000
3.4 汇川 / 信捷(Codesys 平台)
// 使用标准库函数 LINEAR_CONVERSION // 或自己写 ST 代码 IF iRawValue < 0 THEN rEngValue := rEngLow; ELSIF iRawValue > 27648 THEN rEngValue := rEngHigh; ELSE rEngValue := INT_TO_REAL(iRawValue) / 27648.0 * (rEngHigh - rEngLow) + rEngLow; END_IF
四、转换程序在实际项目中的应用场景
这才是本文的重点——知道公式不难,知道用在哪里才是关键。下面列出工业现场最典型的应用场景:
4.1 温度控制(PID 调节)
加热炉、反应釜、注塑机料筒、烘干线……几乎每条产线都有温度控制。
●PT100 热电阻 / K型热电偶 → 温度变送器 → 4~20mA → PLC 模拟量模块 → 转换程序 → 实际温度值
●转换后的温度值送入 PID 指令,控制加热器 SSR/接触器通断
●同时显示在触摸屏上,超过设定值就报警
4.2 压力与液位监控
储罐、管道、液压站、气源系统都需要压力或液位监控:
●压力变送器(4~20mA)→ 模拟量输入 → 转换为 MPa/bar → 上下限报警
●液位计(超声波/雷达/静压)→ 转换为米/百分比 → 控制进料泵启停
●多段压力控制:低压启动→ 中压保压 → 高压关断,全部依赖转换后的实际值判断
4.3 流量计量与累计
水处理、化工配料、食品灌装中,流量计量是核心:
●电磁流量计→ 4~20mA 输出瞬时流量 → PLC 转换为 m³/h
●定时采样 + 积分累计 → 计算出总流量 → 用于贸易结算或物料平衡
●小流量切断:流量低于阈值自动关闭阀门,防止滴漏
4.4 称重与配料系统
饲料、混凝土、化工原料的自动配料系统:
●称重传感器→ 变送器 → 4~20mA 或 0~10V → PLC 转换为 kg
●快加料→ 慢加料 → 精加料 三级控制,全部依赖实时重量值判断
●去皮、清零、累计批次重量等功能,基础都是准确的模拟量转换
4.5 位置与位移检测
伺服/步进系统之外,很多场合用模拟量传感器检测位置:
●拉线位移传感器→ 0~10V → PLC → 转换为 mm → 用于液压缸位置反馈
●激光测距仪→ 4~20mA → 转换为 m → 天车定位、堆垛机位置检测
●角度传感器→ 转换为度 → 阀门开度反馈、摆臂位置控制
4.6 速度与转速反馈
变频器控制的电机、传送带速度检测:
●编码器→ 频率转模拟量模块 → 0~10V → PLC 转换为 m/min 或 RPM
●多台电机速度同步:读取每台的实际速度→ 比较 → 调整变频器输出
●传送带打滑检测:主动轮 vs 从动轮速度差值超过阈值 → 报警停机
4.7 环境参数监测(GxP / 合规场景)
制药、食品、电子洁净车间对环境参数的严格监控:
●温湿度变送器→ 4~20mA → PLC → 转换为 ℃ 和 %RH
●压差变送器→ 转换为 Pa → 洁净区正压维持
●CO₂ / O₂ 分析仪 → 转换为 ppm → 发酵罐、气调库监控
●所有数据记录、趋势曲线、审计追踪,都基于转换后的工程值
4.8 数据上传与 MES/SCADA 对接
转换后的工程值,是工厂信息化的基础数据来源:
●PLC → OPC UA / Modbus TCP → SCADA 上位机 → 实时显示和存储
●MES 系统读取温度、压力、产量等数据 → 生成生产报表
●设备 OEE 分析:停机时间、产量、良品率,都需要准确的模拟量数据
五、常见坑和注意事项
模拟量转换看似简单,但实际项目中以下问题经常翻车:
5.1 4~20mA 的偏移量别忘了
4mA 不等于 0!西门子 S7-1200 默认 4mA 对应数字量 5530,0mA 对应 0。
所以如果你用的是 4~20mA 传感器,公式里应该是:
工程值 = (X - 5530) ÷ (27648 - 5530) × (Ymax - Ymin) + Ymin
很多人直接用 X/27648 算,结果 4mA 时不是量程下限,差了约 20%。
5.2 信号干扰导致读数跳动
工业现场电磁干扰严重,模拟量信号经常会跳动。解决方法:
●硬件层面:使用屏蔽电缆、单端接地、远离变频器/动力线
●软件层面:加一阶低通滤波,取 N 次平均值
// 简单的一阶低通滤波 rFiltered := rFiltered * 0.7 + rNewValue * 0.3;
5.3 量程选择错误
传感器量程选 0~1MPa,但你接线时配置的模块量程是 0~10MPa,读数就完全不对。
一定要确认:传感器实际量程 = 程序里设定的量程范围。
5.4 数据类型溢出
西门子 INT 范围是 -32768~32767,刚好能放下 27648。
但做乘法运算时(如 X * 1000),可能超过 32767 导致溢出,要用 DINT 或 REAL 类型。
5.5 断线检测
4~20mA 有个天然优势:电流 < 4mA(如断线时 ≈ 0mA)可以判断为故障。
IF iRawValue < 5530 THEN // 低于4mA bSensorFault := TRUE; rEngValue := 0.0; END_IF
六、完整 FB 封装示例(西门子 SCL)
以下是生产环境中可直接使用的完整功能块,包含了滤波、断线检测、上下限钳位:
FUNCTION_BLOCK "FB_AnalogInput" VAR_INPUT iRaw : INT; // 模拟量原始值 rEngMin : REAL; // 工程量下限 rEngMax : REAL; // 工程量上限 b4to20mA : BOOL; // TRUE=4~20mA, FALSE=0~20mA rFilterCoef : REAL; // 滤波系数 0.0~1.0 rAlarmHi : REAL; // 高报警值 rAlarmLo : REAL; // 低报警值 END_VAR VAR_OUTPUT rValue : REAL; // 滤波后的工程值 bFault : BOOL; // 传感器故障 bAlarmHi : BOOL; // 高报警 bAlarmLo : BOOL; // 低报警 END_VAR VAR rRawMin : REAL; // 4mA对应的数字量 rRawMax : REAL := 27648.0; rTemp : REAL; rLastValue : REAL; END_VAR BEGIN // 设定4mA偏移 IF b4to20mA THEN rRawMin := 5530.0; ELSE rRawMin := 0.0; END_IF; // 断线检测 IF iRaw < REAL_TO_INT(rRawMin * 0.9) THEN bFault := TRUE; rValue := rEngMin; ELSE bFault := FALSE; // 线性转换 rTemp := (INT_TO_REAL(iRaw) - rRawMin) / (rRawMax - rRawMin) * (rEngMax - rEngMin) + rEngMin; // 一阶低通滤波 rValue := rLastValue * rFilterCoef + rTemp * (1.0 - rFilterCoef); rLastValue := rValue; // 报警判断 bAlarmHi := rValue > rAlarmHi; bAlarmLo := rValue < rAlarmLo; END_IF; END_FUNCTION_BLOCK
这个 FB 封装好后,所有模拟量通道直接调用即可,参数在 HMI 上就能调整,非常方便。
七、总结
回到最初的问题:PLC 模拟量转换公式有什么用?
| 核心作用 | 一句话说明 |
| 物理意义转换 | 让 PLC 读到的数字变成人能看懂的温度、压力、流量 |
| 控制逻辑基础 | PID 调节、上下限报警、分段控制全部依赖转换后的实际值 |
| HMI 人机交互 | 触摸屏上显示工程值,操作工才能正常使用 |
| 数据上传与分析 | MES/SCADA 需要的是工程值,不是原始数字 |
| 故障诊断 | 断线检测、信号异常判断,依赖转换后的合理范围判断 |
| 程序标准化 | 封装 FB 后一键复用,所有模拟量统一处理 |
模拟量转换,是 PLC 工程师的“基本功”。看似简单的一行公式,背后串联起了传感器选型、信号接线、程序架构、HMI 显示、数据上传一整条技术链。
搞懂它,你就不再只是“会接线的电工”,而是真正理解工业自动化数据流的工程师。
全部0条评论
快来发表一下你的评论吧 !