久久久91-久久久91精品国产一区二区-久久久91精品国产一区二区三区-久久久999国产精品-久久久999久久久精品

ABB
關注中國自動化產業(yè)發(fā)展的先行者!
橫河電機25年9月
工業(yè)智能邊緣計算2025年會
2025工業(yè)安全大會
CAIAC 2025
OICT公益講堂
當前位置:首頁 >> 案例 >> 案例首頁

案例頻道

基于多線程的氣象傳感器數(shù)字網絡化系統(tǒng)
  • 企業(yè):控制網     領域:PLC /PAC/PCC/RTU     行業(yè):建筑樓宇    
  • 點擊數(shù):1609     發(fā)布時間:2007-08-08 11:18:36
  • 分享到:
闡述了一種基于多線程串口通信的遠程氣象監(jiān)控系統(tǒng)的設計和實現(xiàn)方法,討論了在系統(tǒng)設計和實現(xiàn)時所遇到的難點和解決方法,并較為詳盡地分析了系統(tǒng)在實現(xiàn)中所涉及關鍵技術:多線程處理技術、串行通信、數(shù)據(jù)庫訪問技術和socket通信技術。



1.引言

    隨著計算機技術、通信技術和數(shù)據(jù)處理技術的發(fā)展,利用計算機實現(xiàn)生成過程的自動化成為了提高生產力、減輕勞動強度的有效手段。其中對周圍環(huán)境氣象數(shù)據(jù)的實時監(jiān)控不僅與人們的生活息息相關,而且對工業(yè)生產中設備的正常運作也起到至關重要的作用。鑒于串行通信是計算機與其他設備進行數(shù)據(jù)交換時經常使用的方法之一,它具有實現(xiàn)簡單,使用靈活方便,數(shù)據(jù)傳輸可靠等優(yōu)點,因此基于串口通信技術,構建一個多線程的氣象監(jiān)控系統(tǒng)是有十分有必要的。

    本文采用串口通信的方式接收由溫度、濕度傳感器采集到當前環(huán)境參數(shù),利用Visual C++ 6.0提供的Windows API實現(xiàn)對串口的控制,采用多線程以及雙緩沖隊列技術可以實時獲取采集數(shù)據(jù)、本地存儲采集處理;同時還利用Socket通信技術使采集數(shù)據(jù)傳送到遠程監(jiān)控中心,進行數(shù)據(jù)分析濾波處理以及數(shù)據(jù)庫的存儲,并繪制出相應的P—T曲線。

2.軟件系統(tǒng)設計方案

    本系統(tǒng)由本地采集計算和遠程監(jiān)控中心構成一個C/S結構監(jiān)控系統(tǒng)。在環(huán)境惡劣的工業(yè)現(xiàn)場,無法進行人為的實時監(jiān)控,由硬件設備采集環(huán)境氣象參數(shù)首先發(fā)送給本地計算機,然后傳送給遠程監(jiān)控中心進行處理。本地采集計算機利用Visual C++ 6.0提供的Windows API實現(xiàn)對串口的操作。主要包括串口通信、設備控制、數(shù)據(jù)存儲等模塊,操作方便,人機界面簡單清晰。在應用過程中,首先需要設定串口配置參數(shù),如波特率、數(shù)據(jù)位、奇偶校驗等,串口初始化后,程序開始運行,采集到的數(shù)據(jù)同時被保存在擴展名為.txt文件中。然后通過Socket的通信方式把采集到的數(shù)據(jù)傳送給遠程監(jiān)控中心,由它來進行數(shù)據(jù)在數(shù)據(jù)庫中的存儲,以及數(shù)據(jù)平滑濾波處理,并繪制出P—T曲線。整個系統(tǒng)實現(xiàn)流程如圖1所示。
  
