以下是基于三菱 FX5 系列 PLC(可通用用于压力控制场景)的 PID 压力控制示例程序,通过模拟量输入采集压力信号,结合 PID 算法调节执行机构(如比例阀)输出,实现压力精确控制。程序包含信号采集、滤波、PID 运算、输出控制及报警逻辑。
控制逻辑说明
程序代码(ST 语言)
st
// 模块定义:模拟量输入(4AD)、模拟量输出(2DA) VAR_GLOBAL // 模拟量输入(4~20mA对应0~1MPa) AI_Pressure_Raw: WORD := 0; // 原始值(5530~27648) AI_Pressure_Filtered: WORD := 0; // 滤波后值 Pressure_Actual: WORD := 0; // 实际压力(0~1000kPa) // 控制参数 Pressure_Set: WORD := 600; // 目标压力(默认600kPa=0.6MPa) Man_Output: WORD := 0; // 手动输出值(0~27648) Auto_Mode: BOOL := TRUE; // 自动模式(TRUE=自动,FALSE=手动) // PID参数(可通过HMI修改) PID_Kp: REAL := 8.0; // 比例增益 PID_Ki: REAL := 0.2; // 积分系数(1/秒) PID_Kd: REAL := 0.5; // 微分系数(秒) PID_Output: WORD := 0; // PID输出值(0~27648) // 报警信号 Alarm_High: BOOL := FALSE; // 高压报警(>1100kPa) Alarm_Low: BOOL := FALSE; // 低压报警(<100kPa) Alarm_Filter: BOOL := FALSE;// 传感器故障报警 END_VAR // 主程序:周期执行(100ms) PROGRAM Main VAR // 临时变量 Filter_Buffer: ARRAY[0..2] OF WORD := [0,0,0]; // 滤波缓冲区 Filter_Sum: DWORD := 0; // 滤波总和 Error: WORD := 0; // 偏差值 Error_Abs: WORD := 0; // 偏差绝对值 Deadband: WORD := 5; // 死区(±5kPa) END_VAR // 1. 读取模拟量原始值(4AD模块通道0) AI_Pressure_Raw := FX5_4AD.Read(Channel := 0); // 读取4AD通道0 // 2. 滑动平均滤波(抑制干扰) Filter_Buffer[2] := Filter_Buffer[1]; Filter_Buffer[1] := Filter_Buffer[0]; Filter_Buffer[0] := AI_Pressure_Raw; Filter_Sum := DWORD#Filter_Buffer[0] + Filter_Buffer[1] + Filter_Buffer[2]; AI_Pressure_Filtered := WORD#(Filter_Sum / 3); // 取3次平均值 // 3. 传感器故障检测(信号超出量程) IF (AI_Pressure_Filtered < 5000) OR (AI_Pressure_Filtered > 28000) THEN Alarm_Filter := TRUE; ELSE Alarm_Filter := FALSE; END_IF; // 4. 量程转换(4~20mA → 0~1000kPa) // 公式:Pressure_Actual = (Filtered - 5530) * 1000 / (27648 - 5530) Pressure_Actual := WORD#( INT#(AI_Pressure_Filtered) - 5530 ) * 1000 / 22118; // 22118 = 27648 - 5530 // 5. 压力报警逻辑 IF Pressure_Actual > 1100 THEN Alarm_High := TRUE; ELSE Alarm_High := FALSE; END_IF; IF Pressure_Actual < 100 THEN Alarm_Low := TRUE; ELSE Alarm_Low := FALSE; END_IF; // 6. PID控制(自动模式) IF Auto_Mode AND NOT Alarm_Filter THEN // 计算偏差 Error := WORD#(INT#(Pressure_Set) - INT#(Pressure_Actual)); Error_Abs := ABS(Error); // 死区处理:偏差小于5kPa时不调节 IF Error_Abs <= Deadband THEN // 保持当前输出 ELSE // 调用PID指令(三菱PID_LIB库) PID_Output := PID_LIB.Execute( Setpoint := Pressure_Set, ProcessValue := Pressure_Actual, Kp := PID_Kp, Ki := PID_Ki, Kd := PID_Kd, OutputMin := 0, OutputMax := 27648, Cycle := 100 // 控制周期100ms ); END_IF; END_IF; // 7. 手动/自动输出切换 IF Auto_Mode THEN // 自动模式:输出PID计算值 FX5_2DA.Write(Channel := 0, Value := PID_Output); // 写入2DA通道0 ELSE // 手动模式:输出手动设定值 FX5_2DA.Write(Channel := 0, Value := Man_Output); END_IF; END_PROGRAM
程序关键说明
调试建议
通过以上程序,可实现压力的闭环控制,精度通常可达 ±1% FS(满量程),适用于供水系统、气动设备等压力控制场景。

