Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 105 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
105
Dung lượng
1,87 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI ĐÀO VĂN SƠN THIẾT KẾ HỆ THỐNG GIÁM SÁT VÀ ĐIỀU KHIỂN QUÁ TRÌNH BẢO QUẢN NÔNG SẢN DẠNG HẠT LUẬN VĂN THẠC SĨ KỸ THUẬT Chuyên ngành: Điện khí hóa sản xuất nông nghiệp nông thôn Mã số : 60.52.54 Người hướng dẫn khoa học: TS LƯU HỒNG VIỆT 1 HÀ NỘI, 2011 2 LỜI CAM ĐOAN Tôi xin cam đoan số liệu kết nghiên cứu luận văn trung thực chưa sử dụng để bảo vệ học vị Tôi xin cam đoan giúp đỡ cho việc thực luận văn cảm ơn thông tin trích dẫn luận văn rõ nguồn gốc Hà Nội, ngày 30 tháng 10 năm 2011 Người cam đoan Đào Văn Sơn 3 LỜI CẢM ƠN Sau thời gian học tập thực đề tài luận văn tốt nghiệp, đến hoàn thành luận văn thạc sĩ chuyên ngành Điện khí hóa sản xuất nông nghiệp nông thôn với đề tài: "Thiết kế hệ thống giám sát điều khiển trình bảo quản nông sản dạng hạt" Trước hết, Tôi xin chân thành cảm ơn Viện đào tạo Sau đại học, Khoa Cơ Điện, Bộ môn Điện kỹ thuật, Trường Đại học nông nghiệp - Hà Nội tận tình giúp đỡ suốt trình học tập thực đề tài nghiên cứu khoa học Tôi xin bày tỏ lòng biết ơn đến người thân gia đình, bạn bè đồng nghiệp động viên, cổ vũ suốt trình học tập nghiên cứu khoa học Nếu giúp đỡ với cố gắng thân thu kết mong đợi Tôi xin chân thành cảm ơn! Hà Nội, ngày 30 tháng 10 năm 2011 Người cảm ơn Đào Văn Sơn 4 MỤC LỤC 5 ANH SÁCH HÌNH 6 DANH SÁCH BẢNG BIỂU 7 Giới thiệu đề tài Ngày nông nghiệp phát triển mạnh, sản phẩm tạo ngày phong phú nhu cầu lưu trữ hàng hóa kho lưu hàng nhiều Việc kiểm soát nhiệt độ, độ ẩm bảo quản, lưu trữ sản phẩm công - nông nghiệp kho chứa hàng quan trọng Thông thường với loại hàng hóa lưu trữ, nhiệt độ, độ ẩm phòng lưu trữ phải trì mức định Ở nước ta nhiều gian hàng bảo quản làm theo phương pháp thủ công cán kỹ thuật tiến hành đo đạc, sau đưa giải pháp để tăng giảm nhiệt độ, độ ẩm theo yêu cầu Cũng giống trên, phòng thí nghiệm, bệnh viện, nhà kính trồng cảnh, khu sản xuất rau kỹ thuật viên cần giám sát nhiệt độ, độ ẩm, ánh sáng Với phương pháp thủ công, nhiều thời gian công sức mà công việc lại không hiệu Cùng với phát triển mạnh mẽ công nghệ thông tin, đưa tự động hóa vào ngõ ngách sống Chính thế, định chọn đề tài: Thiết kế hệ thống giám sát điều khiển trình bảo quản nông sản dạng hạt Với sản phẩm chế tạo đo nhiệt độ, độ ẩm thu thập liệu máy tính, từ đưa biện pháp xử lý thích hợp Không giống thiết bị đo nhiệt độ, độ ẩm thông thường, sản phẩm không đơn thiết bị hiển thị số liệu đo mà kết nối với thành mạng truyền nhận liệu từ máy tính theo chuẩn RS-485 Với máy tính PC, người điều hành giám sát nhiều điểm đo khác diện rộng Đặc biệt kho tàng cất giữ hàng hóa, thóc gạo, điểm bảo quản máy móc, vũ khí, đạn dược v.v vấn đề đo nhiệt độ, độ ẩm môi trường không khí cần thiết Đa số đầu đo, thiết bị đo nhiệt độ độ ẩm có tính thông minh hành sử dụng số chip vi xử lý phần mềm để thiết bị có số chức tự chỉnh định suy diễn Các hệ thống đo truyền xa thường lấy chuẩn truyền tương tự 4-20mA, 0-10V truyền số theo chuẩn nối tiếp RS232/RS485 Các thiết bị đầu đo mua nước ngoài, giá thành cao Với giới hạn đề tài, nghiên cứu thiết kế chế tạo thiết bị đo nhiệt độ, độ ẩm đưa giải pháp kết nối thiết bị với giao diện giám sát điều khiển theo chuẩn RS485, lựa chọn sau: - Chúng lựa chọn chip ATmega16 thuộc họ AVR sản phẩm công ty Atmel (Na uy) sản xuất để phát triển thiết bị đo nhiệt độ, độ ẩm ATmega16 có khả xử lý hỗn hợp liệu tương tự số Nó cho ta khả phát triển sản phẩm nhanh, dễ dàng mở rộng chức sau Công nghệ cho nhiều giải pháp lựa chọn hỗ trợ cho đa dạng ứng dụng từ đo lường, xử lý, điều khiển, truyền thông, kết nối mạng chip với giá thành thấp - Lựa chọn chip sensor SHTxx hãng Sensirion để đo nhiệt độ, độ ẩm Đây chip có tiêu kỹ thuật giá phù hợp Có thể đặt tối đa nối mạng 32 thiết bị với máy tính Thiết bị hoạt động đơn giản: Tất thiết kế lập trình chip ATmega16 Thiết bị tự động lấy tín hiệu từ đầu đo, tính toán hiển thị thông số nhiệt độ, độ ẩm hình LCD Số liệu cập nhật truyền xa Khi cần lấy số liệu, người giám sát việc bật máy tính trung tâm vào chương trình để nhận số liệu từ hình LCD Ngoài ra, tự động lưu giữ thông tin đo vào sở liệu, giúp người quản lí biết điều chỉnh nhiệt độ kho thóc hệ thống quạt gió hút ẩm Ngoài việc đo nhiệt độ, độ ẩm kho thóc, sản phẩm tự động đo, kiểm tra thông số kho nông phẩm, dược phẩm, vũ khí, trang thiết bị công nghiệp bệnh viện, phòng thí nghiệm Mặt khác, hệ thống ứng dụng vào quy trình sản xuất nông nghiệp công nghệ cao như: tự động hoá tưới nhà kính trồng hoa, khu sản xuất rau sạch, trang trại trồng nấm Chương Kỹ thuật bảo quản nông sản dạng hạt 1.1 Phương pháp bảo quản nông sản dạng hạt 1.1.1 Phương pháp bảo quản trạng thái thoáng Bảo quản trạng thái thoáng để khối nông sản tiếp xúc dễ dàng với môi trường không khí bên nhằm điều chỉnh nhiệt độ, độ ẩm khối nông sản thích hợp Phương pháp thường áp dụng để bảo quản hạt Bảo quản trạng thái thoáng đòi hỏi phải có hệ thống kho vừa thoáng, vừa kín nhờ hệ thống thông hơi, thoáng gió hợp lý Khi nhiệt độ độ ẩm khối hạt cao so với không khí bên tiến hành thông gió tự nhiên hay cưỡng để tận dụng không khí khô lạnh bên vào Ngược lại, nhiệt độ độ ẩm không khí cao kho phải đóng kín kho để ngăn ngừa không cho không khí nóng ẩm thâm nhập vào kho Thông gió tự nhiên hoàn toàn lợi dụng thiên nhiên để thông gió, cách mở thông cửa kho không khí khô lạnh vào kho Đây phương pháp tương đối đơn giản, rẻ tiền phải tính toán nắm thời thông gió có lợi Thông gió cưỡng thổi luồng không khí qua khối hạt, nhờ làm thay đổi độ ẩm, nhiệt độ thành phần khí có hạt Để đạt mục đích làm giảm độ ẩm nhiệt độ hạt, lượng không khí thổi vào kho phải thỏa mãn điều kiện sau: - Không khí phải không làm ô nhiễm khối hạt - Cần đảm bảo đủ lượng không khí để thực mục đích giảm nhiệt độ độ ẩm - Chỉ thổi không khí vào khối hạt độ ẩm tương đối không khí trời thấp nghĩa sau thổi khí độ ẩm khối hạt giảm xuống - Không khí phải quạt toàn khối hạt Nếu không chỗ không quạt đủ yêu cầu độ ẩm hạt cao lại thêm lượng ret = TRUE Request_Read(m_slave,FUNC_READ_CUR_HUD,TIME_OUT); Sleep(20); if(TRUE != ret){ MessageBox("Connecting isn't successful!","Notice",MB_OK); }else{ MessageBox("Connecting successful!","Notice",MB_OK); UpdateData(FALSE); SetTimer(ID_CLOCK_TIMER,m_time,NULL); SetDlgItemText(IDC_BUTTON_CONNECT1,"Disconnect"); GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(TRUE); m_connect1 = 1; & // Mode fan and status fan GetDlgItem(IDC_STATIC_FANMODE1)->EnableWindow(TRUE); SetDlgItemText(IDC_STATIC_FANMODE1,"Mode: Auto"); GetDlgItem(IDC_STATIC_STATUSFAN1)->EnableWindow(TRUE); SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Not defined"); if(m_fan){ //if(TRUE == Request_Set(m_slave,FUNC_SET_FAN,0,TIME_OUT)){ SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan Off"); //m_fan = 1; //} }else{ //if(TRUE==Request_Set(m_slave,FUNC_SET_FAN,1,TIME_O UT)){ SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan On"); //m_fan = 0; //} } // } }else{ SetDlgItemText(IDC_BUTTON_CONNECT1,"Connect"); GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(FALSE); KillTimer(ID_CLOCK_TIMER); m_temperature_cur = 0; m_hudimity_cur = 0; UpdateData(FALSE); m_connect1 = 0; // mode fan an status fan GetDlgItem(IDC_STATIC_FANMODE1)->EnableWindow(FALSE); SetDlgItemText(IDC_STATIC_FANMODE1,"Mode: Not defined"); GetDlgItem(IDC_STATIC_STATUSFAN1)->EnableWindow(FALSE); SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Not defined"); m_mode1=0; // } } BOOL CSonDataBaseView::Wait_Respond_Slave(SLAVE_ADD slave_request,CMD_FUNC command_func, char *sRxBuf,DWORD *rcvsize,DWORD timeout) { char temp_buf[BUFFER_BYTE]; char data_buf[BUFFER_BYTE]; DWORD data_count=0; DWORD recv_size=0; char rChar; DWORD i=0; DWORD j=0; DWORD slave_add=0; DWORD slave_add_count=0; char slave_add_buf[2]; DWORD func=0; DWORD func_count=0; char func_buf[2]; DWORD datasize=0; DWORD datasize_count=0; char datasize_buf[2]; DWORD dwRead=0; CMD_FUNC cmd_func; COM_STATE state=RX_INIT; DWORD pre_time,cur_time; pre_time = GetTickCount(); m_port.SetRTS(); { if(0 < m_port.Read(&rChar,1)){ temp_buf[dwRead]=rChar; dwRead++; break; }else{ cur_time = GetTickCount(); if((cur_time - pre_time) > timeout){ m_port.ClearReadBuffer(); return FALSE; } } } while (1); pre_time = GetTickCount(); //m_port.SetRTS(); do{ if(0 < m_port.Read(&rChar,1)){ temp_buf[dwRead]=rChar; dwRead++; }else{ cur_time = GetTickCount(); if((cur_time - pre_time) > timeout){ m_port.ClearReadBuffer(); //return FALSE; return FALSE; } } }while(rChar!='@'); for(j=0;j=2){ slave_add = atoi(slave_add_buf); if(slave_add == slave_request){ state = RX_FUNCTION; } else{ state = RX_INIT; } }else{ state = RX_SLAVEADD; } } }else if(state == RX_FUNCTION){ if(FALSE == Check_Valid(rChar)){ state = RX_INIT; }else{ func_buf[func_count++] = rChar; if(func_count>=2){ state = RX_DATASIZE; }else{ state = RX_FUNCTION; } } datasize_count = 0; }else if(state == RX_DATASIZE){ if(FALSE == Check_Valid(rChar)){ state = RX_INIT; }else{ datasize_buf[datasize_count++] = rChar; if(datasize_count>=2){ recv_size = atoi(datasize_buf); if(recv_size == 0){ state = RX_FINISH; }else{ state = RX_DATA; } data_count=0; }else{ state = RX_DATASIZE; } } }else if (state == RX_DATA){ data_buf[data_count] = rChar; state = RX_DATA; data_count++; if(data_count >= recv_size){ state = RX_FINISH; } if(FALSE == Check_Valid(rChar)){ state = RX_INIT; } }else if((state==RX_FINISH)&&(rChar==PACKET_STOP)){ for(data_count=0;data_count '9' ) ) { return FALSE; } return TRUE; } BOOL CSonDataBaseView::Request_Read(int slave_address,CMD_FUNC cmd_func,int timeout) { // Build packet to send CString request; CString start_sym=":"; CString slave_add; CString datasize; CString func; CString stop_sym="!\r\n"; char rcv_buf[BUFFER_BYTE]; DWORD size_res=0; slave_add.Format("%02d",slave_address); func.Format("%02d",cmd_func); datasize.Format("%02d",0); request = start_sym + slave_add + func + datasize + stop_sym; char * pBuffer = (char *)(LPCTSTR)request; m_port.ClearRTS(); m_port.Write(pBuffer, static_cast(strlen(pBuffer))); if(TRUE != Wait_Respond_Slave(slave_address,cmd_func,rcv_buf,&size_res,timeout)){ MessageBox("Can't connect to slave !!! Reading Error","Timeout",MB_OK); return FALSE; } Parse_packet(rcv_buf,size_res,cmd_func); return TRUE; } BOOL CSonDataBaseView::Request_Set(int data_out, int timeout) { // Build packet to send CString request; CString start_sym=":"; CString slave_add; CString datasize; CString func; CString data; CString stop_sym="!\r\n"; char rcv_buf[BUFFER_BYTE]; DWORD size_res=0; slave_address,CMD_FUNC slave_add.Format("%02d",slave_address); func.Format("%02d",cmd_func); data.Format("%03d",data_out); datasize.Format("%02d",strlen((LPCTSTR)data)); request = start_sym + slave_add + func + datasize + data + stop_sym; char * pBuffer = (char *)(LPCTSTR)request; m_port.ClearRTS(); m_port.Write(pBuffer, static_cast(strlen(pBuffer))); Sleep(5); cmd_func,int if(TRUE Wait_Respond_Slave(slave_address,cmd_func,rcv_buf,&size_res,timeout)){ MessageBox("Can't connect to slave !!! Setting Error","Timeout",MB_OK); return FALSE; } Parse_packet(rcv_buf,size_res,cmd_func); != return TRUE; } BOOL CSonDataBaseView::Parse_packet(char cmd_func) { *packet, int data_size,CMD_FUNC switch(cmd_func){ case FUNC_READ_CUR_TEMP: m_temperature_cur = atoi(packet); break; case FUNC_READ_CUR_HUD: m_hudimity_cur = atoi(packet); break; case FUNC_READ_THRESH_TEMP: m_temp_thresh = atoi(packet); break; case FUNC_READ_THRESH_HUD: m_hud_thresh = atoi(packet); break; case FUNC_SET_THRESH_TEMP: m_temp_set_res = atoi(packet); break; case FUNC_SET_THRESH_HUD: m_hud_set_res = atoi(packet); break; case FUNC_SET_FAN: //m_temp_set_res = atoi(packet); break; case FUNC_SET_FAN_MODE: //m_hud_set_res = atoi(packet); break; } UpdateData(FALSE); return TRUE; } void CSonDataBaseView::OnBnClickedButtonOpenport() { // TODO: Add your control notification handler code here m_port.Open(1, 19200, CSerialPort::NoParity, 8, CSerialPort::NoFlowControl); m_port.Set0ReadTimeout(); m_port.SetMask(EV_RXCHAR|EV_CTS); CSerialPort::OneStopBit, GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(TRUE); //GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_CONNECT1)->EnableWindow(TRUE); //GetDlgItem(IDC_BUTTON_CONNECT2)->EnableWindow(TRUE); SetTimer(ID_CLOCK_TIMER2,1000,NULL); } void CSonDataBaseView::OnBnClickedButtonCloseport() { // TODO: Add your control notification handler code here m_port.Close(); GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SETTING3)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_CONNECT1)->EnableWindow(FALSE); //GetDlgItem(IDC_BUTTON_CONNECT2)->EnableWindow(FALSE); //KillTimer(ID_CLOCK_TIMER); m_temperature_cur = 0; m_hudimity_cur = 0; KillTimer(ID_CLOCK_TIMER2); UpdateData(FALSE); } void CSonDataBaseView::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default BOOL ret = TRUE; CString data_out; CString m_sDateTime; int record_count=0; switch (nIDEvent) { case ID_CLOCK_TIMER: m_com_busy = TRUE; KillTimer(ID_CLOCK_TIMER); ret = TRUE & Request_Read(m_slave,FUNC_READ_CUR_TEMP,TIME_OUT); Sleep(20); ret = TRUE & Request_Read(m_slave,FUNC_READ_CUR_HUD,TIME_OUT); Sleep(20); if(ret == TRUE){ UpdateData(TRUE); m_sDateTime=m_sNgay+_T("_")+m_sGio;//Tao mot gia tri thoi gian gom co gio UpdateData(FALSE); m_pSet->MoveFirst(); while(! m_pSet->IsEOF()) { m_pSet->MoveNext(); record_count++; } m_pSet->AddNew(); m_pSet->m_ID = record_count+1; m_pSet->m_Time = m_sDateTime; m_pSet->m_Temperature = m_temperature_cur; m_pSet->m_Humidity = m_hudimity_cur; m_pSet->Update(); m_pSet->Requery(); m_pSet->MoveLast(); UpdateData(FALSE); } SetTimer(ID_CLOCK_TIMER,m_time,NULL); m_com_busy = FALSE; break; case ID_CLOCK_TIMER2: UpdateData(TRUE); if(m_mode1 == 1){ GetDlgItem(IDC_BUTTON_FAN)->EnableWindow(TRUE); }else{ GetDlgItem(IDC_BUTTON_FAN)->EnableWindow(FALSE); //Request_Set(m_slave,FUNC_SET_FAN_AUTO,0,TIME_OUT ); } CTime curTime = CTime::GetCurrentTime(); m_sGio.Format("%02d:%02d:%02d", curTime.GetHour(),curTime.GetMinute(),curTime.GetSecond()); m_sNgay.Format("%02d/%02d/ %02d",curTime.GetDay(),curTime.GetMonth(),curTime.GetYear()); UpdateData(FALSE); break; } CRecordView::OnTimer(nIDEvent); } void CSonDataBaseView::OnBnClickedButtonSetting() { // TODO: Add your control notification handler code here CString data_out; CString temp; BOOL ret = TRUE; GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(FALSE); //while(m_com_busy != FALSE); GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(TRUE); KillTimer(ID_CLOCK_TIMER); m_settingdlg1.m_temp_thresh1 = m_temp_thresh; m_settingdlg1.m_hud_thresh1 = m_hud_thresh; m_settingdlg1.m_samp_time = m_time; m_settingdlg1.m_mode1 = m_mode1; UpdateData(FALSE); if(IDOK == m_settingdlg1.DoModal()){ UpdateData(TRUE); ret = TRUE & Request_Set(m_slave,FUNC_SET_THRESH_TEMP,m_settingdlg1.m_temp_thresh1,TIME_ OUT); Sleep(20); ret = TRUE & Request_Set(m_slave,FUNC_SET_THRESH_HUD,m_settingdlg1.m_hud_thresh1,TIME_O UT); Sleep(20); ret = TRUE & Request_Set(m_slave,FUNC_SET_FAN_MODE,m_mode1,TIME_OUT); Sleep(20); if(m_temp_set_res != m_settingdlg1.m_temp_thresh1){ MessageBox("Can't set up temperature threshold Slave","Warning",MB_OK); }else if(m_hud_set_res != m_settingdlg1.m_hud_thresh1){ MessageBox("Can't set up humidity threshold Slave","Warning",MB_OK); }else if(ret){ m_temp_thresh = m_temp_set_res; m_hud_thresh = m_hud_set_res; UpdateData(FALSE); MessageBox("Setting param successful","Notice",MB_OK); } m_time = m_settingdlg1.m_samp_time; m_mode1 = m_settingdlg1.m_mode1; } SetTimer(ID_CLOCK_TIMER,m_time,NULL); for for // mode fan and status fan if(m_mode1==1) { SetDlgItemText(IDC_STATIC_FANMODE1,"Mode: Manual"); if(m_fan){ //if(TRUE == Request_Set(m_slave,FUNC_SET_FAN,0,TIME_OUT)){ SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan Off"); SetDlgItemText(IDC_BUTTON_FAN,"Fan On"); //m_fan = 1; //} }else{ //if(TRUE==Request_Set(m_slave,FUNC_SET_FAN,1,TIME_OUT)){ SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan On"); SetDlgItemText(IDC_BUTTON_FAN,"Fan Off"); } } else { SetDlgItemText(IDC_STATIC_FANMODE1,"Mode: Auto"); if(m_fan){ //if(TRUE == Request_Set(m_slave,FUNC_SET_FAN,0,TIME_OUT)){ SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan Off"); SetDlgItemText(IDC_BUTTON_FAN,"Fan On"); }else{ //if(TRUE==Request_Set(m_slave,FUNC_SET_FAN,1,TIME_O UT)){ SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan On"); SetDlgItemText(IDC_BUTTON_FAN,"Fan Off"); } } } void CSonDataBaseView::OnBnClickedButtonFan() { // TODO: Add your control notification handler code here GetDlgItem(IDC_BUTTON_FAN)->EnableWindow(FALSE); if(!m_fan){ if(TRUE == Request_Set(m_slave,FUNC_SET_FAN,0,TIME_OUT)){ SetDlgItemText(IDC_BUTTON_FAN,"Fan On"); // fan status SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan Off"); // m_fan = 1; } }else{ if(TRUE==Request_Set(m_slave,FUNC_SET_FAN,1,TIME_OUT)){ SetDlgItemText(IDC_BUTTON_FAN,"Fan Off"); // fan status SetDlgItemText(IDC_STATIC_STATUSFAN1,"Status: Fan On"); // m_fan = 0; } } GetDlgItem(IDC_BUTTON_FAN)->EnableWindow(TRUE); } Chương trình sở liệu: // DatabaseDlg.cpp : implementation file #include "stdafx.h" #include "SonDataBase.h" #include "DatabaseDlg.h" IMPLEMENT_DYNAMIC(CDatabaseDlg, CDialog) CDatabaseDlg::CDatabaseDlg(CWnd* pParent /*=NULL*/) : CDialog(CDatabaseDlg::IDD, pParent) { } CDatabaseDlg::~CDatabaseDlg() { } void CDatabaseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_listview); } BEGIN_MESSAGE_MAP(CDatabaseDlg, CDialog) //ON_BN_CLICKED(IDC_BUTTON_DELETE, &CDatabaseDlg::OnBnClickedButtonDelete) ON_BN_CLICKED(IDOK, &CDatabaseDlg::OnBnClickedOk) END_MESSAGE_MAP() void CDatabaseDlg::Listview() { m_listview.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES| LVS_EX_HEADERDRAGDROP); m_listview.InsertColumn(0, _T("No"), LVCFMT_LEFT, 80); m_listview.InsertColumn(1, _T("Time"), LVCFMT_CENTER, 180); m_listview.InsertColumn(2, _T("Temperature"), LVCFMT_CENTER, 80); m_listview.InsertColumn(3,_T("Humidity"),LVCFMT_CENTER,80); CDatabase aDB; try { aDB.OpenEx(_T("DSN=Dbdt")); CRecordset aRS(&aDB); aRS.Open(CRecordset::forwardOnly,_T("SELECT Temp_Hud_Sampling1 a order by a.ID asc")); while(! aRS.IsEOF()) { CString strValue; aRS.GetFieldValue(short(0), strValue); m_listview.InsertItem(0,strValue); aRS.GetFieldValue(short(1), strValue); m_listview.SetItemText(0 ,1,strValue); aRS.GetFieldValue(short(2), strValue); m_listview.SetItemText(0 ,2,strValue); aRS.GetFieldValue(short(3), strValue); m_listview.SetItemText(0 ,3,strValue); aRS.MoveNext(); } aRS.Close(); aDB.Close(); } catch(CDBException * ex) { TCHAR buf[255]; ex->GetErrorMessage(buf, 255); CString strPrompt(buf); AfxMessageBox(strPrompt); * FROM } } BOOL CDatabaseDlg::OnInitDialog() { CDialog::OnInitDialog(); Listview(); return TRUE; // return TRUE unless you set the focus to a control } void CDatabaseDlg::OnBnClickedOk() { OnOK(); } Chương trình vẽ đồ thị: // GraphDlg.cpp : implementation file #include "stdafx.h" #include "SonDataBase.h" #include "GraphDlg.h" IMPLEMENT_DYNAMIC(CGraphDlg, CDialog) CGraphDlg::CGraphDlg(CWnd* pParent /*=NULL*/) : CDialog(CGraphDlg::IDD, pParent) { } CGraphDlg::~CGraphDlg() { } void CGraphDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CGraphDlg, CDialog) ON_WM_PAINT() END_MESSAGE_MAP() BOOL CGraphDlg::OnInitDialog() { CDialog::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control } void CGraphDlg::OnPaint() { CPaintDC dc(this); // device context for painting LONG data_count=0; // TODO: Add your message handler code here CString str; CBrush lBrush(RGB(255,255,255));//200 CBrush* pOldBrush=dc.SelectObject(&lBrush); dc.Rectangle(25,10,525,310); CFont font2; font2.Detach(); font2.CreateFont(18,0,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFA ULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,".TimeNewRoman"); CFont *pOldFont2=(CFont*)(dc.SelectObject(&font2)); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(RGB(0,0,0)); str="0"; dc.TextOut(7,300,str); str="20"; dc.TextOut(5,240,str); str="40"; dc.TextOut(5,180,str); str="60"; dc.TextOut(5,120,str); str="80"; dc.TextOut(5,60,str); str="100"; dc.TextOut(0,0,str); //str="Temperature/Humidity"; //dc.TextOut(15,10,str); str="Time"; //dc.TextOut(480,310,str); dc.TextOut(260,312,str); str="===>>>"; dc.TextOut(475,310,str); str="Temperature"; dc.TextOut(20,335,str); str="Humidity"; dc.TextOut(200,335,str); ///////////////////////////////////////////// CPen lDotPen(PS_DOT,1,RGB(0,0,0)); CPen *pOldpenD=dc.SelectObject(&lDotPen); //Ve luoi toa //dc->MoveTo(190,430); int j=1; for(j=1;j[...]... nhiệt độ: cắn hạt giòn, đanh, cảm giác bàn tay lúa lạo xạo => Độ ẩm ... (Half - duplex) trạm có quyền truy nhập bình đẳng Bus Hình 2.27 Cấu hình RS 485 dây Hình 2. 28 Cấu hình RS 485 dây RS 485 chuẩn hoàn chỉnh, chuẩn đặc tính điện học nên không đưa quy định cho cáp... (IEEE8-2.4) Trong mạng có cấu trúc Bus, ứng dụng phương pháp token người ta gọi Token bus, sơ đồ nguyên lý phương pháp truy cập trình bày hình 2.11 Hình 2.11 Phương pháp truy nhập Token bus(IEEE802.5)... DTE máy tính, PLC, máy in Thiết bị truyền số liệu DCE Modem) Kết nối DTE DCE thể hình 2. 18 Hình 2. 18 Kết nối DTE DCE - RS232 sử dụng phương thức truyền số liệu không đối xứng Điện áp dao động