3.程序設計思想

    當前,一般的MCU都內置了串口的硬件控制模塊,用戶通過查詢和中斷的方法編寫比較簡單的控制程序就可以使用串口通信。但是,本系統(tǒng)要求在接收數(shù)據(jù)采集設備發(fā)送大量數(shù)據(jù)的同時完成對己接收到數(shù)據(jù)的實時存儲,如何處理好二者之間的關系,保證不會造成數(shù)據(jù)的缺失和程序的崩潰是程序設計的一個難點。本文重點對串口通信程序進行了改進,盡量做到不因為串口通信影響整個系統(tǒng)的性能。

    Window的最大特征之一是設備無關性,使得Window程序員不用對硬件直接進行操作。利用Window的SDK提供完備的API函數(shù)和以中斷方式驅動的通信程序,可以更加簡化串口通信編程。而且Window系統(tǒng)是搶先式的多任務操作系統(tǒng),使得應用程序能夠同時執(zhí)行多個任務,即在一個進程中可以同時運行多個線程,系統(tǒng)可以不停的在多個線程之間切換。所以在串行通訊程序中應用多線程就可以簡化應用程序的結構,把一些復雜的運算放在后臺并行執(zhí)行,從而大大提高應用程序的響應實時能力。

    串口通信程序的輸出與輸入是兩個需要并發(fā)執(zhí)行的操作。如果由主線程獨自完成所有的工作,即在的單線程情況下,程序可能會不定期地鎖定。因此,為了具備實時響應的能力和提高程序的效率,本文的串口通信程序程序設計如圖2所示。



 圖2 串口程序設計示意圖

    應用程序創(chuàng)建了輸出與輸入兩個子線程共同完成通信任務。而又由于串口發(fā)送和接收的數(shù)據(jù)是相對獨立的,故可將其分開,設置兩個緩沖區(qū),一個是發(fā)送緩沖區(qū)m_TxQueue,另一個是接收緩沖區(qū)m_RxQueue,并為每個緩沖區(qū)分別設置兩個指針,一個指向輸出線程將要發(fā)送的數(shù)據(jù),另一個指向輸入線程將要從緩沖區(qū)讀取數(shù)據(jù)的起始位置。這種方式稱之為采用雙緩沖隊列的方法,保證了無關數(shù)據(jù)的順序操作。

    3.1 多線程的設計

    線程是進程內的一條執(zhí)行路徑.它包含獨立的堆棧和CPU寄存器。每個線程共享所有的進程資源,包括打開的文件、信號標識及動態(tài)分配的內存等等。一個進程內的所有線程使用同一個32位地址空間,而這些線程的執(zhí)行由系統(tǒng)調度程序控制,調度程序決定哪個線程可執(zhí)行和什么時候執(zhí)行線程。線程有優(yōu)先級別,優(yōu)先權較低的線程必須等到優(yōu)先權較高的線程執(zhí)行完仃務后再執(zhí)行。在VC++6.0中的MFC應用程序的線程是由CwinThread對象來表示,該線程分::用戶界面線程(GUI-Thread)和工作者線程(Worker-Thread)。用戶界面線程能夠提供界面和用戶交互,用于處理用戶輸入和響應各種信息和事件;工作者線程沒有消息循環(huán),主要用來處理應用程序的后臺任務。本文所采用的串口操作線程即為工作者線程。程序通過調用AfxBejinThread()函數(shù)自動創(chuàng)建一個CwinThread對象,通過響應己設置好的一組事件句柄來啟動一個線程的執(zhí)行。

    3.1.1 輸出線程

    輸出線程比較簡單,它只為串口的寫操作創(chuàng)建一個OVERLAPPED結構,并設置一組事件的句柄。它可響應的事件有刪除線程事件、寫請求事件及中斷請求事件,然后線程進入主循環(huán),等待三個事件之一的發(fā)生,以便采取適當?shù)男袆?。例如當檢測到寫請求事件時,表明輸出緩沖區(qū)內有一些數(shù)據(jù)等待發(fā)送,輸出線程便會試圖發(fā)送傳送隊列中的所有數(shù)據(jù)。在寫操作進行時,如果端口比較忙就會進入重疊模式。此時WriteFile( )返回FALSE,用GetLastError( )可以發(fā)現(xiàn)當前錯誤是ERROR_ IO_ PENDING,意味著重疊I/O操作已經開始了。若是刪除線程消息到來,輸出線程將跳出循環(huán),關閉事件句柄,最后結束線程。

    3.1.2輸入線程

    輸入線程較為復雜一些,它既要處理串口數(shù)據(jù)的讀操作,又要處理串口狀態(tài)的讀取。而且由于輸入的數(shù)據(jù)是隨機到達的,所以輸入線程必須一直讀。輸入線程首先要創(chuàng)建兩個OVERLAPPED結構,用于讀數(shù)據(jù)和獲得通信事件,并為它們分別創(chuàng)建兩個事件。然后輸入線程要響應四個需要監(jiān)視的事件:刪除線程事件、讀信息事件、狀態(tài)信息事件和讀請求事件設置事件句柄。接著輸入線程便進入主循環(huán),直到刪除線程的消息到來才退出。只要輸入緩沖區(qū)有空間可用,輸入線程就會一直讀發(fā)送過來的數(shù)據(jù)。與輸出一樣,如果讀操作失敗了,而且返回的錯誤代碼是ERROR_ IO_ PENDING,意味著還在進行讀的重疊操作。輸入線程在等待數(shù)據(jù)輸入的同時,也在等待傳入的事件。在輸入線程里可以用SetCommMask( )函數(shù)建立事件掩模來監(jiān)視特定通信資源上的事件。如圖:



