在西门子 PLC(TIA Portal 时代)实现线性函数 y = kx + b,标准、稳定的做法是用 NORM_X(标准化)+ SCALE_X(缩放) 组合,等价于线性变换。以下为完整步骤、可直接套用的示例与关键要点。
一、核心原理与公式
线性函数本质是量程映射:y = (x − x_min) × (y_max − y_min) ÷ (x_max − x_min) + y_min
x:输入值(如计数器、AI 原始值)
x_min/x_max:输入范围
y_min/y_max:输出范围(如 AO 原始值、工程值)
y:输出结果
二、NORM_X + SCALE_X 组合(推荐,通用)
1. 指令逻辑
NORM_X:将输入 x 映射到 0.0~1.0(浮点数)公式:
norm = (x − x_min) ÷ (x_max − x_min)SCALE_X:将标准化值缩放到 y_min~y_max公式:
y = norm × (y_max − y_min) + y_min
2. 完整步骤(以 S7-1200/1500 为例)
步骤 1:定义变量(DB 块)
表格
| 变量名 | 数据类型 | 说明 |
|---|---|---|
| x_in | INT | 输入值(如 AI 原始值 0~27648) |
| x_min | INT | 输入下限 |
| x_max | INT | 输入上限 |
| y_min | INT | 输出下限 |
| y_max | INT | 输出上限 |
| norm_val | REAL | 标准化中间值 |
| y_out | INT | 最终输出(给 AO) |
步骤 2:梯形图(LAD)实现
调用 NORM_X(路径:指令 → 转换操作 → 标准化 NORM_X)
VALUE:
x_inMIN:
x_minMAX:
x_maxOUT:
norm_val调用 SCALE_X(路径:指令 → 转换操作 → 缩放 SCALE_X)
VALUE:
norm_valMIN:
y_minMAX:
y_maxOUT:
y_out(可选)限幅:用 LIMIT 指令防止超量程
步骤 3:结构化文本(ST)等价写法
st
// 1. 标准化 norm_val := (REAL_TO_INT(x_in) - REAL_TO_INT(x_min)) / (REAL_TO_INT(x_max) - REAL_TO_INT(x_min)); // 2. 缩放 y_out := INT(norm_val * (REAL_TO_INT(y_max) - REAL_TO_INT(y_min)) + REAL_TO_INT(y_min)); // 3. 限幅保护 y_out := LIMIT(y_min, y_out, y_max);
三、实战示例:AI→AO 线性变换
需求
输入 AI:4–20mA → 原始值 6400~32000(单极性)
输出 AO:0–10V → 原始值 0~27648
线性关系:4mA→0V,20mA→10V
组态与参数
硬件组态:AI/AO 模块设为 Raw 数据格式
变量赋值:
x_in = AI 原始值(如
IW64)x_min = 6400,x_max = 32000
y_min = 0,y_max = 27648
程序(ST 直接复制)
st
// 标准化:4–20mA → 0.0~1.0 norm_val := (REAL(x_in) - 6400.0) / (32000.0 - 6400.0); // 缩放:0.0~1.0 → 0~27648 y_out := INT(norm_val * 27648.0 + 0.0); // 限幅 y_out := LIMIT(0, y_out, 27648); // 输出到 AO 通道 QW80 := y_out; // 替换为实际 AO 地址
四、关键注意事项(必看)
数据类型
标准化必须用 REAL 避免精度丢失
输入 / 输出原始值为 INT(16 位)
模拟量原始值对照表
表格
信号类型 原始值范围 0–10V(单极性) 0~27648 4–20mA(单极性) 6400~32000 ±10V(双极性) -27648~+27648 模块组态
AI/AO 必须设为 Raw,禁止使用工程单位模式
双极性信号(如 ±10V)需将 x_min/x_max 设为 -27648~+27648
限幅保护
用 LIMIT 指令防止输入超量程导致输出异常
五、S7-200 SMART 兼容方案
S7-200 SMART 无 NORM_X/SCALE_X,用 FC105/FC106 或手动公式:
FC105(输入→工程值)
st
// IN:AI 原始值,LO_LIM/HI_LIM:工程范围,BIPOLAR:false(单极性) y工程 := FC105(IN := x_in, LO_LIM := 0.0, HI_LIM := 10.0, BIPOLAR := FALSE);
手动公式(输出 AO)
st
y_out := INT((x_in - 6400.0) / (32000.0 - 6400.0) * 27648.0);
六、常见问题排查
输出不动:确认模块为 Raw 格式,非工程单位
精度不足:全程用 REAL 计算,避免 INT 截断
超量程:增加 LIMIT 指令,限制 y_out 范围
4mA 不为 0V:检查 x_min/x_max 是否对应 6400/32000。





