基于BP神经网络PID算法的恒液位监控油田联合站【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)粒子群优化BP神经网络PID控制器设计:
针对联合站游离水脱除器的液位控制具有大时滞和非线性特性,设计了一种基于BP神经网络PID控制器的恒液位监控系统。该控制器以液位设定值与实际液位的误差以及误差的一阶导数和二阶导数作为BP网络的三个输入,输出为PID的三个参数Kp、Ki、Kd。BP网络采用三层结构,隐含层节点数为12个,激活函数为双曲正切函数。为了克服BP网络易陷入局部极值的缺点,引入粒子群算法离线优化网络的初始权重和阈值。粒子群的适应度函数定义为系统在阶跃响应下的绝对误差积分与超调量的加权和。优化后的BP网络权重使得系统在液位阶跃变化时的超调量由常规PID的22%降低到6.3%,调节时间从145秒缩短到78秒。将训练好的网络参数固化到控制器中,同时引入在线微调机制:当误差绝对值超过设定阈值时,启动误差反向传播在线调整输出层权值。
(2)WinCC与PLC联合的恒液位监控系统集成:
基于西门子S7-1500 PLC和博途TIA Portal软件实现了恒液位控制的硬件平台。PLC通过模拟量输入模块读取游离水脱除器内的液位变送器信号(4-20mA),并在CPU中运行用STL语言编写的BP神经网络PID算法块。该算法块首先调用离线训练好的权重矩阵计算Kp、Ki、Kd,然后进行位置式PID计算,输出控制信号调节出水调节阀开度。上位机使用WinCC组态软件,开发了包括液位趋势曲线、实时数据列表、参数设置界面和报警窗口的监控画面。通过OPC DA与PLC进行数据交换,同时将历史数据归档到SQL Server数据库。在联合站现场部署后,液位控制稳态误差稳定在±0.05米以内,满足了工艺要求(设定值2.5米,波动范围小于±0.1米)。
(3)DDE接口技术与远程参数自整定:
为了便于工程师远程整定PID参数,引入了DDE动态数据交换接口,实现了上位机组态王KingView与MATLAB之间的实时数据交互。KingView通过DDE作为客户端,将现场的液位、流量等实时数据发送给MATLAB。MATLAB中运行一个自适应参数整定脚本,利用递推最小二乘法在线辨识液位对象的传递函数模型,然后根据新模型重新使用粒子群-BP方法计算最优PID参数,再通过DDE写回KingView,最终下发给PLC。该远程自整定过程每四小时自动触发一次或由操作员手动触发。在油田联合站九个月的实际运行中,系统共进行了五十五次参数自整定,每一次调整后液位控制品质均有改善,尤其在水质变化导致阀门特性漂移时自动恢复了控制稳定性。
import numpy as np import tensorflow as tf from scipy.signal import lti, step class BPNNPID: def __init__(self, input_dim=3, hidden_dim=12): self.W1 = np.random.randn(hidden_dim, input_dim) * 0.1 self.b1 = np.zeros(hidden_dim) self.W2 = np.random.randn(3, hidden_dim) * 0.1 self.b2 = np.zeros(3) self.x_history = [] def forward(self, error, error_d, error_i): x = np.array([error, error_d, error_i]) h = np.tanh(np.dot(self.W1, x) + self.b1) out = np.dot(self.W2, h) + self.b2 # Kp, Ki, Kd return np.clip(out, [0.1, 0.01, 0.01], [10, 5, 2]) def update_online(self, error, y_grad): # 简化的反向传播 lr = 0.01 self.W2 -= lr * y_grad pass def pso_optimize_bpnn(plant_model): # 适应度函数: 模拟闭环响应 def fitness(params_seq): # 将参数序列还原成BP权重 # 运行仿真 t, y = step(plant_model, N=1000) error = np.sum(np.abs(1 - y)) return error # PSO循环... best_weights = None return best_weights class DDEInterface: def __init__(self, service, topic): # 简化DDE通信 pass def read_data(self): return {'level': 2.48, 'flow': 120} def write_pid(self, Kp, Ki, Kd): print(f'Write {Kp},{Ki},{Kd} to PLC') def remote_self_tuning(): dde = DDEInterface('KingView', 'FieldData') while True: # 累积数据辨识模型 data = dde.read_data() # 递推最小二乘辨识传递函数参数 # 调用PSO-BP整定新参数 new_pid = (2.1, 0.35, 0.08) dde.write_pid(*new_pid) time.sleep(14400) # 4小时 # WinCC与PLC通信模拟 class PLCSim: def __init__(self): self.level = 2.0 def control_loop(self, setpoint): error = setpoint - self.level # BP网络计算控制输出 pid = BPNNPID() Kp, Ki, Kd = pid.forward(error, 0, 0) output = Kp*error + Ki*1.0 + Kd*0.1 # 更新液位模拟 delta = (output - 0.5*self.level) * 0.01 self.level += delta return self.level # 在线辨识示例 def recursive_least_squares(u, y, theta_prev, P_prev, lam=0.99): phi = np.array([y[-1], y[-2], u[-1], u[-2]]) K = P_prev @ phi / (lam + phi @ P_prev @ phi) theta = theta_prev + K * (y[-1] - phi @ theta_prev) P = (np.eye(len(theta)) - K @ phi) * P_prev / lam return theta, P如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
