Skip to content

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位413位V/I经济型
SM1231 AI 8x13位813位V/I多通道
SM1231 RTD 4x16位416位RTD温度专用
SM1231 TC 4x16位416位TC热电偶

三菱系列:

型号通道分辨率信号类型特点
FX3U-4AD412位V/I标准型
FX3U-4AD-ADP412位V/I右侧扩展
FX3U-4AD-PT416位PT100温度专用
FX3U-4AD-TC416位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】 到目前为止,已介绍:

  1. 模拟量输入模块的选型要点和常用型号
  2. 西门子SM1231和三菱FX3U-4AD的接线方法
  3. TIA Portal和GX Works的模块配置步骤
  4. 原始值读取的程序实现
  5. 原始值状态判断和故障检测

继续填充工程量转换和滤波处理:


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°C

4.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_BLOCK

5. 滤波处理

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_BLOCK

5.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_BLOCK

5.5 滤波方法对比

滤波方法优点缺点适用场景
移动平均简单有效响应滞后缓慢变化信号
一阶滞后占用内存少参数需调整一般场合
中值滤波去脉冲干扰计算量大脉冲噪声
限幅滤波快速响应不平滑突变检测

【阶段总结2】 已介绍:

  1. 工程量转换的标准公式和推导
  2. 西门子NORM_X/SCALE_X指令和直接计算方法
  3. 三菱整数和浮点工程量转换程序
  4. 工程量转换功能块的封装设计
  5. 三种常用数字滤波方法(移动平均、一阶滞后、中值)

继续填充故障诊断和应用实例:


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_BLOCK

6.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_BLOCK

7.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】 本文件内容已全部完成,总结如下:

  1. 模拟量输入模块选型原则和常用型号
  2. 西门子SM1231和三菱FX3U-4AD的接线配置
  3. 原始值读取和状态判断方法
  4. 工程量线性转换公式和功能块封装
  5. 三种数字滤波方法(移动平均、一阶滞后、中值)
  6. 故障诊断类型和处理策略
  7. 完整的温度采集系统实例(西门子和三菱版本)

本节小结

模拟量输入处理知识要点:
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  模块选型          接线配置          原始值读取             │
│  ├─信号类型匹配    ├─电流回路正确    ├─地址映射            │
│  ├─通道数余量      ├─屏蔽接地        ├─状态判断            │
│  └─分辨率精度      └─三线制补偿      └─故障检测            │
│                                                             │
│  工程量转换        滤波处理          故障诊断               │
│  ├─线性公式        ├─移动平均        ├─断线检测            │
│  ├─NORM/SCALE     ├─一阶滞后        ├─超/欠量程           │
│  └─功能块封装      └─中值滤波        └─变化率检测          │
│                                                             │
│  编程要点:                                                  │
│  1. 先诊断后转换,确保数据有效性                            │
│  2. 滤波参数根据信号特性调整                                │
│  3. 功能块封装提高代码复用性                                │
│  4. 完善的报警机制保障系统安全                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

练习题

基础题

  1. 西门子SM1231模块4-20mA输入时,原始值的正常范围是多少?
  2. 一阶滞后滤波公式中,滤波系数α越大,滤波效果越强还是越弱?
  3. 为什么需要进行模拟量断线检测?

编程题

  1. 编写一个工程量转换功能块,实现0-27648原始值到0-100%的转换
  2. 实现一个5点移动平均滤波程序
  3. 设计一个压力采集程序,量程0-10MPa,包含高低限报警

思考题

  1. 如何选择合适的滤波方法?不同滤波方法各有什么优缺点?
  2. 模拟量故障时,输出值应该如何处理?保持上次值还是输出安全值?
  3. 如何提高模拟量采集系统的可靠性?

拓展阅读

  • 西门子TIA Portal帮助:模拟量处理
  • 三菱FX编程手册:特殊功能模块
  • 数字信号处理基础
  • 工业传感器选型与应用

本节完

本教程由 AI (Claude Opus 4.5) 生成,仅供学习参考