圖3 輸入線程示意圖

    在應用程序中,輸出線程只是簡單的一直調用WaitForMu1tip1e0bject()等待事件的發(fā)生,并以一個Switch Case語句為每個已發(fā)生事件提供處理方案。輸入線程的工作繁重許多,它分別調用ReadFile()和WaitCommEvent( )接收數(shù)據(jù)和通信狀態(tài)。如果接收到的是數(shù)據(jù),輸入線程將它保存到指定位置。如果是通信狀態(tài),輸入線程將它交給其它函數(shù)判斷狀態(tài)內容,指引程序下一步的活動。ReadFile()和WaitCommEvent ()都是在重疊模式下工作,其步驟與輸出線程相同。

    3.1.3 線程同步
   
    在串口通信程序中,輸入緩沖區(qū)和輸出緩沖區(qū)能夠被多個線程訪問。它們用于在程序的主線程和輸入、輸出線程之間傳送數(shù)據(jù)塊。當端口上出現(xiàn)一些操作時,主線程和輸入、輸出線程會經常訪問這兩個對象。如果兩個線程同時處理緩沖區(qū),就會產生不正確的數(shù)據(jù),這就破壞了數(shù)據(jù)的完整性。C++提供了信號量( Semaphore)、互斥對象(Mutex)、臨界區(qū)(Critical Section)等手段來保護這些數(shù)據(jù)對象,防止兩個線程在同一時間訪問同一數(shù)據(jù)。保持在同一個進程內的線程工作協(xié)調一致(線程同步)。其中,臨界區(qū)是一種保證在一個時間只有一個線程訪問數(shù)據(jù)集的非常簡單的方法。當你使用臨界區(qū),你就給了線程一個它們必須共享的對象。任何擁有臨界區(qū)對象的線程可以訪問被保護起來的數(shù)據(jù),其它線程必須等待直到第一個線程釋放了臨界區(qū)對象。此后其它線程可以按照順序搶占臨界區(qū)對象,訪問數(shù)據(jù)。因為線程只有擁有臨界區(qū)對象才能訪問數(shù)據(jù),而且在一個時刻只有一個線程可以擁有臨界區(qū)對象,所以決不會出現(xiàn)一個時刻有多個線程訪問數(shù)據(jù)的現(xiàn)象。

    考慮到本文所設計的通信緩沖區(qū)既不允許多個線程同時訪問,又不必供其它進程的線程訪問。因此,臨界區(qū)是串口通信程序多線程同步最有效的辦法。  
  
    3.2 雙緩沖隊列的設計
   
    為了提高效率,本文把緩沖區(qū)數(shù)據(jù)存儲在標準C++庫中的deque<char>對象中,它作為一種優(yōu)化的存儲容器支持元素的添加和刪除。它能高效地插入未知數(shù)量的對象,并且插入和刪除元素時系統(tǒng)的負擔很小。根據(jù)需要,本文創(chuàng)建了兩個獨立的緩沖區(qū)對象,一個是發(fā)送緩沖區(qū)m_TxQueue,另一個是接收緩沖區(qū)m_RxQueue,并將它們置于臨界區(qū)的保護下,就能確保一次只有一個線程處理緩沖區(qū)。本文所設計的類MThreadDeque提供了對緩沖區(qū)的各種操作,如Extract(),Clear(),Insert()等,每種操作開始和結束的時候都要調用::EnterCriticalSection( &m_Lock )和::LeaveCriticalSection( &m_Lock ),關鍵代碼如下:

