|
|
|
|




|
| ||||||||||||
|
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 |

















|
|