欧姆龙PLC模拟量输入处理解析
欧姆龙PLC的模拟量输入功能块,本质上是一个软件工具,用于将连接至PLC的特殊模块(模拟量输入单元)采集到的外部物理信号(如温度、压力),转换成PLC程序可以识别和处理的数字量,并进行工程值换算、滤波等操作。
为了让你快速了解其核心要素,用下面这个表格来概括模拟量输入功能块的关键组成部分:
| 组件类别 | 核心要素 | 说明与典型实例 |
|---|---|---|
| 🛠️ 硬件基础 | 模拟量输入单元 | 物理模块,如 CP1W-AD042 、CJ1W-AD081-V1 ,负责进行模数转换。 |
| 信号类型与范围 | 支持电压(如0-10V, 1-5V)和电流(如4-20mA)输入 。 | |
| 🖥️ 软件接口 | 配置与设置 | 在编程软件(如CX-Programmer)中设置单元参数,如输入信号范围 。 |
| 数据存储区 | 转换后的数字量值存放在特定的PLC通道中,如CIO区 。 | |
| 📊 数据处理 | 量程转换 | 使用SCL、SCL2、SCL3等指令 ,将原始数字量转换为有意义的工程值(如0-100℃)。 |
| 数字滤波 | 应用限幅滤波、算术平均值滤波等算法 ,保证信号稳定可靠。 | |
| 特殊功能 | 断线检测 、峰值保留 、直接转换功能(高速处理) 。 |
模拟量输入功能块的处理流程,核心是将连续的物理信号转换为干净可用的数字信息,主要包括以下步骤:
信号采集与模数转换:外部传感器传来的连续模拟信号(如4-20mA电流)进入模拟量输入单元。单元内部的A/D转换器以特定的分辨率(如12,000 )和速度将其转换为一个原始的数字量(对于CP1W-AD042,4mA对应0,20mA对应2EE0 Hex )。
数据读取:PLC程序从分配给该模拟量单元的指定输入通道中读取这个原始数字量值 。
数据预处理与工程值转换:读取的原始值通常不能直接使用,需要:
在欧姆龙PLC的编程软件(如CX-Programmer)中,使用模拟量输入功能块主要涉及以下几步:
硬件组态与配置:在软件中添加并配置你所使用的模拟量单元模块,为每个通道设定正确的输入信号类型和范围(例如,指定CH1为4-20mA电流输入)。这是后续所有功能的基础。
编程与数据处理:
模拟量输入功能块是过程控制的核心,典型应用包括:
在实际应用中,有几点需要特别注意:
一个完整的模拟量输入功能块通常包含硬件配置、数据读取、工程转换、信号处理和状态诊断等部分。其处理流程可概括为:

要实现上图的流程,需要进行以下关键步骤:
功能块变量定义
首先需要定义功能块的输入、输出及内部变量。
st
FUNCTION_BLOCK AnalogInputFB
VAR_INPUT
bEnable: BOOL; // 功能块使能
wRawValue: UINT; // 模拟量原始值(来自硬件输入通道)
fSensorMin: REAL := 0.0; // 传感器量程下限(工程单位)
fSensorMax: REAL := 100.0; // 传感器量程上限(工程单位)
fRawMin: REAL := 0.0; // 原始值下限(通常为0或-6000等)
fRawMax: REAL := 6000.0; // 原始值上限(根据模块分辨率,如6000对应12000分辨率[citation:7])
bEnableFilter: BOOL; // 使能滤波
tFilterCycle: TIME := T#100MS; // 滤波采样周期
END_VAR
VAR_OUTPUT
fEngineeringValue: REAL; // 转换后的工程值
bSignalError: BOOL; // 信号错误(如断线)
bOverRange: BOOL; // 超量程报警
bUnderRange: BOOL; // 欠量程报警
END_VAR
VAR
aFilterBuffer: ARRAY[0..7] OF REAL; // 滤波缓冲区
nFilterIndex: INT := 0; // 当前滤波缓冲区索引
tLastSampleTime: TIME; // 上次采样时间
fSum: REAL; // 求和(用于平均值滤波)
END_VAR
注意:上述 fRawMax 和 fRawMin 的具体数值需要根据您使用的模拟量模块(如CP1W-MAD42)和设定的量程来确定。
工程值转换
这是功能块的核心,使用线性变换公式将原始值转换为工程值。SCL指令或其ST语言逻辑实现是此步骤的关键。
工程值 = (原始值 - 原始量程下限) / (原始量程上限 - 原始量程下限) * (工程量程上限 - 工程量程下限) + 工程量程下限
在ST语言中实现如下:
st
// 工程值换算
fEngineeringValue := (wRawValue - fRawMin) / (fRawMax - fRawMin) * (fSensorMax - fSensorMin) + fSensorMin;
数字滤波处理
为了稳定读数,通常需要加入软件滤波。以下是移动平均值滤波的一个简单实现:
st
// 移动平均值滤波示例
IF bEnableFilter THEN
// 更新滤波缓冲区
aFilterBuffer[nFilterIndex] := fEngineeringValue;
nFilterIndex := nFilterIndex + 1;
IF nFilterIndex >= SIZEOF(aFilterBuffer) THEN
nFilterIndex := 0;
END_IF
// 计算缓冲区中数据的平均值
fSum := 0.0;
FOR i := 0 TO SIZEOF(aFilterBuffer)-1 DO
fSum := fSum + aFilterBuffer[i];
END_FOR
fEngineeringValue := fSum / SIZEOF(aFilterBuffer);
END_IF
除了平均值滤波,限幅滤波也是常用的方法,用于消除信号的突变干扰。
信号诊断与报警
功能块还应包含基本的诊断功能,如断线检测和超欠量程判断。
st
// 断线检测(以4-20mA信号为例,断线时转换数据通常为特定值,如8000 Hex[citation:7])
bSignalError := (wRawValue = 16#8000);
// 超量程和欠量程判断
bOverRange := (fEngineeringValue > fSensorMax * 1.05); // 考虑5%的裕量
bUnderRange := (fEngineeringValue < fSensorMin * 0.95);
编写好功能块后,需要在主程序或中断任务中实例化并调用它。
st
// 在ST程序主组织单元(POU)中调用
VAR
AI01: AnalogInputFB; // 创建一个模拟量输入功能块实例
END_VAR
// 调用功能块实例
AI01(
bEnable := TRUE,
wRawValue := CH1_RAW_VALUE, // CH1_RAW_VALUE是映射到硬件模拟量输入通道的变量
fSensorMin := 0.0, // 温度传感器量程下限 0度
fSensorMax := 100.0, // 温度传感器量程上限 100度
fRawMin := 0.0, // 对应4mA的原始值
fRawMax := 6000.0 // 对应20mA的原始值,假设模块分辨率为12000[citation:7]
);
// 之后,就可以使用AI01.fEngineeringValue这个转换后的工程值了。
在实际应用中,有几点需要特别留心:
UINT、INT、REAL等类型在运算和赋值时的匹配。fRawMax - fRawMin等于0的情况)、输入超限等。这个基础功能块还可以根据实际需求进行扩展:
INOUT参数传递配置结构体,提高复用性。