Java TCP Server with Fuzzy Adaptive PID Controller for Real-time Control
///'package ss; import java.io.; import java.net.ServerSocket; import java.net.Socket; import java.util.; //这里写的是服务器程序(对应的是小箱网络控制的云端程序) public class TcpServer { public static void main(String[] args) { try { //建立套接字 ServerSocket server = new ServerSocket(50000); //监听 Socket socket = server.accept(); //建立连接 byte[] bytes = new byte[10]; //这里使用的是字符流 PrintWriter Socout = new PrintWriter(socket.getOutputStream()); TcpServer tcpServer = new TcpServer(); BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); String r1 = ///'///'; while (true) { //读取客户端发送过来的数据 int length = bis.read(bytes); r1 = new String(bytes, 0, length, ///'utf-8///'); bytes = new byte[10]; if (!r1.equals(///'ok///')) { float clientInput = Float.parseFloat(r1); //这里是通过通信服务端给客户端传来的输入 System.out.println(///'客户端模型传过来的数据是:///' + clientInput); //将服务端键盘输入的数据发送到通道 float result = tcpServer.FuzzyAdaptivePIDController(1500, clientInput); //给PID算法传入的输入是键盘指定的设定速度 float[] normalized = tcpServer.normalize(data); float[] normalized = normalize(data); float[] newNums = new float[data.length + 1]; System.arraycopy(data, 0, newNums, 0, data.length); newNums[data.length] = err(1500, clientInput); data=newNums; int temp1 = (int) result; Socout.print(temp1); //将控制器的输出传递给客户端 Socout.flush(); //让客户端马上接收到发送的数据 System.out.println(///'服务端PID计算以后给客户端返回的数据是:///' + temp1); } else { break; } } //关闭IO、Socket Socout.close(); server.close(); } catch (Exception e) { System.out.println(///'Error///' + e); } } static float SetSpeed = 0.0f; //定义设定值 static float ActualSpeed = 0.0f; //定义实际值 static float err = 0.0f; //定义偏差值 float err_last = 0.0f; //定义上一个偏差值 float err_next = 0.0f; //定义最上前的偏差值 float Kp = 0.22f, Ki = 0.05f, Kd = 0.01f; float B = 0.0f; float B1 = 0.0f; float B2 = 0.0f; float B1_next = 0.0f; float B2_next = 0.0f; float voltage = 0.0f; float voltage_PI = 0.0f; //定义电压值(控制执行器的变量) float integral = 0.0f; float A = 0.0f; //定义积分值 static float [] data={}; public static float[] normalize(float[] data) { float min =Float.MAX_VALUE; float max = Float.MIN_VALUE; // Find the minimum and maximum values in the data for (float d : data) { if (d < min) { min = d; } if (d > max) { max = d; } } // Create a new array for the normalized data float[] normalized = new float[data.length]; // Normalize the data for (int i = 0; i <data.length; i++) { normalized[i] = (data[i] - min) / (max - min); } return normalized; } // 模糊自适应PID控制器 public float FuzzyAdaptivePIDController(float setspeed, float actualSpeed) { //这里的speed是打算设定的速度 this.SetSpeed = setspeed; this.ActualSpeed = actualSpeed; this.err = this.SetSpeed - this.ActualSpeed; this.integral += this.err; float temp = this.Ki * this.integral; if (data[data.length - 1] < 0.4f) { this.B = this.B1; } if (data[data.length - 1] > 0.6f) { this.B = this.B2; } if (data[data.length - 1] >= 0.4f && data[data.length - 1] <= 0.6f) { this.B = this.B1 / 2 + this.B2 / 2; } this.A = (this.Kp + this.Ki / 2 * 0.1f) * this.B; this.B1_next = this.B1 + 2 * 0.1f * this.err * this.voltage / this.B; this.B2_next = this.B2 + 2 * 0.1f * this.err * this.voltage / this.B; if (temp > 125) { temp = 125; } if (temp < -125) { temp = -125; } this.voltage = this.Kp * this.err + temp; this.voltage_PI = this.B * this.voltage; if (this.voltage_PI > 250) { this.voltage_PI = 250; } if (this.voltage_PI < 0) { this.voltage_PI = 0; } //可以这么理解:比例环节将误差线性放大,积分环节将误差值的积分放大,微分环节将两次的误差值放大, // 所有的值相加得到最终输出值 this.err_last = this.err; //令上一个偏差值等于当前的偏差值 this.B1_next = this.B1; this.B2_next = this.B2; return this.voltage_PI; } public static float err(float setSpeed, float actualSpeed) { float err = setSpeed - actualSpeed; return err; }///
原文地址: https://www.cveoy.top/t/topic/ptW8 著作权归作者所有。请勿转载和采集!