基于BP神经网络PID算法的恒液位监控油田联合站【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流查看文章底部二维码1粒子群优化BP神经网络PID控制器设计针对联合站游离水脱除器的液位控制具有大时滞和非线性特性设计了一种基于BP神经网络PID控制器的恒液位监控系统。该控制器以液位设定值与实际液位的误差以及误差的一阶导数和二阶导数作为BP网络的三个输入输出为PID的三个参数Kp、Ki、Kd。BP网络采用三层结构隐含层节点数为12个激活函数为双曲正切函数。为了克服BP网络易陷入局部极值的缺点引入粒子群算法离线优化网络的初始权重和阈值。粒子群的适应度函数定义为系统在阶跃响应下的绝对误差积分与超调量的加权和。优化后的BP网络权重使得系统在液位阶跃变化时的超调量由常规PID的22%降低到6.3%调节时间从145秒缩短到78秒。将训练好的网络参数固化到控制器中同时引入在线微调机制当误差绝对值超过设定阈值时启动误差反向传播在线调整输出层权值。2WinCC与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米。3DDE接口技术与远程参数自整定为了便于工程师远程整定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_dim3, hidden_dim12): 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, N1000) 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(fWrite {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, lam0.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如有问题可以直接沟通
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580537.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!