博图 FB 封装模拟量换算|两种实现方式(NORM_SCALE / 一次函数 y=kx+b)可直接复制
大家好,本篇延续模拟量科普内容,手把手把模拟量量程换算封装成独立 FB 功能块,一次封装、反复调用,多个压力 / 温度 / 液位传感器不用重复写代码,极大精简程序。
提供两套等效写法,一套调用博图标准指令,一套纯数学公式手写,新手都能看懂,完整代码直接自取。
适用场景
- 标准线性模拟量传感器,PLC 原始 IW 数值转实际物理工程量,支持额外零点补偿偏移量。
- 西门子 S7-1200/1500 通用。
方法 1:标准库指令 NORM_X + SCALE_X 缩放(官方推荐)
原理:先把原始整数归一化到 0.0~1.0,再映射到自定义物理量程。
//1、原始IW数值归一化 0.0~1.0
分辨率比例 := NORM_X(
MIN := #IN_分辨率MIN,
VALUE := #IN_IW,
MAX := #IN_分辨率MAX);
//2、归一化数值映射到实际物理量程
#测量值 := SCALE_X(
MIN := #IN_量程MIN,
VALUE := #分辨率比例,
MAX := #IN_量程MAX);
//3、叠加零点补偿值,输出最终工程量
#OUT_输出值 := #测量值 + #IN_补偿值;
方法 2:手写一次函数 y=kx+b 纯数学换算(无依赖指令)
工控模拟量换算本质就是线性插值,不用调用系统指令,手动推导系数,逻辑透明,方便新手理解换算底层逻辑。
//y:最终物理量;x:PLC 采集的 IW 原始数值
//计算斜率k
#k:=(#IN_量程MAX – #IN_量程MIN) / (#IN_分辨率MAX – #IN_分辨率MIN);
// 计算截距b
#b := #IN_量程MIN – #k * #IN_分辨率MIN;
// 线性换算原始数值
#测量值 := #k * #IN_IW + #b;
// 叠加补偿偏移
#OUT_输出值 := #测量值 + #IN_补偿值;
关键说明 & 使用贴士
两套代码运算结果完全一致,任选其一即可;
- 标准 4-20mA /0-10V信号固定;
- 西门子模拟量模块:IN_分辨率MIN=0、IN_分辨率MAX=27648;
- 补偿值用于现场传感器零点漂移修正,无偏移时赋值 0 即可;
- 封装成 FB 块后,多个模拟量通道多次调用,程序结构整洁,便于后期维护、项目交接。
实操举例
压力传感器量程 0~1.0MPa,4mA 对应 0,20mA 对应 27648,零点补偿 + 0.02MPa。
PLC 读取 IW 数值 = 13824,代入后最终输出 0.52MPa。
- 小tips:AO 模拟量反向输出量程换算,这套 FB 只需要调换量程 MIN、MAX 数值就能复用。
后续会继续分享 FB 多重实例化、模拟量软件滤波配套写法,需要的朋友可以收藏关注 ᕙ(`▿´)ᕗ
(◕ᴗ◕✿) 深耕工控,日日精进



![打卡信奥刷题(3584)用C++实现信奥题 P11523 [THUPC 2025 初赛] 摊位分配-171主机测评](https://www.171host.com/wp-content/uploads/2026/09/20260922020544-6ab1e2783b78e-220x150.png)