风速仪与 PLC 配合时的程序编写方法,核心是根据风速仪的信号类型(如 4-20mA、0-10V、脉冲 / RS485)完成 PLC 的模拟量 / 数字量采集、数据换算、逻辑处理,最终得到实际风速值并实现报警 / 控制等功能。
以下是基于最常用的 4-20mA 电流型风速仪 + 西门子 S7-200/1200/1500 PLC 的完整程序示例,包含核心换算逻辑、异常处理和实用功能,你可直接适配到自己的 PLC 型号。
一、前期准备(编程前必确认)
1. 关键参数确认
| 参数项 | 说明(以常见风速仪为例) |
|---|---|
| 风速仪量程 | 如 0-30m/s(对应 4-20mA 输出) |
| PLC 模拟量模块类型 | 如 S7-1200 的 SM1231 AI 模块(4-20mA,16 位分辨率) |
| 模拟量地址 | 如 SM1231 的 AIW0(S7-200)或 PIW256(S7-1200) |
| 换算公式 | 实际风速 = (采集值 - 4mA 对应值) × (量程上限 - 量程下限) / (20mA 对应值 - 4mA 对应值) + 量程下限 |
2. 模拟量采集值对应关系(16 位 PLC)
二、核心程序编写(以西门子 S7-1200/1500 为例,TIA Portal)
1. 变量定义(DB 块)
先创建数据块,定义采集和换算所需变量:
plc
DATA_BLOCK DB_WindSpeed VAR_GLOBAL // 模拟量采集原始值 AI_RawValue: INT; // 对应PIW256,4-20mA原始采集值 // 风速仪参数 WindSpeed_Min: REAL := 0.0; // 风速下限(m/s) WindSpeed_Max: REAL := 30.0; // 风速上限(m/s) AI_4mA: INT := 6553; // 4mA对应采集值 AI_20mA: INT := 32767; // 20mA对应采集值 // 换算后实际风速 WindSpeed_Actual: REAL; // 实际风速(m/s) // 报警阈值 WindSpeed_Alarm_High: REAL := 20.0; // 高风速报警阈值 WindSpeed_Alarm_Low: REAL := 0.5; // 低风速(故障)报警阈值 // 报警标志 Alarm_HighWind: BOOL; // 高风速报警 Alarm_WindSensorFault: BOOL; // 风速仪故障(信号异常) END_VAR END_DATA_BLOCK
2. 主程序(OB1)
核心逻辑:采集模拟量→数据换算→故障判断→报警输出
plc
// 步骤1:读取模拟量原始值 DB_WindSpeed.AI_RawValue := "PIW256"; // 读取SM1231 AI模块的4-20mA输入值 // 步骤2:风速换算(核心公式) IF DB_WindSpeed.AI_RawValue >= DB_WindSpeed.AI_4mA AND DB_WindSpeed.AI_RawValue <= DB_WindSpeed.AI_20mA THEN // 正常范围:换算实际风速 DB_WindSpeed.WindSpeed_Actual := (DB_WindSpeed.AI_RawValue - DB_WindSpeed.AI_4mA) * (DB_WindSpeed.WindSpeed_Max - DB_WindSpeed.WindSpeed_Min) / (DB_WindSpeed.AI_20mA - DB_WindSpeed.AI_4mA) + DB_WindSpeed.WindSpeed_Min; ELSE // 信号异常:判定为故障 DB_WindSpeed.WindSpeed_Actual := 0.0; DB_WindSpeed.Alarm_WindSensorFault := TRUE; END_IF; // 步骤3:故障判断(信号低于4mA或高于20mA) IF DB_WindSpeed.AI_RawValue < DB_WindSpeed.AI_4mA - 100 OR DB_WindSpeed.AI_RawValue > DB_WindSpeed.AI_20mA + 100 THEN DB_WindSpeed.Alarm_WindSensorFault := TRUE; ELSE DB_WindSpeed.Alarm_WindSensorFault := FALSE; END_IF; // 步骤4:高风速报警判断 IF DB_WindSpeed.WindSpeed_Actual >= DB_WindSpeed.WindSpeed_Alarm_High AND NOT DB_WindSpeed.Alarm_WindSensorFault THEN DB_WindSpeed.Alarm_HighWind := TRUE; "Q0.0" := TRUE; // 高风速报警输出(如指示灯/蜂鸣器) ELSE DB_WindSpeed.Alarm_HighWind := FALSE; "Q0.0" := FALSE; END_IF; // 步骤5:故障报警输出 IF DB_WindSpeed.Alarm_WindSensorFault THEN "Q0.1" := TRUE; // 风速仪故障报警输出 ELSE "Q0.1" := FALSE; END_IF; // 步骤6:数据滤波(可选,消除数值抖动) DB_WindSpeed.WindSpeed_Actual := ROUND(DB_WindSpeed.WindSpeed_Actual * 10) / 10; // 保留1位小数
3. 适配 S7-200 的程序(梯形图思路)
若你用 S7-200 CPU224,核心逻辑一致,仅地址和指令不同:
plaintext
// 1. 采集原始值 MOVW AIW0, VW100 // AIW0存入VW100 // 2. 换算公式(用数学指令) LDB>= VW100, 6553 AND<= VW100, 32767 JMP 0 MOVB 1, VB200 // 故障标志置1 JMP 1 LBL 0 MOVW VW100, VW102 SUBW VW102, 6553 // 减去4mA对应值 MOVR VW102, VD104 MULR VD104, 30.0 // 乘以量程30 DIVR VD104, 26214.0 // 除以(32767-6553) MOVR VD104, VD204 // 实际风速存入VD204 LBL 1 // 3. 报警判断 LDR>= VD204, 20.0 = Q0.0 // 高风速报警 LDB= VB200, 1 = Q0.1 // 故障报警