class MThreadDeque
{
protected :
    const m_iMaxSize;
    deque<char> m_Queue;
    CRITICAL_SECTION m_Lock;
public :
    MThreadDeque( int max_size ) : m_iMaxSize( max_size )
    {
        ::InitializeCriticalSection( &m_Lock );
    }   
    ~ MThreadDeque ()
    {
        ::DeleteCriticalSection( &m_Lock );
    }      
    int Insert( char c )
    {
        int return_value;
        ::EnterCriticalSection( &m_Lock );
        if ( m_Queue.size() < m_iMaxSize ) {
            m_Queue.push_back( c );
            return_value = c & 0xff;
        } else
            return_value = -1;
        ::LeaveCriticalSection( &m_Lock );
        return return_value;
    }
       ……
};
  
    3.3 網絡通信部分的設計

    當工業(yè)現(xiàn)場環(huán)境惡劣,不適合人為操作時,將硬件采集的數(shù)據(jù)傳送到遠程監(jiān)控中心進行分析和處理是十分有必要的。Socket套接字是目前最流行的網絡通信應用程序接口之一,利用它可以方便地實現(xiàn)局域網內的數(shù)據(jù)的傳輸,是開發(fā)客戶機/服務器網絡應用程序的重要方法。當向一個套接字寫入時,所送數(shù)據(jù)會自動出現(xiàn)在套接宇的另一端,另一端可能是相同機器上運行的另一個進程,也可能是世界上任何地方互連的一臺計算機。TCP/IP傳輸層有兩個并列的協(xié)議:T C P ( Transport Contro1 Protocol)和UDP(User Datagram Protocol)其中TCP是面向連接的,UDP是無連接的,Socket同時支持這兩種通信模式,所對應的Socket分別為數(shù)據(jù)流Socket和數(shù)據(jù)報Socket。數(shù)抓流Socket定義了一種可靠的面向連接的服務,實現(xiàn)無差錯、無重復的順序數(shù)據(jù)傳輸;數(shù)據(jù)報Socket定義了一個無連接的服務,數(shù)據(jù)通過相互獨立的包進行傳輸,包的傳輸是無序,并且不保證是否出錯、丟失和重復。本文采用了流式Socket來實現(xiàn)遠程數(shù)據(jù)傳輸,工作過程如圖4所示。
 



 圖4 Socket通信流程圖

    3.4 VC與Sql Sever數(shù)據(jù)庫的數(shù)據(jù)交換

    VC提供一些接口,可以處理數(shù)據(jù)庫操作,主要有:開放式數(shù)據(jù)庫連接(ODBC) ,OLE DB、ActiveXDataObject( ADO )等。ADO基于通用對象組件模型(COM),操作靈活,代碼添加少,本系統(tǒng)采用ADO操作Sql server2000數(shù)據(jù)庫,主要包括四個基本步驟:

    ①COM庫的初始化,用#import指令引入ADO庫定義文件;

    ② 創(chuàng)建Connection對象指針,并用其連接Sql server2000數(shù)據(jù)庫,本文通過DSN數(shù)據(jù)源對數(shù)據(jù)庫進行連接,代碼如下:

    m_pConnection->Open("Datasource=adotest;UID=sa;PWD=;","","",adModeUnknown)。

    ③利用建立好的連接,通過Connection、Command對象執(zhí)行SQL命令,進行創(chuàng)建表、添加記錄、添加字段等操作,或利用Recordset對象取得結果記錄集進行查詢、處理;

    ④使用完畢后關閉連接釋放對象。

    有了以上基礎,就可以方便的把采集來的數(shù)據(jù)按照制定的順序存放在Sql Server數(shù)據(jù)中,可以完成對數(shù)據(jù)進行快速查詢、瀏覽和刪除等工作。

