Kết quả thực nghiệm trên mô hình

Một phần của tài liệu Điều khiển nhiệt độ nhiều kênh dùng dsPIC (Full Code) (Trang 59)

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" End If End If End If End If Next End Sub

Private Sub Cmd_Send1_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_Send1.Click

Status = Save_Lo_1 End Sub

Private Sub Cmd_Pid1_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_Pid1.Click

Status = Save_Pid_1 End Sub

Private Sub Timer_Read_Tick(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Timer_Read.Tick

If SerialPort1.IsOpen Then Dim Data(10) As Byte

If Status = Read_Data Then Data(0) = 254

Data(1) = 1

SerialPort1.Write(Data, 0, 8) End If

If Status = Save_Lo_1 Then Data(0) = 254

Data(1) = Save_Lo_1 Temp = Txt_Tda1.Text

Data(2) = Fix(Temp / 128) Data(3) = Temp Mod 128

If Select_OnOff1.Checked Then Data(4) = 0 End If If Select_Pid1.Checked Then Data(4) = 1 End If

SerialPort1.Write(Data, 0, 8) End If

If Status = Save_Pid_1 Then Data(0) = 254

Data(1) = Save_Pid_1 Temp = Txt_Kp1.Text

Data(2) = Fix(Temp / 128) Data(3) = Temp Mod 128 Temp = Txt_Ki1.Text

Data(4) = Fix(Temp / 128) Data(5) = Temp Mod 128 Temp = Txt_Kd1.Text

Data(6) = Fix(Temp / 128) Data(7) = Temp Mod 128

SerialPort1.Write(Data, 0, 8) End If

If Status = Save_Lo_2 Then Data(0) = 254

Data(1) = Save_Lo_2 Temp = Txt_Tda2.Text

Data(2) = Fix(Temp / 128) Data(3) = Temp Mod 128

If Select_OnOff2.Checked Then Data(4) = 0 End If If Select_Pid2.Checked Then Data(4) = 1 End If SerialPort1.Write(Data, 0, 8) End If

If Status = Save_Pid_2 Then Data(0) = 254

Data(1) = Save_Pid_2 Temp = Txt_Kp2.Text

Data(2) = Fix(Temp / 128) Data(3) = Temp Mod 128 Temp = Txt_Ki2.Text

Data(4) = Fix(Temp / 128) Data(5) = Temp Mod 128 Temp = Txt_Kd2.Text

Data(6) = Fix(Temp / 128) Data(7) = Temp Mod 128

SerialPort1.Write(Data, 0, 8) End If

If Status = Start_Stop Then Data(0) = 254

Data(1) = Start_Stop

If Cmd_Start.Text = "START" Then Data(2) = 1 Else Data(2) = 0 End If SerialPort1.Write(Data, 0, 8) End If

If Status = Test Then Data(0) = 254 Data(1) = Test If St_Test = 1 Then Data(2) = 1 If St_Lo_1 = 1 Then Data(3) = 1 Else Data(3) = 0 End If If St_Fan_1 = 1 Then Data(4) = 1 Else Data(4) = 0 End If If St_Lo_2 Then Data(5) = 1 Else Data(5) = 0 End If If St_Fan_2 Then Data(6) = 1 Else Data(6) = 0 End If Else Data(2) = 0 End If SerialPort1.Write(Data, 0, 8) End If Status = Read_Data Else

Cmd_Open.Text = "KET NOI" Timer_Read.Enabled = False End If

Private Sub Cmd_Send2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_Send2.Click

Status = Save_Lo_2 End Sub

Private Sub Cmd_Pid2_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_Pid2.Click

Status = Save_Pid_2 End Sub

Private Sub Cmd_Start_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_Start.Click

Status = Start_Stop End Sub

Private Sub Timer_Chart_Tick(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Timer_Chart.Tick

If Cmd_Start.Text = "STOP" Then X_TeeChart1 = X_TeeChart1 + 1 Y_TeeChart1 = TDa_1 With TChart1.Series(0) .Add(X_TeeChart1, Y_TeeChart1) End With Y_TeeChart1 = TDo_1 With TChart1.Series(1) .Add(X_TeeChart1, Y_TeeChart1) End With X_TeeChart2 = X_TeeChart1 + 2 Y_TeeChart2 = TDa_2 With TChart2.Series(0) .Add(X_TeeChart2, Y_TeeChart2) End With Y_TeeChart2 = TDo_2 With TChart2.Series(1) .Add(X_TeeChart2, Y_TeeChart2) End With End If If St_Test = 1 Then X_TeeChart1 = X_TeeChart1 + 1 Y_TeeChart1 = TDo_1 With TChart1.Series(1)

.Add(X_TeeChart1, Y_TeeChart1) End With X_TeeChart2 = X_TeeChart1 + 2 Y_TeeChart2 = TDo_2 With TChart2.Series(1) .Add(X_TeeChart2, Y_TeeChart2) End With End If

If Cmd_Start.Text = "START" And St_Test = 0 Then X_TeeChart1 = 0 TChart1.Series(0).Clear() TChart1.Series(1).Clear() X_TeeChart2 = 0 TChart2.Series(0).Clear() TChart2.Series(1).Clear() End If End Sub

Private Sub TChart1_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles TChart1.Click

End Sub

Private Sub Cmd_KhaoSat_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_KhaoSat.Click

If Cmd_KhaoSat.Text = "KHAO SAT ON" Then St_Test = 1 St_Lo_1 = 1 St_Fan_1 = 1 St_Lo_2 = 1 St_Fan_2 = 1 X_TeeChart1 = 0 TChart1.Series(0).Clear() TChart1.Series(1).Clear() X_TeeChart2 = 0 TChart2.Series(0).Clear() TChart2.Series(1).Clear() Else St_Test = 0 St_Lo_1 = 0 St_Fan_1 = 0 St_Lo_2 = 0 St_Fan_2 = 0 End If

Status = Test End Sub

Private Sub Cmd_Lo1_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles Cmd_Lo1.Click

If Cmd_Lo1.Text = "LO 1 ON" Then St_Lo_1 = 1 Else St_Lo_1 = 0 End If Status = Test End Sub

Private Sub Cmd_Quat1_Click(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

Một phần của tài liệu Điều khiển nhiệt độ nhiều kênh dùng dsPIC (Full Code) (Trang 59)

Tải bản đầy đủ (DOC)

(77 trang)
w