|
|
| ||||||||||||
|
e = r - y; inte = inte + e * Te; deriv = (e - e_v) / Te; u = kp * e + ki * inte + kd * deriv; e_v = e; |
Sub init_p() If r=0 Then SmartTags("Kp_int")=75 SmartTags("Ki_int")=120 SmartTags("Kd_int")=1 SmartTags("Te_int")=5 SmartTags("r")=400 End If SmartTags("y")=0 SmartTags("y_v")=0 SmartTags("inte")=0 SmartTags("deriv")=0 SmartTags("e")=0 SmartTags("e_v")=0 SmartTags("u")=0 SmartTags("Kp")=SmartTags("Kp_int")/100 SmartTags("Ki")=SmartTags("Ki_int")/100 SmartTags("Kd")=SmartTags("Kd_int")/100 SmartTags("Te")=SmartTags("Te_int")/100 SmartTags("r_scal")=SmartTags("r")/10 End Sub |
Sub pid_hmi() Dim inte, deriv,tm tm=Timer() Do While SmartTags("Tag_ScreenNumber")=3 If Timer > tm+0.01 Then e = r - y inte = inte + e * Te deriv = (e - e_v) / Te u = Kp * e + Ki * inte + Kd * deriv e_v = e y = (u*Te + 5 * y_v) / (5 + Te) y_v=y u_scal=u/10 y_scal=y/10 r_scal=r/10 tm=Timer() End If Loop End Sub |
"Contor" := "Contor" + 1; IF "Contor" > 999 THEN "Contor" := 0; END_IF; IF "mod" = 2 THEN "e" := INT_TO_REAL("r") - "y"; "inte" := "inte" + "e" * "Te"; "deriv" := ("e" - "e_v") / "Te"; "u" := "Kp" * "e" + "Ki" * "inte" + "Kd" * "deriv"; "e_v" := "e"; "y" := ("u" * "Te" + 5 * "y_v") / (5 + "Te"); "y_v" := "y"; "u_scal" := REAL_TO_INT("u" / 10); "y_scal" := REAL_TO_INT("y" / 10); "r_scal" := REAL_TO_INT("r" / 10); END_IF; |
"mod" := 0; "Contor" := 0; "Kp" := 0.75; "Ki":= 1.2; "Kd":= 0.01; "r":= 400; "r_scal" := 0; "e" := 0; "e_v" := 0; "y" := 0; "y_v" := 0; "r" := 400; "y_scal" := 0; "inte":= 0; "deriv":= 0; "u":= 0; "u_scal":= 0; |
// Comanda rampa IF "mod" = 5 THEN "u_mcc" := "u_mcc" + 10; IF "u_mcc" > 32000 THEN "u_mcc" := 0; END_IF; "u_scal" := "u_mcc" / 320; "y_scal" := REAL_TO_INT("y_mcc" / 320); "r_scal" := REAL_TO_INT("r" / 10); END_IF; |
// Comanda treapta IF "mod" = 6 THEN IF "Contor" > 500 THEN "u_mcc" := 31000; ELSE "u_mcc" := 0; END_IF; "u_scal" := "u_mcc" / 320; "y_scal" := REAL_TO_INT("y_mcc" / 320); "r_scal" := REAL_TO_INT("r" / 10); END_IF; |
Sub init_p_s_mcc() SmartTags("Kp_int")=20 SmartTags("Ki_int")=50 SmartTags("Kd_int")=1 SmartTags("Te_int")=10 SmartTags("r")=300 SmartTags("y")=0 SmartTags("y_v")=0 SmartTags("inte")=0 SmartTags("deriv")=0 SmartTags("e")=0 SmartTags("e_v")=0 SmartTags("u")=0 SmartTags("Kp")=SmartTags("Kp_int")/100 SmartTags("Ki")=SmartTags("Ki_int")/100 SmartTags("Kd")=SmartTags("Kd_int")/100 SmartTags("Te")=SmartTags("Te_int")/100 SmartTags("r_scal")=SmartTags("r")/10 End Sub |
// Regulator PID pentru circuitul echivalent al unui motor de CC IF "mod" = 3 THEN "e" := INT_TO_REAL("r") - "y_mcc" / 10; "inte" := "inte" + "e" * "Te"; "deriv" := ("e" - "e_v") / "Te"; "u_mcc" := REAL_TO_INT("Kp" * "e" + "Ki" * "inte" + "Kd" * "deriv") * 64; IF "u_mcc" > 32000 THEN "u_mcc" := 32000; END_IF; IF "u_mcc" < 0 THEN "u_mcc" := 0; END_IF; "e_v" := "e"; "y_v" := "y_mcc" / 10; "u_scal" := "u_mcc" / 320; "y_scal" := REAL_TO_INT("y_mcc" / 60); "r_scal" := REAL_TO_INT("r" / 6); END_IF; |
// Regulator PID pentru un motor de CC IF "mod" = 4 THEN "e" := INT_TO_REAL("r") - "y_mcc" / 6; "inte" := "inte" + "e" * "Te"; "deriv" := ("e" - "e_v") / "Te"; "u_mcc" := REAL_TO_INT("Kp" * "e" + "Ki" * "inte" + "Kd" * "deriv") * 64; IF "u_mcc" > 32000 THEN "u_mcc" := 32000; END_IF; IF "u_mcc" < 0 THEN "u_mcc" := 0; END_IF; "e_v" := "e"; "y_v" := "y_mcc" / 6; "u_scal" := "u_mcc" / 160; "y_scal" := REAL_TO_INT("y_mcc" / 30); "r_scal" := REAL_TO_INT("r" / 5); END_IF; |
Capitol realizat cu contributia stud: Iulia Coros |
|