发表于:2025/1/29 21:29:32
#0楼
END_IF
代码复制如下:
VAR
Temp_Input: REAL; (* 当前温度输入 *)
Setpoint: REAL; (* 设定温度 *)
Heater_Output: BOOL; (* 继电器控制信号 *)
Error: REAL; (* 温度误差 *)
Error_Last: REAL; (* 上次误差值 *)
Integral: REAL; (* 积分项 *)
Derivative: REAL; (* 微分项 *)
Kp: REAL := 1.0; (* 比例常数 *)
Ki: REAL := 0.1; (* 积分常数 *)
Kd: REAL := 0.01; (* 微分常数 *)
P: REAL; (* 比例项 *)
I: REAL; (* 积分项 *)
D: REAL; (* 微分项 *)
Control_Output: REAL; (* PID控制器输出 *)
PID_Manual_Tuning: BOOL := FALSE; (* 是否进行手动调节 *)
Tuning_Interval: TIME := T#5s; (* 自整定间隔时间 *)
Last_Tuning_Time: TIME := T#0s; (* 上次自整定时间 *)
Min_Heater_Duty: REAL := 0.0; (* 最小加热功率 *)
Max_Heater_Duty: REAL := 100.0; (* 最大加热功率 *)
Tuning_Iteration: INT := 0; (* 自整定迭代次数 *)
END_VAR
(* PID 控制计算 *)
Error := Setpoint - Temp_Input; (* 计算误差 *)
(* 比例项 *)
P := Kp * Error;
(* 积分项 *)
Integral := Integral + Error * T#1s; (* 积分累积 *)
I := Ki * Integral;
(* 微分项 *)
Derivative := (Error - Error_Last) / T#1s;
D := Kd * Derivative;
(* 计算PID输出 *)
Control_Output := P + I + D;
(* 输出限制 *)
IF Control_Output > Max_Heater_Duty THEN
Control_Output := Max_Heater_Duty;
ELSIF Control_Output < Min_Heater_Duty THEN
Control_Output := Min_Heater_Duty;
END_IF
(* 根据PID输出控制继电器 *)
IF Control_Output > 50 THEN
Heater_Output := TRUE; (* 加热器开启 *)
ELSE
Heater_Output := FALSE; (* 加热器关闭 *)
END_IF
(* 更新上次误差 *)
Error_Last := Error;
(* 自整定PID参数 *)
IF PID_Manual_Tuning = FALSE THEN
(* 判断是否需要自整定 *)
IF (CURRENT_TIME - Last_Tuning_Time) >= Tuning_Interval THEN
CASE Tuning_Iteration OF
0:
Kp := 1.0; Ki := 0.1; Kd := 0.01; (* 初始值 *)
1:
Kp := 1.5; Ki := 0.2; Kd := 0.02; (* 调整后的值 *)
2:
Kp := 2.0; Ki := 0.3; Kd := 0.05; (* 再次调整 *)
3:
Tuning_Iteration := 0; (* 调整结束,重置 *)
END_CASE
Tuning_Iteration := Tuning_Iteration + 1;
Last_Tuning_Time := CURRENT_TIME; (* 更新自整定时间 *)
END_IF
看B站还有自动帮忙写代码的,也就是你写注释,AI给你写代码。(https://www.cursor.com/)
代码未验证,但是能输出一个大概,自己简单修改调试一下,感觉就能用了的样子。
2025会不会是AI元年?
程序员写个AI把自己干掉了,不知是福是祸啊,
AI挺好用的,国内都给禁了,
deepseek 实测没有chatGPT好用。(同免费版,自己简单测试,第一次用AI)