在电气自动化系统中,PLC(可编程逻辑控制器)采集的模拟量信号(如温度、压力、流量、液位等)通常以原始整数值形式存在。例如西门子S7系列PLC中,12位或16位AD转换后的结果被映射为 0–27648 范围内的整数——这是S7-1200/1500默认的“满量程整数范围”(Full Scale Integer Range),对应模拟输入模块的硬件分辨率极限。
但工程师真正需要的是带单位的工程值:比如 45.3℃、82.7%、2.34 bar。因此,必须将 0–27648 的原始值,线性、无失真、可逆地转换为 0.0–100.0 的浮点工程值(或其他指定量程)。这不是简单除法,而是一套需兼顾精度、边界处理、实时性和可维护性的标准化流程。
以下为完整实操指南,覆盖原理、计算、PLC编程、HMI显示、常见陷阱及验证方法,所有步骤均基于文字描述,无需图示即可准确执行。
一、理解线性转换的本质
模拟量转换本质是两点确定一条直线:原始值域(X轴)与工程值域(Y轴)之间构成一一对应的线性关系。
已知:
- 原始最小值
X_min = 0 - 原始最大值
X_max = 27648 - 工程最小值
Y_min = 0.0 - 工程最大值
Y_max = 100.0
线性函数通式为:
$$Y = \frac{Y_{\text{max}} - Y_{\text{min}}}{X_{\text{max}} - X_{\text{min}}} \cdot (X - X_{\text{min}}) + Y_{\text{min}}$$
代入得:
$$Y = \frac{100.0 - 0.0}{27648 - 0} \cdot (X - 0) + 0.0 = \frac{100.0}{27648} \cdot X$$
该公式即为标准转换模型。注意:此式成立的前提是硬件零点与满度点完全对齐,且无偏移、无非线性误差——这正是“标准化”的起点。
二、手动计算验证(用于调试与校验)
取三个典型点进行验算:
-
当原始值
X = 0:
$Y = \frac{100.0}{27648} \times 0 = 0.0$ -
当原始值
X = 13824(恰好为27648的一半):
$Y = \frac{100.0}{27648} \times 13824 = 50.0$(精确) -
当原始值
X = 27648:
$Y = \frac{100.0}{27648} \times 27648 = 100.0$
结论:该比例系数 100.0 / 27648 是精确的转换因子,其小数值为:
$$\frac{100.0}{27648} \approx 0.003616793$$
但严禁在PLC程序中直接使用该小数近似值——浮点运算累积误差、不同CPU浮点精度差异、编译器舍入策略均会导致微小偏差,尤其在长期运行或高精度场合(如计量仪表)可能超出允许误差限。
正确做法是:全程保持整数运算精度,仅在最后一步转为浮点。
三、PLC程序实现(以西门子TIA Portal V18为例)
3.1 推荐方案:整数缩放 + 浮点转换(兼顾精度与效率)
该方案分三步完成,避免浮点除法,规避舍入风险:
-
将原始整数乘以1000(放大1000倍)
#ScaledInt := #RawValue * 1000;
(此时#ScaledInt范围为0–27,648,000,仍在32位有符号整数范围内) -
用整数除法除以27648
#ScaledInt := #ScaledInt / 27648;
(结果为0–1000的整数,代表工程值×10,即0.0–100.0的十分之一精度) -
转换为浮点并除以10.0
#EngValue := REAL(#ScaledInt) / 10.0;
最终 #EngValue 即为 0.0–100.0 的工程值,保留一位小数精度,且全程无浮点除法,误差严格控制在 ±0.05 以内(因整数除法截断,最大舍入误差为0.5个“十分之一单位”,即0.05)。
✅ 优势:CPU运算快、确定性强、跨PLC型号一致
❌ 注意:#RawValue必须为INT或DINT类型;若原始值含符号(如-27648~+27648),需先取绝对值或调整零点偏移
3.2 备选方案:直接浮点运算(适用于低速、非关键回路)
若对性能无苛刻要求,且PLC支持双精度浮点(如S7-1500),可用更直观写法:
#EngValue := (REAL(#RawValue) * 100.0) / 27648.0;
该式逻辑清晰,但需注意:
REAL类型为单精度(约6~7位有效数字),27648.0可精确表示,但100.0 / 27648.0的商在内存中为近似值;- 实测在S7-1200上,
#RawValue = 27648时结果为100.000000,无可见偏差;但在极端循环(如10万次累加)后可能出现100.000015类误差; - 若项目要求IEC 61508 SIL2以上安全等级,应优先选用整数缩放方案。
3.3 边界保护:防止原始值越界导致异常
实际运行中,传感器故障、接线松动或干扰可能导致 #RawValue 超出 0–27648。需强制钳位:
IF #RawValue < 0 THEN
#RawValue := 0;
ELSIF #RawValue > 27648 THEN
#RawValue := 27648;
END_IF;
此逻辑必须置于转换计算之前。未做钳位时,#RawValue = -1 会输出负工程值(如 -0.0036),易引发HMI误报警或控制逻辑错误。
四、HMI/SCADA显示设置(WinCC Unified / FactoryTalk View)
工程值 #EngValue 传至HMI后,需配置显示格式以确保小数位数与单位清晰:
- 绑定变量:将HMI文本框的数据源设为PLC中的
#EngValue(数据类型REAL) - 设置格式字符串:在属性面板中找到“格式化” → “数字格式”,输入:
0.0
(含义:至少1位整数,强制1位小数,不显示千分位符) - 追加单位:在文本框静态内容中直接输入
" %"或" ℃",或使用动态拼接:
#EngValue + " %"(需HMI支持字符串表达式)
⚠️ 关键提醒:切勿在HMI端重新做转换!所有量纲转换必须在PLC侧完成。HMI仅负责显示——否则当同一变量被多个HMI画面调用时,转换逻辑分散,后期修改极易遗漏,造成数据显示不一致。
五、反向转换:工程值→原始值(用于设定值写入)
当HMI需下发设定值(如目标温度 65.0℃)给PLC时,必须执行反向线性转换,将 0.0–100.0 映射回 0–27648 整数。
反向公式为:
$$X = \frac{X_{\text{max}} - X_{\text{min}}}{Y_{\text{max}} - Y_{\text{min}}} \cdot (Y - Y_{\text{min}}) + X_{\text{min}} = \frac{27648}{100.0} \cdot Y$$
PLC中推荐整数实现:
// #Setpoint 为HMI传入的REAL型设定值(0.0–100.0)
#TempInt := DINT(#Setpoint * 10.0); // 放大10倍取整,得0–1000
#RawSetpoint := #TempInt * 27648 / 1000; // 整数运算,结果0–27648
验证:#Setpoint = 65.0 → #TempInt = 650 → #RawSetpoint = 650 * 27648 / 1000 = 17971(精确)
该结果可直接写入模拟量输出寄存器(如 AQW0),驱动阀门或变频器。
六、典型应用:4–20 mA电流信号对应关系
许多现场仪表输出4–20 mA,经AI模块转换后仍落在 0–27648 范围,但此时 0 不代表0mA,27648 不代表20mA——而是分别对应4mA和20mA。
若需将4–20 mA线性映射到 0.0–100.0(如阀门开度),则量程实际为16 mA,对应 27648 - 0 = 27648 数字量:
4 mA → 0.020 mA → 100.0
此时 X_min = 0, X_max = 27648, Y_min = 0.0, Y_max = 100.0,公式不变,仍为 Y = (100.0 / 27648) * X。
但若需映射到物理量(如 0–10 bar),则:
4 mA → 0.0 bar20 mA → 10.0 bar
此时 Y_min = 0.0, Y_max = 10.0,公式变为:
$$Y = \frac{10.0}{27648} \cdot X$$
只需替换分子,其余步骤完全一致。
七、精度与误差分析表
| 环节 | 潜在误差源 | 典型影响 | 应对措施 |
|---|---|---|---|
| 硬件AD转换 | 模块精度(如0.1% FS)、温漂、噪声 | ±28 LSB(27648×0.001) | 选用高精度模块(0.05% FS),加装屏蔽与滤波 |
| 整数缩放转换 | 整数除法截断 | 最大±0.05工程单位 | 接受(符合工业显示常规精度);若需更高,改用 DINT × 10000 / 27648 得两位小数 |
| 浮点运算 | 单精度舍入、重复计算累积 | 单次<0.001,万次后≤0.01 | 避免在循环内重复计算;关键变量缓存中间结果 |
| HMI显示 | 格式化四舍五入 | 如 65.049 显示为 65.0 |
设置格式为 0.00,确保两位小数 |
注:
27648本身是2^15 - 2^10 = 32768 - 32768/8的变体,源于S7早期模块的15位有效分辨率设计,并非随意取值。坚持使用此基准值,可保证与所有西门子标准库(如SCALE指令)兼容。
八、调试与验证方法
-
硬件信号注入法
用精密电流源输出4.00 mA、12.00 mA、20.00 mA,记录PLC中#RawValue实际读数(应接近0、13824、27648)。若偏差>±10,则检查接线、模块配置(是否启用“20mA”模式)、接地。 -
软件强制赋值法
在TIA Portal在线监控中,手动将#RawValue设为0、13824、27648,观察#EngValue是否严格等于0.0、50.0、100.0。若有偏差,检查代码中是否误用REAL除法或漏掉钳位。 -
反向一致性验证
设定#EngValue = 33.3,执行反向转换得#RawSetpoint;再将该值代入正向转换,确认结果是否仍为33.3(允许±0.05)。若偏差超限,说明正反向算法不对称,需统一缩放因子。
九、常见错误与修正
| 错误操作 | 后果 | 正确做法 |
|---|---|---|
直接使用 #RawValue / 276.48 |
整数除法得 0(因 27648 / 276.48 非整数) |
必须先转 REAL 或用整数缩放 |
将 27648 写成 27647 或 32767 |
满度值偏高/偏低 0.036%,100.0显示为 99.964 或 84.3 |
查手册确认模块规格,西门子标准为 27648 |
在HMI中用 #RawValue * 100 / 27648 计算 |
HMI刷新慢、脚本卡顿、无法与PLC同步 | 所有计算在PLC完成,HMI只读取结果 |
忽略负值处理,传感器断线时 #RawValue = -32768 |
#EngValue = -118.4,触发虚假报警 |
必须增加 IF #RawValue < 0 THEN #RawValue := 0; END_IF |
十、扩展:适配其他PLC平台
- 三菱FX/Q系列:原始范围常为
0–4000(12位)或0–32767(16位有符号),需按实际X_max替换公式中分母; - 欧姆龙NJ/NX系列:默认
0–4000,但可通过设置改为0–32767,务必核对“输入范围”参数; - 国产PLC(汇川、信捷):多数兼容西门子
0–27648,但部分经济型型号用0–10000,需查阅模块手册第3.2节“数字量输出范围”。
核心原则不变:先确认硬件原始值域,再代入线性公式,最后选择整数或浮点实现路径。
十一、终极检查清单(部署前必做)
- [ ]
#RawValue变量类型为INT或DINT,非WORD(避免无符号溢出) - [ ] 钳位逻辑位于转换计算之前,且覆盖全部异常值(
< 0和> 27648) - [ ] PLC中
#EngValue数据类型为REAL,HMI绑定类型匹配 - [ ] HMI格式字符串为
0.0,非#.0或0.00(后者在值为0时显示0.00,非必需) - [ ] 反向转换代码中,乘法与除法顺序正确(先乘后除,防整数溢出)
- [ ] 下载程序后,在线监控
#RawValue与#EngValue,用三个测试点验证线性度
完成以上,即实现可靠、可复现、符合工业标准的模拟量标准化。

暂无评论,快来抢沙发吧!