C. TRẠM BỒN NƯỚC EDUKIT PA
4. Giải thuật PID ổn định mực nước và lập trình khối PID bằng Ngôn ngữ SCL
Cơ sở lý thuyết:
PID (Proportional Integral Derivative) là một trong những thuật toán được sử dụng phổ biến nhất trong điểu khiển quá trình (process control) các hệ thống kín (điều khiển có hồi tiếp).
Sơ đồ khối của thuật toán PID:
Ảnh hưởng của các khâu tỉ lệ (P), tích phân (I) và đạo hàm (D) lên hệ thống:
Đáp ứng vịng kín
Thời gian lên Độ vọt lố Thời gian xác
lập
Sai số xác lập
Kp Giảm Tăng Thay đổi nhỏ Giảm
Ki Giảm Tăng Tăng Loại bỏ
Kd Thay đổi nhỏ Giảm Giảm Thay đổi nhỏ
Ảnh hưởng của các khâu P,I,D là cơ sở để chọn các hệ số phù hợp với hệ thống trong quá trình lập trình. Khâu tỉ lệ (P) sẽ ảnh hưởng nhiều đến thời gian lên (rising time) và đáp ứng của hệ thống, tuy nhiên nếu không chọn giá trị Kp hợp lý sẽ gây ra độ vọt lố cao và làm hệ thống giao động. Khâu tích phân (I) có tác dụng triệt tiêu sai số xác lập của hệ thống, giúp cho hệ thống đáp ứng nhanh lên nhưng đồng thời cũng dễ gây ra độ vọt lố lớn và làm tăng thời gian xác lập. Khâu vi phân ( D) có tác dụng hiệu chỉnh để giảm thời gian xác lập và độ vọt lố, tuy nhiên do đặc tính của khâu vi phân là nhạy với nhiễu tần số cao nên rất dễ làm cho hệ thống mất ổn định . Vì vậy đây là khâu ít được sử dụng nhất trong 3 thông số của bộ điều khiển này.
Xây dựng thuật toán PID điều khiển hệ thống bồn nước bằng ngơn ngữ lập trình có cấu trúc SCL:
Chương trình OB 35:
Khối ngắt thời gian theo chu kỳ OB35 gọi đọc giá trị cảm biến siêu âm, gọi hàm PID và xuất giá trị điều khiển ra bơm.
Chương trình khối hàm PID FB1:
IF (#Out_type=1) THEN #KO1 := #Out_max; #KO2 := -#Out_max; ELSE #KO1 := #Out_max; #KO2 := 0; END_IF;
#Error_0 := #Set_val- #Real_val;
#Error_sum := #Error_sum_1*0.995+ #Error_0;
IF (#Error_sum > 30000) THEN //hàm bão hòa cho
#Error_sum_1 := -30000; ELSE #Error_sum_1 := #Error_sum; END_IF; IF (#Error_0 >= 1000) THEN #Udk_temp := #Out_max;
ELSIF (#Error_0>500) THEN
#Udk_temp := #Out_max*3/4;
ELSE
#Error_den:= #Error_0-#Error_1; #Error_1 := #Error_0;
#Udk_temp := #Kp*#Error_0;
#Udk_temp := #Udk_temp+ #Ki* #Error_sum_1; #Udk_temp := #Udk_temp+ #Kd* #Error_den;
IF(#Udk_temp >= #Out_max) THEN //hàm bão hịa tín
hiệu ngõ ra
#Udk_temp := #Out_max;
ELSIF (#Udk_temp <= 0) THEN
#Udk_temp := 0; ELSE ; END_IF; END_IF; IF (#Error_0=0) THEN #Error_sum := 0; END_IF;
#Output := REAL_TO_INT( #Udk_temp);
Tùy vào tầm giá trị đặt khác nhau và các hệ thống khác nhau, ta sẽ chọn được các bộ hệ số PID phù hợp với yêu cầu điều khiển. trong trường hợp này với hệ số đã chọn tương ứng với giá trị đặt, độ vọt lố của hệ thống <2% và sai số xác lập <=0.5%.