文章目录

PLC中模拟量标定的NORM_X指令

发布于 2026-03-25 14:35:00 · 浏览 9 次 · 评论 0 条

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)。

数据流向逻辑

为了直观地理解数据从采集到归一化的过程,请参考以下流程图:

graph LR A["传感器模拟信号
如 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)。

计算标定点

  1. 零点标定:4mA 对应的数值约为 5530(计算公式:$27648 \times \frac{4}{20} = 5529.6$)。
  2. 满量程标定: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 内部易于处理的标准数据,为后续的控制逻辑奠定坚实基础。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文