3.2.1 Đối tượng điều khiển
Đối tượng điều khiển là nhiệt độ, tăng nhiệt độ bằng cách tăng PWM – thay đổi độ rộng xung (duty cycle).
Vậy ngõ vào và ra của bộ điều khiển PID:
- Ngõ vào: e = nhiệt độ đặt (t_da) – nhiệt độ đo (t_do) - Ngõ ra: u = % duty cycle
3.2.2 Cách tính nhiệt độ trong đề tài
Cảm biến LM35 là cảm biến tương tự vì vậy ta phải dùng bộ ADC chuyển sang tương tự thì mới tính toán được nhiệt độ.
Ta có: U= t.k u là điện áp đầu ra
t là nhiệt độ môi trường đo, k là hệ số theo nhiệt độ của LM35 10mV/1 độ C
Điện áp cấp cho LM35 là 5V ADC 12bit
Vậy bước thay đổi của LM35 sẽ là 5/(2^12) = 5/4096 Giá trị ADC đo được thì điện áp đầu vào của LM35 là (t*k)/(5/4096) = ((10^-2)*4096*t)/5 = 4.096*t
Vậy nhiệt độ ta đo được t = giá trị ADC/4096 Tính nhiệt độ trong đề tài:
coun_adc = 0; sum_adc = 0; while(coun_adc < 3000){ adc = read_adc(); sum_adc += adc; coun_adc++; }; tdo_1 = sum_adc/30000;
3.2.3 Cách tính toán PWM duty trong đề tài
Các ký hiệu:
+ Kp, Ki, Kd lần lượt là các hệ số Kp,Ki, Kd. + err là sai lệch hiện tại (trong lúc đang xét). + pre_err là sai lệch ngay trước đó.
+ e_sum là tổng của tất cả các sai lệch từ lúc bắt đầu đến thời điểm đang xét.
+ t_da là nhiệt độ đặt (oc).
+ t_do là nhiệt độ đo đọc được từ cảm biến LM35. + duty là độ rộng của xung PWM.
- Cách tính:
#define period 5000 err_1 = tda_1 - tdo_1;
p_part_1 = (signed int32)kp_1*err_1; if(p_part_1 > period){p_part_1 = period;}; if(p_part_1 < -period){p_part_1 =- period;}; if(ki_1 != 0){
i_part_1 += ((signed int32)ki_1*err_1); }
else{
i_part_1 = 0; };
if(i_part_1 > period){i_part_1 = period;}; if(i_part_1 < -period){i_part_1 =- period;};
if(tdo_1 >= tda_1){i_part_1 = 0;}; d_part_1=((signed int32)kd_1*(err_1 - pre_err_1)); if(d_part_1 > period){d_part_1 = period;};
if(d_part_1 < -period){d_part_1 =- period;}; pre_err_1 = err_1; output_1 = p_part_1 + i_part_1 + d_part_1; if(output_1 > period){output_1 = period;}; if(output_1 < 0){output_1 = 0;};
if(tdo_1 > tda_1){output_1 = 0;}; temp = output_1*65472/period; set_pwm_duty(1,temp);
3.2.4 Chương trình chính
Hình 3.41 Lưu đồ chương trình chính
START
Khởi tạo LCD, đọc dữ liệu EEPROM, khởi tạo ADC, khởi
tạo PWM, khởi tạo timer, cho phép ngắt.
Đo nhiệt độ
Điều khiển PID HOẶC ON/OFF d
Kết nối với máy tính END
3.2.5 Chương trình PID
Hình 3.42 Lưu đồ thuật toán PID
PID Err = Tda - Tdo
P_part = Kp*Err
I_part += Ki*Err
D_part = Kd (Err – Pre_Err)
Pre_Err = Err
Output = P_part + I_part + D_part
3.2.6 Chương trình ON/OFF
3.2.7 Chương trình kết nối với máy tính
Hình 3.44 Lưu đồ kết nối với máy tính
N Y N N Y Y Y
Kết nối với máy tính
Có dữ liệu
trong bộ đệm END
Yêu cầu gửi
dữ liệu Gửi dữ liệu lên máy tính.
Thông số cài
đặt lò 1 Lưu thông số và hiển thị.
Y Thông số cài đặt lò 2 Lưu thông số và hiển thị. Trạng thái START/STO P Lưu trạng thái END
3.2.8 Chương trình ngắt dữ liệu trên máy tính
CHƯƠNG 4. KẾT QUẢ THI CÔNG
4.1 Giao diện điều khiển trên visual basic 2005:
Hình 4.46 Giao diện điều khiển
4.2 Mô hình
4.3 Kết quả thực nghiệm trên mô hình4.3.1 Thực nghiệm 1 4.3.1 Thực nghiệm 1
Hình 4.48 Thực nghiệm 1
Lò 1: điều khiển bằng PID với nhiệt độ đặt là 70 các hệ số PID là Kp = 7,Ki = 1, Kd = 3.
Nhận xét: chất lương điều khiển chưa tốt thời gian đáp ứng chậm, sai số xác lặp cao.
Lò 2: điều khiển bằng ON/OFF với nhiệt độ đặt là 80. Nhận xét: chất lượng điều khiển tốt.
4.3.2 Thực nghiệm 2
Hình 4.49 Thực nghiệm 2
Lò 1: Điểu khiển PID với nhiệt độ đặt 70, các thông số PID là Kp = 8, Ki = 10, Kd = 20
Nhận xét: chất lương điều khiển tương đối tốt không độ vọt lố,thời gian đáp ứng nhanh, sai số xác lập nhỏ.
Lò 2: điều khiển ON/OFF với nhiệt độ đặt 80 Nhận xét: chất lượng điều khiển tốt
Hình 4.50 Thực nghiệm 3
Lò 1: điều khiển ON/OFF với nhiệt độ đặt 70 Nhận xét: chất lượng điều khiển tốt
Lò 2:điểu khiển PID với nhiệt độ đặt 60, các thông số PID là Kp = 5, Ki = 10, Kd = 20
Nhận xét: chất lượng điều khiển tốt không độ vọt lố, thời gian đáp ứng nhanh, sai số xác lập nhỏ.
4.3.4 Thực nghiệm 4
Hình 4.51 Thực nghiệm 4
Cả 2 lò cùng điều khiển bằng PID cùng tốc độ đặt và cùng thông số PID. Nhận xét:
Cả 2 lò có chất lượng điều khiển tốt sai số xác lặp nhỏ, không độ vọt lố và thời gian đáp ứng nhanh.
CHƯƠNG 5. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
5.1 Kết luận
Qua đề tài này em đã làm được những yêu cầu sau:
Thứ nhất:
Tìm hiểu về vi điều khiển dsPIC 30F4013 viết chương trình và thuật toán PID, thuật toán ON/OFF trên CCS nạp vào vi điều khiển dsPIC và thông qua mạch công suất để điều khiển lò nhiệt.
Thứ hai:
Tìm hiểu về Visual Basic 2005 để thiết kế giao diện và viết chương trình để truyền các thông số PID và nhiệt độ đặt xuống vi điều khiển đồng thời nhận nhiệt độ đo được từ vi điều khiển vẽ đồ thị đánh giá chất lượng điều khiển.
Thứ ba:
Thiết kế được mô hình phần cứng của 2 lò nhiệt.
5.2 Một số điểm hạn chế
- Lò nhiệt làm còn thô sơ, băm xung ở tần số 1HZ nên đèn chớp liên tục dễ hư đèn, bộ phân hạ nhiệt chỉ có quạt hút phải thiết kế thêm 1 quạt thổi trong lò nhiệt.
5.3 Hướng phát triển đề tài:
- Thiết kế các khối mạch độ có công suất lớn hơn để có thể điều khiển nhiệt độ cao dùng trong công nghiệp.
- Nghiên cứu và cải tiến bộ điều khiển PID trong đề tài thành bộ điều khiển PID-Mờ hoặc PID-Mờ thích nghi để có chất lượng điều khiển tốt hơn.
CHƯƠNG 6.TÀI LIỆU THAM KHẢO
Tiếng việt
[1] Huỳnh Minh Ngọc “tailieudspic30f4013”, Đại Học Công Nghiệp TPHCM.
[2]Huỳnh Thái Hoàng lý thuyết điều khiển tự động . Đại học bách khoa Thành Phố Hồ Chí Minh.
[3] Huỳnh Minh Ngọc đo lường và điều khiển bằng máy tính . Đại học công nghiệp Thành Phố Hồ Chí Minh
[4] Nguyễn Bính (2000) Điện tử công suất. Nhà xuất bản Khoa học và kỹ thuật.
[5] Bùi Đình Tiếu (2004) Giáo trình Truyền động điện. Nhà xuất bản giáo dục.
[6] Các tài liệu dạng file PDF gồm: Giáo trình, Data Sheet linh kiện,… [7] Các wedside tham khảo:
www.dientuvietnam.net www.diendandientu.vn
www.picvietnam.com
www.alldatasheet.com
Tiếng anh
[1] Microchip, dsPIC30F3014/4013Data Sheet High-Performance, 16-Bit Digital Signal Controllers, Getting Started with dsPIC30F.
[2] Zoran Milivojević, Djordje Šaponjić, Programming dsPIC Microcontrollers in C, MikroElektronika Publication.
CHƯƠNG 7. PHỤ LỤC
1. Chương trình chính viết trên vi điều khiển dsPIC30F4013
#include <30f4013.h> #device ADC = 12 #use delay(clock=22118400) #include "lcd16x2.c" #use rs232(UART1A,baud=9600,parity=N,xmit=PIN_C13,rcv=PIN_C14,bits=8) #FUSES HS,NOWDT,BROWNOUT,MCLR,PROTECT,NODEBUG void tinh_nhiet_do(); void pid_1(); void pid_2(); void ket_noi_pc(); void dieu_khien_onoff();
unsigned int8 du_lieu_nhan[10]; unsigned int8 du_lieu_gui[30]; unsigned int8 i = 0;
unsigned int8 value = 0; int1 status_rda = 0; #define read_data 1 #define save_lo_1 2 #define save_pid_1 3 #define save_lo_2 4 #define save_pid_2 5 #define start_stop 6 #define test 7
//Dinh nghia chan diei khien #define dk_1 PIN_D0 #define dk_2 PIN_D1 #define fan_1 PIN_D2 #define fan_2 PIN_D3
unsigned int16 tdo_1 = 0, tdo_2 = 0; unsigned int16 tda_1 = 0, tda_2 = 0; unsigned int8 st_pid_1 = 0;
unsigned int8 st_pid_2 = 0; unsigned int8 st_start_stop = 0; unsigned int8 st_test = 0; unsigned int8 st_dk_1 = 0; unsigned int8 st_fan_1 = 0; unsigned int8 st_dk_2 = 0; unsigned int8 st_fan_2 = 0;
unsigned int16 temp; //Bien tam //Cac thong so PID
#define period 5000
unsigned int16 ki_1 = 0;
unsigned int16 kd_1 = 0; signed int32 err_1 = 0; //Sai so hien tai signed int32 pre_err_1 = 0; //Sai so truoc do signed int32 p_part_1 = 0;
signed int32 i_part_1 = 0; signed int32 d_part_1 = 0; signed int32 output_1 = 0;
unsigned int16 kp_2 = 0; //Thong so PID 2 unsigned int16 ki_2 = 0;
unsigned int16 kd_2 = 0; signed int32 err_2 = 0; //Sai so hien tai signed int32 pre_err_2 = 0; //Sai so truoc do signed int32 p_part_2 = 0;
signed int32 i_part_2 = 0; signed int32 d_part_2 = 0; signed int32 output_2 = 0; void main(){ //Khoi tao LCD lcd_init(); lcd_gotoxy(1,1); printf(lcd_putc,"Do Nhiet Do LM35"); lcd_gotoxy(1,2);
printf(lcd_putc,"DK ON/OFF & PID"); delay_ms(1000);
printf(lcd_putc,"\f"); //Doc du lieu EEPROM //Du lieu lo 1 tda_1 = read_eeprom(0); if(tda_1 > 200) tda_1 = 0; st_pid_1 = read_eeprom(2); if(st_pid_1 > 1) st_pid_1 = 0; kp_1 = read_eeprom(4); if(kp_1 > 5000) kp_1 = 0; ki_1 = read_eeprom(6); if(ki_1 > 5000) ki_1 = 0; kd_1 = read_eeprom(8); if(kd_1 > 5000) kd_1 = 0; //Du lieu lo 2 tda_2 = read_eeprom(10); if(tda_2 > 200) tda_2 = 0; st_pid_2 = read_eeprom(12); if(st_pid_2 > 1) st_pid_2 = 0; kp_2 = read_eeprom(14); if(kp_2 > 5000) kp_2 = 0; ki_2 = read_eeprom(16);
if(ki_2 > 5000) ki_2 = 0; kd_2 = read_eeprom(18); if(kd_2 > 5000) kd_2 = 0; //Hien thi len LCD
lcd_gotoxy(1,2);
printf(lcd_putc,"%3u",tda_1); lcd_gotoxy(9,2);
printf(lcd_putc,"%3u",tda_2); //Khoi tao ADC
SETUP_ADC_PORTS(sAN1|sAN2,VSS_VREF); //Range 0-VrefH SETUP_ADC(ADC_CLOCK_DIV_64|ADC_TAD_MUL_2); //Clock External, Auto-sample time = 0
//Khoi tao PWM set_pwm_duty(1,0); set_pwm_duty(2,0);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_64, 0xFFC0); if(st_pid_1){
setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); }
else{
setup_compare(1, COMPARE_OFF); };
if(st_pid_2){
setup_compare(2, COMPARE_PWM | COMPARE_TIMER2); }
else{
setup_compare(2, COMPARE_OFF); };
//Khoi tao Timer thoi gian tinh PID
SETUP_TIMER1(TMR_INTERNAL|TMR_DIV_BY_256,21600); //Dung cho thoi gian lay mau
//Tat quat
output_bit(fan_1,0); output_bit(fan_2,0); //Cho phep ngat
ENABLE_INTERRUPTS(INT_TIMER1); ENABLE_INTERRUPTS(INT_RDA); ENABLE_INTERRUPTS(INTR_GLOBAL); while(TRUE){ tinh_nhiet_do(); dieu_khien_onoff(); ket_noi_pc(); } } void dieu_khien_onoff(){ if(st_start_stop){
if(st_pid_1 == 0){
if(tdo_1 < tda_1) output_bit(dk_1,1); else output_bit(dk_1,0);
if(tdo_1 >= tda_1) output_bit(fan_1,1); else output_bit(fan_1,0);
};
if(st_pid_2 == 0){
if(tdo_2 < tda_2) output_bit(dk_2,1); else output_bit(dk_2,0);
if(tdo_2 >= tda_2) output_bit(fan_2,1); else output_bit(fan_2,0); }; }; } void ket_noi_pc(){ unsigned int8 j = 0; if(status_rda == 1){ status_rda = 0; if(du_lieu_nhan[0] == read_data){ //Gui nhiet do lo 1 du_lieu_gui[0] = tdo_1/128; du_lieu_gui[1] = tdo_1%128; //Gui nhiet do dat lo 1
du_lieu_gui[2] = tda_1/128; du_lieu_gui[3] = tda_1%128; //Gui trang thai lo 1
du_lieu_gui[4] = st_pid_1; //Gui PID dat lo 1
du_lieu_gui[5] = kp_1/128; du_lieu_gui[6] = kp_1%128; du_lieu_gui[7] = ki_1/128; du_lieu_gui[8] = ki_1%128; du_lieu_gui[9] = kd_1/128; du_lieu_gui[10] = kd_1%128; //Gui nhiet do lo 2 du_lieu_gui[11] = tdo_2/128; du_lieu_gui[12] = tdo_2%128; //Gui nhiet do dat lo 2
du_lieu_gui[13] = tda_2/128; du_lieu_gui[14] = tda_2%128; //Gui trang thai lo 2
du_lieu_gui[15] = st_pid_2; //Gui PID dat lo 2
du_lieu_gui[16] = kp_2/128; du_lieu_gui[17] = kp_2%128; du_lieu_gui[18] = ki_2/128;
du_lieu_gui[19] = ki_2%128; du_lieu_gui[20] = kd_2/128; du_lieu_gui[21] = kd_2%128; //Gui Trang thai Start Stop du_lieu_gui[22] = st_start_stop; //Gui trang thai DK he ho
du_lieu_gui[23] = st_test; du_lieu_gui[24] = st_dk_1; du_lieu_gui[25] = st_fan_1; du_lieu_gui[26] = st_dk_2; du_lieu_gui[27] = st_fan_2; printf("%c",0xfe); //Start code for(j = 0;j < 28;j ++){
printf("%c",du_lieu_gui[j]); };
}
if(du_lieu_nhan[0] == save_lo_1){
tda_1 = (unsigned int16)du_lieu_nhan[1]*128 + du_lieu_nhan[2]; st_pid_1 = du_lieu_nhan[3];
write_eeprom(0,tda_1); write_eeprom(2,st_pid_1); if(st_start_stop){
if(st_pid_1){
setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); } else{ setup_compare(1, COMPARE_OFF); }; }; lcd_gotoxy(1,2); printf(lcd_putc,"%3u",tda_1); }; if(du_lieu_nhan[0] == save_pid_1){
kp_1 = (unsigned int16)du_lieu_nhan[1]*128 + du_lieu_nhan[2]; ki_1 = (unsigned int16)du_lieu_nhan[3]*128 + du_lieu_nhan[4]; kd_1 = (unsigned int16)du_lieu_nhan[5]*128 + du_lieu_nhan[6]; write_eeprom(4,kp_1);
write_eeprom(6,ki_1); write_eeprom(8,kd_1); };
if(du_lieu_nhan[0] == save_lo_2){
tda_2 = du_lieu_nhan[1]*128 + du_lieu_nhan[2]; st_pid_2 = du_lieu_nhan[3];
write_eeprom(10,tda_2); write_eeprom(12,st_pid_2); if(st_start_stop){
if(st_pid_2){
setup_compare(2, COMPARE_PWM | COMPARE_TIMER2); } else{ setup_compare(2, COMPARE_OFF); }; }; lcd_gotoxy(9,2); printf(lcd_putc,"%3u",tda_2); }; if(du_lieu_nhan[0] == save_pid_2){
kp_2 = (unsigned int16)du_lieu_nhan[1]*128 + du_lieu_nhan[2]; ki_2 = (unsigned int16)du_lieu_nhan[3]*128 + du_lieu_nhan[4]; kd_2 = (unsigned int16)du_lieu_nhan[5]*128 + du_lieu_nhan[6]; write_eeprom(14,kp_2); write_eeprom(16,ki_2); write_eeprom(18,kd_2); }; if(du_lieu_nhan[0] == start_stop){ st_start_stop = du_lieu_nhan[1]; if(st_start_stop){ if(st_pid_1)setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); if(st_pid_2)setup_compare(2, COMPARE_PWM | COMPARE_TIMER2); } else{ if(st_pid_1)setup_compare(1, COMPARE_OFF); else output_bit(dk_1,0); if(st_pid_2)setup_compare(2, COMPARE_OFF); else output_bit(dk_2,0); output_bit(fan_1,0); output_bit(fan_2,0); }; }; if(du_lieu_nhan[0] == test){ st_test = du_lieu_nhan[1]; if(st_test){ st_dk_1 = du_lieu_nhan[2]; if(st_dk_1){ output_bit(dk_1,1); } else{ output_bit(dk_1,0); };
st_fan_1 = du_lieu_nhan[3]; if(st_fan_1){ output_bit(fan_1,1); } else{ output_bit(fan_1,0); }; st_dk_2 = du_lieu_nhan[4]; if(st_dk_2){ output_bit(dk_2,1); } else{ output_bit(dk_2,0); }; st_fan_2 = du_lieu_nhan[5]; if(st_fan_2){ output_bit(fan_2,1); } else{ output_bit(fan_2,0); }; } else{ output_bit(dk_1,0); st_dk_1 = 0; output_bit(fan_1,0); st_fan_1 = 0; output_bit(dk_2,0); st_dk_2 = 0; output_bit(fan_2,0); st_fan_2 = 0; }; }; } } void tinh_nhiet_do(){
unsigned int16 coun_adc = 0; unsigned int16 adc;
unsigned int32 sum_adc = 0; //Do nhiet do kenh 1
SET_ADC_CHANNEL(1); delay_ms(1);
sum_adc = 0;
while(coun_adc < 3000){ //Chuyen doi ADC LM35 1 adc = read_adc();
sum_adc += adc; coun_adc++; };
tdo_1 = sum_adc/30000; //Do nhiet do kenh 2
SET_ADC_CHANNEL(2); delay_ms(1);
coun_adc = 0; sum_adc = 0;
while(coun_adc < 3000){ //Chuyen doi ADC LM35 1 adc = read_adc(); sum_adc += adc; coun_adc++; }; tdo_2 = sum_adc/30000; //Hien thi ra LCD lcd_gotoxy(1,1); printf(lcd_putc,"L1%3u%cC",tdo_1,0xdf); lcd_gotoxy(9,1); printf(lcd_putc,"L2%3u%cC",tdo_2,0xdf); }
#INT_TIMER1 //Thoi gian tinh PID 1 S void timer1_isr(){
if(st_pid_1 && st_start_stop) pid_1(); else i_part_1 = 0;
if(st_pid_2 && st_start_stop) pid_2(); else i_part_2 = 0;
}
void pid_1(){
err_1 = tda_1 - tdo_1;
p_part_1 = (signed int32)kp_1*err_1; if(p_part_1 > period){p_part_1 = period;}; if(p_part_1 < -period){p_part_1 =- period;}; if(ki_1 != 0){
i_part_1 += ((signed int32)ki_1*err_1); }
else{
i_part_1 = 0; };
if(i_part_1 > period){i_part_1 = period;}; if(i_part_1 < -period){i_part_1 =- period;};
if(tdo_1 >= tda_1){i_part_1 = 0;}; d_part_1=((signed int32)kd_1*(err_1 - pre_err_1));
if(d_part_1 > period){d_part_1 = period;}; if(d_part_1 < -period){d_part_1 =- period;}; pre_err_1 = err_1; output_1 = p_part_1 + i_part_1 + d_part_1; if(output_1 > period){output_1 = period;}; if(output_1 < 0){output_1 = 0;}; if(tdo_1 > tda_1){output_1 = 0;}; temp = output_1*65472/period; set_pwm_duty(1,temp); } void pid_2(){
err_2 = tda_2 - tdo_2;
p_part_2 = (signed int32)kp_2*err_2; if(p_part_2 > period){p_part_2 = period;}; if(p_part_2 < -period){p_part_2 =- period;}; if(ki_2 != 0){
i_part_2 += ((signed int32)ki_2*err_2); }
else{
i_part_2 = 0; };
if(i_part_2 > period){i_part_2 = period;}; if(i_part_2 < -period){i_part_2 =- period;};
if(tdo_2 >= tda_2){i_part_2 = 0;}; d_part_2=((signed int32)kd_2*(err_2 - pre_err_2)); if(d_part_2 > period){d_part_2 = period;};
if(d_part_2 < -period){d_part_2 =- period;}; pre_err_2 = err_2; output_2 = p_part_2 + i_part_2 + d_part_2; if(output_2 > period){output_2 = period;}; if(output_2 < 0){output_2 = 0;}; if(tdo_2 > tda_2){output_2 = 0;}; temp = output_2*65472/period; set_pwm_duty(2,temp); } #INT_RDA void receive_isr(){ value = getchar();
if(value == 0xfe){i = 0;goto exit;}; if(i < 7){ du_lieu_nhan[i] = value; i++; if(i == 7){ status_rda = 1; }; }; exit:; }
2. Chương trình viết trên visual basic 2005
Public Class Form1
Dim Du_Lieu(30) As Integer Dim Coun As Integer
Dim Temp As Integer Dim Status As Integer Dim St_Test As Byte Dim St_Lo_1 As Byte Dim St_Fan_1 As Byte Dim St_Lo_2 As Byte Dim St_Fan_2 As Byte
Const Read_Data = 1 Const Save_Lo_1 = 2 Const Save_Pid_1 = 3 Const Save_Lo_2 = 4 Const Save_Pid_2 = 5 Const Start_Stop = 6 Const Test = 7
Dim X_TeeChart1 As Double Dim Y_TeeChart1 As Double Dim X_TeeChart2 As Double Dim Y_TeeChart2 As Double Dim TDo_1 As Integer
Dim TDo_2 As Integer Dim TDa_1 As Integer Dim TDa_2 As Integer
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
Status = Read_Data End Sub
Private Sub Cmd_Open_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles Cmd_Open.Click
If Cmd_Open.Text = "KET NOI" Then
SerialPort1.PortName = CboPort.Text SerialPort1.Encoding =
System.Text.Encoding.GetEncoding(28591) SerialPort1.Open()
Cmd_Open.Text = "NGAT KET NOI" Timer_Read.Enabled = True
Else
SerialPort1.Close()
Cmd_Open.Text = "KET NOI" Timer_Read.Enabled = False End If
End Sub
Private Sub SerialPort1_DataReceived(ByVal
sender As Object, ByVal e As
System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim n As Integer Dim i As Integer n = SerialPort1.BytesToRead For i = 1 To n Temp = SerialPort1.ReadChar If Temp = 254 Then Coun = 0 Else Du_Lieu(Coun) = Temp If Coun < 29 Then Coun = Coun + 1 If Coun = 27 Then 'Lay du lieu Lo 1
Temp = Du_Lieu(0) * 128 + Du_Lieu(1) Lbl_Tdo1.Text = Temp
TDo_1 = Temp
Temp = Du_Lieu(2) * 128 + Du_Lieu(3) TDa_1 = Temp
Lbl_Tda1.Text = Temp 'Trang thai ON/OFF - PID Temp = Du_Lieu(4) If Temp = 0 Then Lbl_OnOff1.Text = "ON-OFF" Else Lbl_OnOff1.Text = "PID" End If 'Kd 1
Temp = Du_Lieu(5) * 128 + Du_Lieu(6) Lbl_Kp1.Text = Temp
'Ki 1
Temp = Du_Lieu(7) * 128 + Du_Lieu(8) Lbl_Ki1.Text = Temp
'Kd 1
Temp = Du_Lieu(9) * 128 + Du_Lieu(10) Lbl_Kd1.Text = Temp
'Lay du lieu Lo 2
Temp = Du_Lieu(11) * 128 + Du_Lieu(12) Lbl_Tdo2.Text = Temp
TDo_2 = Temp
Temp = Du_Lieu(13) * 128 + Du_Lieu(14) TDa_2 = Temp
Lbl_Tda2.Text = Temp 'Trang thai ON/OFF - PID Temp = Du_Lieu(15) If Temp = 0 Then Lbl_OnOff2.Text = "ON-OFF" Else Lbl_OnOff2.Text = "PID" End If 'Kd 2
Temp = Du_Lieu(16) * 128 + Du_Lieu(17) Lbl_Kp2.Text = Temp 'Ki 2
Temp = Du_Lieu(18) * 128 + Du_Lieu(19) Lbl_Ki2.Text = Temp 'Kd 2
Temp = Du_Lieu(20) * 128 + Du_Lieu(21) Lbl_Kd2.Text = Temp 'Trang Thai Start Stop Temp = Du_Lieu(22) If Temp = 1 Then Cmd_Start.Text = "STOP" Else Cmd_Start.Text = "START" End If
'Trang Thai Test
If Du_Lieu(23) = 1 Then Cmd_KhaoSat.Text = "KHAO SAT OFF" Else
Cmd_KhaoSat.Text = "KHAO SAT ON" End If
If Du_Lieu(24) = 1 Then Cmd_Lo1.Text = "LO 1 OFF" Else
Cmd_Lo1.Text = "LO 1 ON" End If
If Du_Lieu(25) = 1 Then Cmd_Quat1.Text = "QUAT OFF" Else
Cmd_Quat1.Text = "QUAT ON" End If
If Du_Lieu(26) = 1 Then Cmd_Lo2.Text = "LO 2 OFF" Else
End If
If Du_Lieu(27) = 1 Then Cmd_Quat2.Text = "QUAT OFF" Else
Cmd_Quat2.Text = "QUAT ON"