4.結論
   
    氣象數(shù)據(jù)能夠進行可靠和實時的采集和通信是本系統(tǒng)實現(xiàn)的的關鍵所在。在系統(tǒng)的實現(xiàn)過程中,遇到許多技術問題,如通信的可靠性、多線程之間的互斥與同步、突發(fā)性數(shù)據(jù)處理與計算機響應速度之間的協(xié)調和系統(tǒng)性能問題等,其中有些問題只能在現(xiàn)場調試的過程中發(fā)現(xiàn)并加以解決。本系統(tǒng)的實現(xiàn)為氣象監(jiān)控系統(tǒng)的更進一步發(fā)展提供了參考,同時對于實現(xiàn)工業(yè)監(jiān)控系統(tǒng)的集成化、自動化具有極大的推進作用。

參考文獻:

    [1]李現(xiàn)勇. Visual C++串口通信技術與工程實踐[M].北京:人民郵電出版社,2002

    [2]汪翔,袁輝.Visual C++實踐與提高一網絡編程篇[M].北京:中國鐵道出版社,2001:167-186

    [3] 徐軍譯.Visual C++開發(fā)人員指南[M],北京:機械工業(yè)出版社,1998

    [4] 潘愛民.VC++技術內幕(第四版)[M].北京:清華人學出版社,1997.
    
   
Remote Weather Date Acquisition System 

    Based On Multi-thread Serial Communication Technology

    YAO lan1,GUI xun2

    (1.Department of Control Engineering, ChengDu University of Information Technology Sichuan ,610225,China)

    (2.School of Electrical Engineering, Southwest Jiao tong University, Sichuan, 610031,China)

    Abstract: The paper introduces one of remote weather data acquisition system which is designed and implemented based on multi-thread serial communication technology. With discussing the key problem and solution of this system at the stage in designing and implementing, the paper gives a elaborate analysis of multi-thread processing technology, serial communication, database accessing technology and Socket communication technology.
Key words: multi-thread, serial communication, database, Socket

    姚蘭1,桂勛2

    (1.成都信息工程學院控制工程系 成都 610225)

    (2.西南交通大學電氣工程學院  成都  610031)

熱點新聞

推薦產品

x
  • 在線反饋
1.我有以下需求:



2.詳細的需求:
姓名:
單位:
電話:
郵件:
主站蜘蛛池模板: 国产大乳喷奶水在线看| 亚洲毛片在线看| 国产精品亚洲专区一区| 国产成人综合网| 麻豆精品密在线观看| 亚洲欧美日韩第一页| 一级片亚洲| 日本成人一级| 亚洲欧美久久久久久久久久爽网站| 欧美成人久久| 国产亚洲欧美ai在线看片| 爱爱小视频免费体验区在线观看| 国产v亚洲v欧美v专区| 久久免费视频播放| 日本内谢69xxxx免费播放| 亚洲视频二区| 亚洲综合站| 好叼操这里只有精品| 欧洲黄色网| 国产在线自在拍91精品黑人| 狼色视频在线观看| 精品一区二区三区视频| 国产观看精品一区二区三区| 久久精品人人做人人爽| 碰碰97| 亚洲免费高清| 在线观看www日本免费网站| jizz中国zz女人18| 人成精品视频三区二区一区| 久在线| 五月天色丁香| 日韩一级二级三级| 日韩精品免费| 中国美女一级毛片| 亚色一区| 亚洲人和日本人jizz| 亚洲香蕉在线观看| 亚洲最大的黄色网| 亚洲最大的黄色网| 亚洲国产成人在线| 国产一级 黄 片|