PLC中模拟量标定的NORM_X指令
在电气自动化控制系统中,PLC模拟量处理是核心环节之一。现场传感器(如压力、温度、流量变送器)传输过来的通常是连续变化的模拟信号,经过A/D转换后变成PLC内部的整数值。为了让这些数值具有实际的工程意义,或者为了方便后续的PID调节、百分比显示,我们需要对这些原始数据进行“标定”和“归一化”。NORM_X(归一化)指令正是完成这一任务的关键工具,它能将任意范围的输入数值线性转换为 0.0 到 1.0 之间的标准浮点数。
一、 理解 NORM_X 的核心逻辑
NORM_X 指令的本质是一个线性数学运算,其作用是将输入值(VALUE)按照设定的最小值(MIN)和最大值(MAX)比例缩放到 0.0 至 1.0 的区间内。
数学公式
该指令执行的运算逻辑可以通过以下公式表达:
$$ OUT = \frac{(VALUE - MIN)}{(MAX - MIN)} $$
其中:
- $VALUE$:实际采集到的模拟量原始数值。
- $MIN$:原始数据的最小量程(对应输出 0.0)。
- $MAX$:原始数据的最大量程(对应输出 1.0)。
- $OUT$:计算结果,范围为 0.0 到 1.0 的实数(Real)。
数据流向逻辑
为了直观地理解数据从采集到归一化的过程,请参考以下流程图:
如 4-20mA"] --> B["模拟量模块转换
Raw Integer 0-27648"] B --> C["NORM_X指令"] C -- "MIN: 5530
MAX: 27648" --> D["标准化输出 OUT
Float 0.0-1.0"] D --> E["后续处理
PID控制 / HMI显示"] style C fill:#f9f,stroke:#333,stroke-width:2px style D fill:#bbf,stroke:#333,stroke-width:2px
二、 指令参数详解
在使用 NORM_X 指令前,必须清晰了解各个引脚的定义。以下是西门子 S7-1200/1500 PLC 中该指令的参数说明:
| 参数名 | 数据类型 | 说明 |
|---|---|---|
EN |
Bool | 使能端,信号状态为 1 时执行指令。 |
MIN |
Real/Int | 输入值的最小值,当输入等于 MIN 时,输出为 0.0。 |
MAX |
Real/Int | 输入值的最大值,当输入等于 MAX 时,输出为 1.0。 |
VALUE |
Real/Int | 需要进行标定的实际输入值(即模拟量采集到的原始值)。 |
ENO |
Bool | 使能输出,如果指令执行无误且 EN 为 1,则信号状态为 1。 |
OUT |
Real | 归一化结果,范围归整为 0.0 到 1.0 之间的浮点数。 |
三、 实战演练:标准 0-20mA 信号的归一化
假设现场有一个压力传感器,输出信号为 0-20mA,对应压力量程为 0-10bar。模拟量模块将 0-20mA 转换为 0-27648 的数字量。我们需要使用 NORM_X 将这个 0-27648 的数值转换为 0.0-1.0 的比例。
步骤 1:准备变量
首先在 PLC 变量表中建立所需的变量:
Raw_Input:Int 类型,存放模拟量模块采集到的原始值。Norm_Result:Real 类型,存放归一化后的结果。Min_Scale:Real 类型,设为0.0。Max_Scale:Real 类型,设为27648.0。
步骤 2:编写程序(SCL 语言示例)
SCL 语言非常适合处理这种数学逻辑,打开 TIA Portal 的代码块,输入以下代码:
// 定义局部变量或使用全局变量
"Raw_Input" := "IW64"; // 假设模拟量通道地址为 IW64
// 调用 NORM_X 指令
"Norm_Result" := NORM_X(
MIN := 0.0, // 最小原始值设为 0
MAX := 27648.0, // 最大原始值设为 27648
VALUE := "Raw_Input" // 输入实际采集值
);
// 结果验证:
// 如果 Raw_Input 为 0,则 Norm_Result 为 0.0
// 如果 Raw_Input 为 13824 (50%),则 Norm_Result 为 0.5
// 如果 Raw_Input 为 27648,则 Norm_Result 为 1.0
步骤 3:观察结果
下载 程序到 PLC 并监控变量。改变输入电流,观察 Norm_Result 的变化。当电流为 20mA(数值 27648)时,Norm_Result 应显示 1.0;当电流为 10mA(数值 13824)时,Norm_Result 应显示 0.5。
四、 进阶应用:处理 4-20mA 信号
工业现场更常见的是 4-20mA 信号,因为 4mA 可以用于检测断线故障。这种信号下,0mA 通常对应故障,4mA 对应工程量零点,20mA 对应工程量满量程。
场景设定
- 传感器量程:0-100°C。
- 输出信号:4-20mA。
- 模拟量模块设置:0-20mA 量程(对应数值 0-27648)。
计算标定点
- 零点标定:4mA 对应的数值约为 5530(计算公式:$27648 \times \frac{4}{20} = 5529.6$)。
- 满量程标定:20mA 对应的数值为 27648。
为了将 4-20mA 的信号“截断”并归一化(即让 4mA 对应 0.0,20mA 对应 1.0),我们需要调整 NORM_X 的 MIN 和 MAX 参数。
步骤 1:配置参数
MIN设置为5530.0。MAX设置为27648.0。
步骤 2:编写 SCL 代码
// 假设 Raw_Temp 是采集到的 0-20mA 原始数值
// 归一化处理 4-20mA 段
"Temp_Normalized" := NORM_X(
MIN := 5530.0, // 4mA 对应的数值
MAX := 27648.0, // 20mA 对应的数值
VALUE := "Raw_Temp" // 当前采集值
);
// 此时:
// 若传感器输出 4mA (数值 5530),OUT = 0.0 (代表 0°C)
// 若传感器输出 12mA (数值 16589),OUT = 0.5 (代表 50°C)
// 若传感器输出 20mA (数值 27648),OUT = 1.0 (代表 100°C)
步骤 3:处理断线情况
当信号线断开时,数值为 0(即小于 MIN 值 5530)。此时 NORM_X 的计算结果可能小于 0.0。在实际工程中,通常需要添加逻辑判断:
// 如果归一化结果小于 0 或大于 1,或者原始值为 0,则认为故障
IF "Raw_Temp" < 100 THEN
"Sensor_Fault" := TRUE; // 激活故障位
ELSE
"Sensor_Fault" := FALSE;
END_IF;
五、 注意事项与故障排查
在使用 NORM_X 指令时,请注意以下细节以确保系统稳定运行。
1. 数据类型一致性
NORM_X 指令的参数支持多种数据类型,但为了精度,建议统一使用 Real(浮点数)类型。如果输入 VALUE 是整数(Int),指令通常会自动转换,但在 SCL 编写时,显式转换能避免潜在警告。例如:
// 推荐写法:显式转换为 Real
"Norm_Result" := NORM_X(
MIN := 0.0,
MAX := 27648.0,
VALUE := INT_TO_REAL("Raw_Input")
);
2. 边界值的截断
NORM_X 指令通常具有内部限幅功能。
- 如果输入
VALUE小于MIN,输出OUT通常被限制为 0.0。 - 如果输入
VALUE大于MAX,输出OUT通常被限制为 1.0。
但是,具体行为取决于 PLC 的固件版本和指令实现,最稳妥的方式是在程序中确保输入值在合理范围内,或者根据指令手册确认溢出行为。
3. 结合 SCALE_X 使用
NORM_X 仅将数值转换为 0.0-1.0。如果需要直接得到工程单位(例如 0-100 的温度值),请在 NORM_X 后串联 SCALE_X 指令。
SCALE_X 接收 NORM_X 的输出(0.0-1.0),并将其按比例映射到新的工程量范围(如 0.0-100.0)。
// 典型的两步标定流程
// 第一步:归一化
Temp_Norm := NORM_X(MIN := 0.0, MAX := 27648.0, VALUE := Raw);
// 第二步:缩放至工程量
Temp_Real := SCALE_X(MIN := 0.0, MAX := 100.0, VALUE := Temp_Norm);
通过以上步骤,你可以精确地将现场的模拟信号转换为 PLC 内部易于处理的标准数据,为后续的控制逻辑奠定坚实基础。

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