5.2 模拟量输入处理
本节将介绍模拟量输入的采集和处理方法,掌握从传感器信号到工程量数据的完整处理流程
学习目标
- 掌握模拟量输入模块的选型与配置
- 理解原始值到工程量的转换方法
- 学会数字滤波技术提高数据质量
- 能够进行模拟量故障诊断
- 掌握完整的温度采集系统设计
1. 模拟量输入模块选型
1.1 选型考虑因素
模拟量输入模块选型流程:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 确定信号类型 → 确定通道数量 → 确定精度要求 → 选择模块型号 │
│ │ │ │ │ │
│ 电压/电流/ 预留20% 分辨率位数 品牌/成本 │
│ RTD/TC 余量 精度等级 │
│ │
└─────────────────────────────────────────────────────────────┘1.2 选型参数对照表
| 选型参数 | 考虑要点 | 建议值 |
|---|---|---|
| 信号类型 | 与传感器输出匹配 | 优先4-20mA |
| 通道数量 | 实际需求+20%余量 | 4/8/16通道 |
| 分辨率 | 精度要求决定 | 一般12位,高精度16位 |
| 隔离方式 | 通道间干扰 | 通道隔离优于共模 |
| 转换时间 | 采样速度要求 | 一般<10ms/通道 |
| 工作温度 | 现场环境 | -20~60°C |
1.3 常用模拟量输入模块
西门子系列:
| 型号 | 通道 | 分辨率 | 信号类型 | 特点 |
|---|---|---|---|---|
| SM1231 AI 4x13位 | 4 | 13位 | V/I | 经济型 |
| SM1231 AI 8x13位 | 8 | 13位 | V/I | 多通道 |
| SM1231 RTD 4x16位 | 4 | 16位 | RTD | 温度专用 |
| SM1231 TC 4x16位 | 4 | 16位 | TC | 热电偶 |
三菱系列:
| 型号 | 通道 | 分辨率 | 信号类型 | 特点 |
|---|---|---|---|---|
| FX3U-4AD | 4 | 12位 | V/I | 标准型 |
| FX3U-4AD-ADP | 4 | 12位 | V/I | 右侧扩展 |
| FX3U-4AD-PT | 4 | 16位 | PT100 | 温度专用 |
| FX3U-4AD-TC | 4 | 16位 | K/J型 | 热电偶 |
2. 模块接线与配置
2.1 西门子SM1231接线
SM1231 AI 4通道接线图(电流输入):
┌─────────────────────────────────────────────────────────────┐
│ │
│ 变送器1 变送器2 变送器3 变送器4 │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ + │ │ + │ │ + │ │ + │ │
│ │ │ │ │ │ │ │ │ │
│ │ - │ │ - │ │ - │ │ - │ │
│ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ │
│ │ │ │ │ │
│ │ │ │ │ │
│ ┌─┴─────────────┴─────────────┴─────────────┴─┐ │
│ │ AI0+ AI0- AI1+ AI1- AI2+ AI2- AI3+ AI3-│ │
│ │ 1 2 3 4 5 6 7 8 │ │
│ │ │ │
│ │ SM1231 AI 4x13位 │ │
│ │ │ │
│ │ M L+ 2M 3M Diagnostic LED │ │
│ └───────────────────────────────────────────────┘ │
│ │
│ 注意:4-20mA信号,变送器-端接AI-,形成电流回路 │
│ │
└─────────────────────────────────────────────────────────────┘2.2 西门子TIA Portal配置
TIA Portal模拟量输入配置步骤:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 步骤1:添加模块 │
│ ├─设备配置 → 添加模块 → 选择SM1231型号 │
│ │
│ 步骤2:通道配置 │
│ ├─双击模块 → 常规 → 模拟量输入 │
│ ├─设置测量类型:电压/电流 │
│ ├─设置量程:4-20mA、0-10V等 │
│ ├─设置诊断:启用断线检测 │
│ │
│ 步骤3:变量配置 │
│ ├─PLC变量表 → 新建变量 │
│ ├─名称:Pressure_Raw │
│ ├─地址:%IW64(根据模块起始地址) │
│ ├─数据类型:Int │
│ │
│ 步骤4:下载配置 │
│ └─编译 → 下载到设备 │
│ │
└─────────────────────────────────────────────────────────────┘2.3 三菱FX3U-4AD配置
FX3U-4AD模块配置:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 物理接线: │
│ ┌──────────────────────────────────┐ │
│ │ FX3U-4AD 端子排列 │ │
│ │ ┌───┬───┬───┬───┬───┬───┬───┐ │ │
│ │ │V+ │I+ │V- │I- │COM│V+ │...│ │ │
│ │ │CH1│CH1│CH1│CH1│ │CH2│ │ │ │
│ │ └───┴───┴───┴───┴───┴───┴───┘ │ │
│ │ │ │
│ │ 电压输入:V+ → 信号+,V- → 信号- │ │
│ │ 电流输入:I+ → 信号+,I- → 信号- │ │
│ └──────────────────────────────────┘ │
│ │
│ 缓冲存储器配置(FROM/TO指令): │
│ ┌────────────────────────────────────────────────────┐ │
│ │ BFM# │ 功能说明 │ │
│ ├─────────┼───────────────────────────────────────┤ │
│ │ #0 │ 通道1数字值(0~4000) │ │
│ │ #1 │ 通道2数字值 │ │
│ │ #2 │ 通道3数字值 │ │
│ │ #3 │ 通道4数字值 │ │
│ │ #17 │ 输入模式设置 │ │
│ │ #18 │ 平均次数设置 │ │
│ │ #24 │ A/D转换完成标志 │ │
│ └─────────┴───────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘3. 原始值读取
3.1 西门子原始值读取
程序示例(SCL):
pascal
// 西门子S7-1200 模拟量原始值读取
// 模块地址假设从IW64开始
// 定义变量
VAR
AI_CH0_Raw : INT; // 通道0原始值
AI_CH1_Raw : INT; // 通道1原始值
AI_CH2_Raw : INT; // 通道2原始值
AI_CH3_Raw : INT; // 通道3原始值
END_VAR
// 读取原始值
AI_CH0_Raw := %IW64; // 通道0:压力传感器
AI_CH1_Raw := %IW66; // 通道1:温度传感器
AI_CH2_Raw := %IW68; // 通道2:流量传感器
AI_CH3_Raw := %IW70; // 通道3:液位传感器
// 原始值范围检查
// 正常范围:0 ~ 27648(对应4-20mA)
// <0 或 >27648 表示超量程或故障3.2 三菱原始值读取
三菱FX FROM指令读取模拟量:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 指令格式:FROM m1 m2 D n │
│ ├─m1: 特殊模块编号(从主机右侧开始,0、1、2...) │
│ ├─m2: 缓冲存储器起始编号 │
│ ├─D: 目标数据寄存器 │
│ └─n: 读取点数 │
│ │
│ 程序示例: │
│ ┌────────────────────────────────────────────────────┐ │
│ │ // 假设FX3U-4AD为0号特殊模块 │ │
│ │ │ │
│ │ LD M8000 // 常ON │ │
│ │ FROM K0 K0 D100 K4 // 读取4个通道数据 │ │
│ │ // D100~D103存放结果 │ │
│ │ │ │
│ │ // 结果: │ │
│ │ // D100 = 通道1数字值(0~4000) │ │
│ │ // D101 = 通道2数字值 │ │
│ │ // D102 = 通道3数字值 │ │
│ │ // D103 = 通道4数字值 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘3.3 原始值状态判断
原始值状态分析:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 西门子S7-1200原始值状态: │
│ ┌──────────────────┬────────────────────────────────┐ │
│ │ 原始值范围 │ 状态说明 │ │
│ ├──────────────────┼────────────────────────────────┤ │
│ │ -32768 │ 负溢出(严重故障) │ │
│ │ -32513 ~ -1 │ 负超量程(信号过低) │ │
│ │ 0 │ 下限(4mA或0V) │ │
│ │ 1 ~ 27647 │ 正常测量范围 │ │
│ │ 27648 │ 上限(20mA或10V) │ │
│ │ 27649 ~ 32511 │ 正超量程(信号过高) │ │
│ │ 32512 ~ 32767 │ 正溢出/断线 │ │
│ └──────────────────┴────────────────────────────────┘ │
│ │
│ 故障判断逻辑: │
│ IF (Raw < 0) OR (Raw > 28000) THEN │
│ // 传感器故障或断线 │
│ Fault_Flag := TRUE; │
│ ELSE │
│ Fault_Flag := FALSE; │
│ END_IF; │
│ │
└─────────────────────────────────────────────────────────────┘【阶段总结1】 到目前为止,已介绍:
- 模拟量输入模块的选型要点和常用型号
- 西门子SM1231和三菱FX3U-4AD的接线方法
- TIA Portal和GX Works的模块配置步骤
- 原始值读取的程序实现
- 原始值状态判断和故障检测
继续填充工程量转换和滤波处理:
4. 工程量转换
4.1 线性换算公式
标准线性换算公式:
┌─────────────────────────────────────────────────────────────┐
│ │
│ (Raw - RawMin) │
│ EngValue = ──────────────────── × (EngMax - EngMin) + EngMin
│ (RawMax - RawMin) │
│ │
│ 参数说明: │
│ ├─Raw: 当前原始值 │
│ ├─RawMin: 原始值下限(如0) │
│ ├─RawMax: 原始值上限(如27648) │
│ ├─EngMin: 工程量下限(如0°C) │
│ ├─EngMax: 工程量上限(如100°C) │
│ └─EngValue: 计算得到的工程值 │
│ │
│ 简化公式(当RawMin=0, EngMin=0时): │
│ │
│ EngValue = Raw × EngMax / RawMax │
│ │
└─────────────────────────────────────────────────────────────┘4.2 西门子工程量转换程序
方法1:使用NORM_X和SCALE_X指令
pascal
// 西门子S7-1200 标准化和缩放指令
// NORM_X: 将整数标准化为0.0~1.0的实数
// SCALE_X: 将0.0~1.0的实数缩放为工程量
VAR
Pressure_Raw : INT; // 原始值
Pressure_Norm : REAL; // 标准化值
Pressure_Eng : REAL; // 工程量(MPa)
END_VAR
// 步骤1:标准化(0~27648 → 0.0~1.0)
Pressure_Norm := NORM_X(
MIN := 0,
VALUE := Pressure_Raw,
MAX := 27648
);
// 步骤2:缩放(0.0~1.0 → 0~10 MPa)
Pressure_Eng := SCALE_X(
MIN := 0.0,
VALUE := Pressure_Norm,
MAX := 10.0
);
// 结果:Pressure_Eng 为实际压力值(MPa)方法2:直接计算公式
pascal
// 直接计算方式
VAR
Raw_Value : INT := 13824; // 假设原始值
Temperature : REAL; // 温度结果
// 参数定义
Raw_Min : INT := 0;
Raw_Max : INT := 27648;
Eng_Min : REAL := 0.0; // 0°C
Eng_Max : REAL := 100.0; // 100°C
END_VAR
// 工程量计算
Temperature := (INT_TO_REAL(Raw_Value - Raw_Min) /
INT_TO_REAL(Raw_Max - Raw_Min)) *
(Eng_Max - Eng_Min) + Eng_Min;
// 计算过程:
// (13824 - 0) / (27648 - 0) × (100 - 0) + 0
// = 0.5 × 100
// = 50°C4.3 三菱工程量转换程序
三菱FX工程量转换程序:
┌─────────────────────────────────────────────────────────────┐
│ │
│ // 假设:D100为原始值(0~4000),转换为温度(0~200°C) │
│ // 结果存入D200(整数)和D202(带小数,放大10倍) │
│ │
│ 方法1:整数运算 │
│ ┌────────────────────────────────────────────────────┐ │
│ │ LD M8000 │ │
│ │ MUL D100 K200 D210 // D100×200→D210 │ │
│ │ DIV D210 K4000 D200 // D210÷4000→D200 │ │
│ │ // D200为温度整数值 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 方法2:带小数(放大10倍精度) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ LD M8000 │ │
│ │ MUL D100 K2000 D210 // 放大10倍再乘量程 │ │
│ │ DIV D210 K4000 D202 // 结果为温度×10 │ │
│ │ // 如D202=505表示50.5°C│ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 方法3:浮点运算(使用DEMUL/DEDIV) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ LD M8000 │ │
│ │ FLT D100 D220 // 整数转浮点 │ │
│ │ EMUL D220 E200.0 D224 // 乘以量程200.0 │ │
│ │ EDIV D224 E4000.0 D228 // 除以满量程4000.0 │ │
│ │ // D228为温度浮点值 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘4.4 工程量转换功能块封装
西门子FC封装:
pascal
// 功能块:FB_AnalogScale(模拟量缩放)
FUNCTION_BLOCK "FB_AnalogScale"
VERSION : 0.1
VAR_INPUT
RawValue : INT; // 原始值输入
RawMin : INT; // 原始下限
RawMax : INT; // 原始上限
EngMin : REAL; // 工程下限
EngMax : REAL; // 工程上限
Enable : BOOL; // 使能
END_VAR
VAR_OUTPUT
EngValue : REAL; // 工程量输出
Valid : BOOL; // 数据有效
HighAlarm : BOOL; // 高报警
LowAlarm : BOOL; // 低报警
END_VAR
VAR
temp_Norm : REAL;
END_VAR
BEGIN
IF #Enable THEN
// 检查原始值有效性
IF (#RawValue >= #RawMin) AND (#RawValue <= #RawMax) THEN
// 标准化计算
#temp_Norm := INT_TO_REAL(#RawValue - #RawMin) /
INT_TO_REAL(#RawMax - #RawMin);
// 缩放计算
#EngValue := #temp_Norm * (#EngMax - #EngMin) + #EngMin;
#Valid := TRUE;
#HighAlarm := FALSE;
#LowAlarm := FALSE;
ELSE
// 超量程处理
#Valid := FALSE;
IF #RawValue > #RawMax THEN
#EngValue := #EngMax;
#HighAlarm := TRUE;
ELSE
#EngValue := #EngMin;
#LowAlarm := TRUE;
END_IF;
END_IF;
ELSE
#EngValue := 0.0;
#Valid := FALSE;
END_IF;
END_FUNCTION_BLOCK5. 滤波处理
5.1 为什么需要滤波?
模拟量信号干扰示意:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 原始信号(含噪声): │
│ ┌╮ ╭┐ ╭╮ │
│ ╭╯ ╰╮╯╰╮╯ ╰╮ ╭─╮ │
│ ╱ ╲ ╲ ╲╱ ╲ │
│ ╱ ╲ ╲ ╲ ← 噪声导致信号波动 │
│ ╱ ╲───╲───────╲ │
│ │
│ 滤波后信号: │
│ ╭──────╮ │
│ ╱ ╲ │
│ ╱ ╲ ← 平滑稳定的信号 │
│ ╱ ╲ │
│ ╱──────────────╲ │
│ │
│ 滤波目的: │
│ • 消除随机噪声 │
│ • 抑制电磁干扰 │
│ • 平滑信号跳变 │
│ • 提高测量精度 │
│ │
└─────────────────────────────────────────────────────────────┘5.2 移动平均滤波
pascal
// 移动平均滤波(N点平均)
// 原理:取最近N个采样值的算术平均
FUNCTION_BLOCK "FB_MovingAverage"
VERSION : 0.1
VAR_INPUT
InputValue : REAL; // 输入值
Enable : BOOL; // 使能
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 滤波后输出
END_VAR
VAR
Buffer : ARRAY[0..9] OF REAL; // 10点缓冲区
Index : INT := 0; // 当前索引
Sum : REAL := 0.0; // 累加和
Count : INT := 0; // 有效数据计数
i : INT;
END_VAR
CONST
N : INT := 10; // 滤波点数
END_CONST
BEGIN
IF #Enable THEN
// 更新缓冲区
#Buffer[#Index] := #InputValue;
// 更新索引(循环)
#Index := #Index + 1;
IF #Index >= #N THEN
#Index := 0;
END_IF;
// 计算有效数据数量
IF #Count < #N THEN
#Count := #Count + 1;
END_IF;
// 计算平均值
#Sum := 0.0;
FOR #i := 0 TO #Count - 1 DO
#Sum := #Sum + #Buffer[#i];
END_FOR;
#OutputValue := #Sum / INT_TO_REAL(#Count);
END_IF;
END_FUNCTION_BLOCK5.3 一阶滞后滤波(指数平滑)
pascal
// 一阶滞后滤波(指数平滑滤波)
// 公式:Y(n) = α × X(n) + (1-α) × Y(n-1)
// α: 滤波系数(0~1),越小滤波效果越强
FUNCTION_BLOCK "FB_FirstOrderFilter"
VERSION : 0.1
VAR_INPUT
InputValue : REAL; // 当前输入值
Alpha : REAL; // 滤波系数(0.0~1.0)
Enable : BOOL; // 使能
Reset : BOOL; // 复位
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 滤波输出
END_VAR
VAR
LastOutput : REAL := 0.0; // 上次输出值
Initialized : BOOL := FALSE;
END_VAR
BEGIN
IF #Reset THEN
#LastOutput := 0.0;
#OutputValue := 0.0;
#Initialized := FALSE;
ELSIF #Enable THEN
IF NOT #Initialized THEN
// 首次运行,直接使用输入值
#OutputValue := #InputValue;
#Initialized := TRUE;
ELSE
// 一阶滞后滤波计算
#OutputValue := #Alpha * #InputValue +
(1.0 - #Alpha) * #LastOutput;
END_IF;
#LastOutput := #OutputValue;
END_IF;
END_FUNCTION_BLOCK
// 使用示例:
// Alpha = 0.1:强滤波,响应慢,平滑效果好
// Alpha = 0.5:中等滤波
// Alpha = 0.9:弱滤波,响应快,平滑效果差5.4 中值滤波
pascal
// 中值滤波
// 原理:取N个采样值的中间值,有效去除脉冲干扰
FUNCTION_BLOCK "FB_MedianFilter"
VERSION : 0.1
VAR_INPUT
InputValue : REAL;
Enable : BOOL;
END_VAR
VAR_OUTPUT
OutputValue : REAL;
END_VAR
VAR
Buffer : ARRAY[0..4] OF REAL; // 5点缓冲
SortBuf : ARRAY[0..4] OF REAL; // 排序缓冲
Index : INT := 0;
i, j : INT;
temp : REAL;
END_VAR
BEGIN
IF #Enable THEN
// 更新缓冲区
#Buffer[#Index] := #InputValue;
#Index := (#Index + 1) MOD 5;
// 复制到排序缓冲区
FOR #i := 0 TO 4 DO
#SortBuf[#i] := #Buffer[#i];
END_FOR;
// 冒泡排序
FOR #i := 0 TO 3 DO
FOR #j := 0 TO 3 - #i DO
IF #SortBuf[#j] > #SortBuf[#j + 1] THEN
#temp := #SortBuf[#j];
#SortBuf[#j] := #SortBuf[#j + 1];
#SortBuf[#j + 1] := #temp;
END_IF;
END_FOR;
END_FOR;
// 取中值(第3个元素)
#OutputValue := #SortBuf[2];
END_IF;
END_FUNCTION_BLOCK5.5 滤波方法对比
| 滤波方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 移动平均 | 简单有效 | 响应滞后 | 缓慢变化信号 |
| 一阶滞后 | 占用内存少 | 参数需调整 | 一般场合 |
| 中值滤波 | 去脉冲干扰 | 计算量大 | 脉冲噪声 |
| 限幅滤波 | 快速响应 | 不平滑 | 突变检测 |
【阶段总结2】 已介绍:
- 工程量转换的标准公式和推导
- 西门子NORM_X/SCALE_X指令和直接计算方法
- 三菱整数和浮点工程量转换程序
- 工程量转换功能块的封装设计
- 三种常用数字滤波方法(移动平均、一阶滞后、中值)
继续填充故障诊断和应用实例:
6. 故障诊断
6.1 模拟量故障类型
模拟量输入常见故障:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 故障类型 原始值表现 可能原因 │
│ ├─断线故障 >27648或<0 接线松动/断开 │
│ ├─传感器故障 固定不变或跳变 传感器损坏 │
│ ├─超量程 >27648 实际值超出范围 │
│ ├─欠量程 <0 信号过低 │
│ ├─信号干扰 剧烈波动 电磁干扰/接地差 │
│ └─模块故障 无数据 模块硬件损坏 │
│ │
│ 4-20mA信号故障判断(西门子): │
│ ┌───────────────────────────────────────────────────┐ │
│ │ 原始值 < -1000 → 断线或短路故障 │ │
│ │ 原始值 在 -1000~0 → 信号低于4mA(欠量程) │ │
│ │ 原始值 在 0~27648 → 正常范围 │ │
│ │ 原始值 在 27648~30000 → 信号高于20mA(超量程) │ │
│ │ 原始值 > 30000 → 严重超量程或故障 │ │
│ └───────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘6.2 故障诊断程序
pascal
// 模拟量故障诊断功能块
FUNCTION_BLOCK "FB_AI_Diagnosis"
VERSION : 0.1
VAR_INPUT
RawValue : INT; // 原始值
LastValue : REAL; // 上次工程值
EngValue : REAL; // 当前工程值
HighLimit : REAL; // 高限报警
LowLimit : REAL; // 低限报警
RateLimit : REAL; // 变化率限值
ScanTime_ms : REAL; // 扫描周期(ms)
END_VAR
VAR_OUTPUT
WireBreak : BOOL; // 断线故障
OverRange : BOOL; // 超量程
UnderRange : BOOL; // 欠量程
HighAlarm : BOOL; // 高限报警
LowAlarm : BOOL; // 低限报警
RateAlarm : BOOL; // 变化率报警
SensorFault : BOOL; // 传感器故障
DataValid : BOOL; // 数据有效
FaultCode : INT; // 故障代码
END_VAR
VAR
RateOfChange : REAL;
StableCount : INT := 0;
LastRaw : INT := 0;
END_VAR
BEGIN
// 初始化输出
#WireBreak := FALSE;
#OverRange := FALSE;
#UnderRange := FALSE;
#SensorFault := FALSE;
#FaultCode := 0;
#DataValid := TRUE;
// 1. 断线检测(原始值超出正常范围)
IF (#RawValue > 32000) OR (#RawValue < -32000) THEN
#WireBreak := TRUE;
#DataValid := FALSE;
#FaultCode := 1;
END_IF;
// 2. 超量程检测
IF (#RawValue > 28000) AND (#RawValue <= 32000) THEN
#OverRange := TRUE;
#FaultCode := 2;
END_IF;
// 3. 欠量程检测
IF (#RawValue < -500) AND (#RawValue >= -32000) THEN
#UnderRange := TRUE;
#FaultCode := 3;
END_IF;
// 4. 高限报警
IF #EngValue > #HighLimit THEN
#HighAlarm := TRUE;
END_IF;
// 5. 低限报警
IF #EngValue < #LowLimit THEN
#LowAlarm := TRUE;
END_IF;
// 6. 变化率检测
#RateOfChange := ABS(#EngValue - #LastValue) / (#ScanTime_ms / 1000.0);
IF #RateOfChange > #RateLimit THEN
#RateAlarm := TRUE;
#FaultCode := 4;
END_IF;
// 7. 传感器卡死检测(连续100次相同值)
IF #RawValue = #LastRaw THEN
#StableCount := #StableCount + 1;
IF #StableCount > 100 THEN
#SensorFault := TRUE;
#FaultCode := 5;
END_IF;
ELSE
#StableCount := 0;
END_IF;
#LastRaw := #RawValue;
END_FUNCTION_BLOCK6.3 故障处理策略
故障处理策略:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 故障类型 处理策略 输出值 │
│ ├─断线故障 停止控制,报警 保持上次值 │
│ ├─超量程 限幅输出,报警 上限值 │
│ ├─欠量程 限幅输出,报警 下限值 │
│ ├─传感器故障 切换备用,报警 备用传感器值 │
│ └─通信故障 使用缓存,报警 上次有效值 │
│ │
│ 故障代码定义: │
│ ┌──────┬────────────────────────────────────────────┐ │
│ │ 代码 │ 说明 │ │
│ ├──────┼────────────────────────────────────────────┤ │
│ │ 0 │ 正常 │ │
│ │ 1 │ 断线故障 │ │
│ │ 2 │ 超量程 │ │
│ │ 3 │ 欠量程 │ │
│ │ 4 │ 变化率超限 │ │
│ │ 5 │ 传感器卡死 │ │
│ │ 6 │ 模块通信故障 │ │
│ └──────┴────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘7. 应用实例:温度采集系统
7.1 系统需求
温度采集系统需求:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 项目:烘箱温度监控系统 │
│ │
│ 传感器:PT100热电阻(三线制) │
│ 测量范围:0~300°C │
│ 精度要求:±1°C │
│ 采样周期:100ms │
│ │
│ 功能要求: │
│ 1. 实时显示当前温度 │
│ 2. 高温报警(>280°C) │
│ 3. 低温报警(<50°C) │
│ 4. 断线故障检测 │
│ 5. 滤波处理消除波动 │
│ │
│ 硬件配置: │
│ ├─PLC:西门子S7-1200 CPU1214C │
│ ├─模块:SM1231 RTD 4通道 │
│ └─传感器:PT100(0.00385系数) │
│ │
└─────────────────────────────────────────────────────────────┘7.2 系统架构
温度采集系统架构:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ PT100 │────→│ SM1231 │────→│ S7-1200 │ │
│ │ 传感器 │ │ RTD │ │ CPU │ │
│ └──────────┘ └──────────┘ └────────┬─────────┘ │
│ │ │
│ 三线制接线 │ │
│ ↓ │
│ ┌──────────────┐ │
│ │ 处理流程 │ │
│ │ ┌──────────┐│ │
│ │ │ 原始值 ││ │
│ │ │ 读取 ││ │
│ │ └────┬─────┘│ │
│ │ ↓ │ │
│ │ ┌──────────┐│ │
│ │ │ 故障检测 ││ │
│ │ └────┬─────┘│ │
│ │ ↓ │ │
│ │ ┌──────────┐│ │
│ │ │ 工程转换 ││ │
│ │ └────┬─────┘│ │
│ │ ↓ │ │
│ │ ┌──────────┐│ │
│ │ │ 滤波处理 ││ │
│ │ └────┬─────┘│ │
│ │ ↓ │ │
│ │ ┌──────────┐│ │
│ │ │ 报警判断 ││ │
│ │ └──────────┘│ │
│ └──────────────┘ │
│ │ │
│ ↓ │
│ ┌──────────────┐ │
│ │ HMI显示/ │ │
│ │ 报警输出 │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘7.3 完整程序实现
数据块定义:
pascal
// 数据块:DB_TempControl
DATA_BLOCK "DB_TempControl"
VERSION : 0.1
STRUCT
// 原始数据
Raw_Value : INT; // 原始值
// 工程量
Temperature : REAL; // 当前温度
Temp_Filtered : REAL; // 滤波后温度
Temp_Last : REAL; // 上次温度
// 参数设置
Temp_HighLimit : REAL := 280.0; // 高限
Temp_LowLimit : REAL := 50.0; // 低限
Filter_Alpha : REAL := 0.2; // 滤波系数
// 报警状态
Alarm_High : BOOL; // 高温报警
Alarm_Low : BOOL; // 低温报警
Alarm_WireBreak : BOOL; // 断线报警
Alarm_Fault : BOOL; // 故障报警
// 状态标志
Data_Valid : BOOL; // 数据有效
System_Run : BOOL; // 系统运行
END_STRUCT;
END_DATA_BLOCK主程序OB1:
pascal
// OB1 - 主程序
ORGANIZATION_BLOCK "Main"
VERSION : 0.1
VAR_TEMP
temp_Norm : REAL;
temp_Raw : INT;
END_VAR
BEGIN
// ========================================
// 温度采集系统主程序
// ========================================
// 1. 读取原始值(假设RTD模块从IW96开始)
"DB_TempControl".Raw_Value := %IW96;
#temp_Raw := "DB_TempControl".Raw_Value;
// 2. 故障检测
IF (#temp_Raw > 32000) OR (#temp_Raw < -200) THEN
// 断线或严重故障
"DB_TempControl".Alarm_WireBreak := TRUE;
"DB_TempControl".Data_Valid := FALSE;
"DB_TempControl".Alarm_Fault := TRUE;
ELSE
"DB_TempControl".Alarm_WireBreak := FALSE;
"DB_TempControl".Data_Valid := TRUE;
// 3. 工程量转换
// SM1231 RTD模块PT100:原始值直接为温度×10
// 例如:2500 = 250.0°C
"DB_TempControl".Temperature := INT_TO_REAL(#temp_Raw) / 10.0;
// 4. 一阶滞后滤波
"DB_TempControl".Temp_Filtered :=
"DB_TempControl".Filter_Alpha * "DB_TempControl".Temperature +
(1.0 - "DB_TempControl".Filter_Alpha) * "DB_TempControl".Temp_Last;
// 保存本次值
"DB_TempControl".Temp_Last := "DB_TempControl".Temp_Filtered;
// 5. 报警判断
// 高温报警
IF "DB_TempControl".Temp_Filtered > "DB_TempControl".Temp_HighLimit THEN
"DB_TempControl".Alarm_High := TRUE;
ELSE
"DB_TempControl".Alarm_High := FALSE;
END_IF;
// 低温报警
IF "DB_TempControl".Temp_Filtered < "DB_TempControl".Temp_LowLimit THEN
"DB_TempControl".Alarm_Low := TRUE;
ELSE
"DB_TempControl".Alarm_Low := FALSE;
END_IF;
// 综合故障
"DB_TempControl".Alarm_Fault :=
"DB_TempControl".Alarm_High OR
"DB_TempControl".Alarm_Low OR
"DB_TempControl".Alarm_WireBreak;
END_IF;
// 6. 输出到报警指示灯
%Q0.0 := "DB_TempControl".Alarm_High; // 高温报警灯
%Q0.1 := "DB_TempControl".Alarm_Low; // 低温报警灯
%Q0.2 := "DB_TempControl".Alarm_WireBreak; // 断线报警灯
%Q0.3 := "DB_TempControl".Data_Valid; // 数据有效指示
END_ORGANIZATION_BLOCK7.4 三菱实现版本
三菱FX温度采集程序:
┌─────────────────────────────────────────────────────────────┐
│ │
│ // 使用FX3U-4AD-PT模块,0号特殊模块 │
│ // 温度范围设置为0~300°C,精度0.1°C │
│ │
│ // 1. 读取原始值 │
│ LD M8000 │
│ FROM K0 K0 D100 K1 // 读取通道1温度值到D100 │
│ // D100为温度×10(如2500=250°C)│
│ │
│ // 2. 断线检测(原始值为-999或超范围) │
│ LD D100 < K-500 │
│ OR D100 > K3500 │
│ OUT M100 // M100=断线报警 │
│ │
│ // 3. 温度值处理(正常情况) │
│ LDI M100 // 非断线故障时 │
│ MOV D100 D110 // 保存原始值 │
│ │
│ // 4. 一阶滤波(滤波系数0.2,即Alpha=K2,范围0-10) │
│ // 公式简化:Out = (2×In + 8×LastOut) / 10 │
│ LD M8000 │
│ MUL D110 K2 D120 // 当前值×2 │
│ MUL D130 K8 D122 // 上次值×8 │
│ ADD D120 D122 D124 // 相加 │
│ DIV D124 K10 D130 // 除以10得滤波值 │
│ │
│ // 5. 转换为实际温度(除以10) │
│ LD M8000 │
│ FLT D130 D200 // 整数转浮点 │
│ EDIV D200 E10.0 D204 // 除以10得温度值 │
│ // D204为温度浮点值(°C) │
│ │
│ // 6. 高温报警(>280°C) │
│ LD D130 > K2800 // 滤波值>2800(即280°C) │
│ OUT M101 // M101=高温报警 │
│ │
│ // 7. 低温报警(<50°C) │
│ LD D130 < K500 // 滤波值<500(即50°C) │
│ OUT M102 // M102=低温报警 │
│ │
│ // 8. 输出报警 │
│ LD M100 │
│ OR M101 │
│ OR M102 │
│ OUT Y0 // Y0=总报警输出 │
│ │
└─────────────────────────────────────────────────────────────┘【阶段总结3】 本文件内容已全部完成,总结如下:
- 模拟量输入模块选型原则和常用型号
- 西门子SM1231和三菱FX3U-4AD的接线配置
- 原始值读取和状态判断方法
- 工程量线性转换公式和功能块封装
- 三种数字滤波方法(移动平均、一阶滞后、中值)
- 故障诊断类型和处理策略
- 完整的温度采集系统实例(西门子和三菱版本)
本节小结
模拟量输入处理知识要点:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 模块选型 接线配置 原始值读取 │
│ ├─信号类型匹配 ├─电流回路正确 ├─地址映射 │
│ ├─通道数余量 ├─屏蔽接地 ├─状态判断 │
│ └─分辨率精度 └─三线制补偿 └─故障检测 │
│ │
│ 工程量转换 滤波处理 故障诊断 │
│ ├─线性公式 ├─移动平均 ├─断线检测 │
│ ├─NORM/SCALE ├─一阶滞后 ├─超/欠量程 │
│ └─功能块封装 └─中值滤波 └─变化率检测 │
│ │
│ 编程要点: │
│ 1. 先诊断后转换,确保数据有效性 │
│ 2. 滤波参数根据信号特性调整 │
│ 3. 功能块封装提高代码复用性 │
│ 4. 完善的报警机制保障系统安全 │
│ │
└─────────────────────────────────────────────────────────────┘练习题
基础题
- 西门子SM1231模块4-20mA输入时,原始值的正常范围是多少?
- 一阶滞后滤波公式中,滤波系数α越大,滤波效果越强还是越弱?
- 为什么需要进行模拟量断线检测?
编程题
- 编写一个工程量转换功能块,实现0-27648原始值到0-100%的转换
- 实现一个5点移动平均滤波程序
- 设计一个压力采集程序,量程0-10MPa,包含高低限报警
思考题
- 如何选择合适的滤波方法?不同滤波方法各有什么优缺点?
- 模拟量故障时,输出值应该如何处理?保持上次值还是输出安全值?
- 如何提高模拟量采集系统的可靠性?
拓展阅读
- 西门子TIA Portal帮助:模拟量处理
- 三菱FX编程手册:特殊功能模块
- 数字信号处理基础
- 工业传感器选型与应用
本节完