技術頻道

      力控組態(tài)軟件下的設備驅動程序開發(fā)

      作 者 :華中科技大學 控制科學與工程系 吳力煒 葉念渝
        
        關鍵詞: 組態(tài)軟件 設備驅動程序 RS-485串行通信
        
        1 引言
        組態(tài)軟件設備驅動程序用于提供了連接計算機硬件的軟件接口,在裝入后成為操作系統(tǒng)內核的—部分,也就是說它成為操作系統(tǒng)的信任部分。因此,任何設備驅動程序的細小錯誤都可能引起操作系統(tǒng)的崩潰,要避免這樣的事情發(fā)生,只有反復測試所寫的代碼,遵循編寫驅動程序的規(guī)則。
        最簡單的方法是購買現(xiàn)成的驅動程序來直接處理我們的設備,但這樣的驅動程序存在連接與嵌入錯誤的風險。另外,可以通過修改各種商業(yè)通用驅動程序與許多簡單的設備打交道。如果自己編寫驅動程序的話,盡量使用某個標準的總線驅動程序或者類驅動程序,因為它們通常實現(xiàn)了我們所需要的大量功能。如果設備只有一個專門的用途,則為它編寫一個單一驅動程序來處理所有設備的請求可能是最簡單的解決方案。
        三維力控組態(tài)軟件提供了力控I/O驅動程序接口軟件開發(fā)工具包FIOS SDK,F(xiàn)IOS SDK提供了標準的開發(fā)接口,開發(fā)人員僅需要根據(jù)I/O設備的具體通信協(xié)議或驅動接口說明,填寫幾個掃描函數(shù)的實現(xiàn)代碼,進行必要的調試與測試,即可完成一種FIOS的開發(fā)。
        
        2 課題背景
        目前筆者接手的項目是X機場助航燈光計算機監(jiān)控系統(tǒng)。當機場燈光實施II類運行時,其能見度在800m至400m之間,要求燈光設備可靠性高、故障少,但往往燈具在運行過程中產(chǎn)生故障是隨機的,其故障率達到某一個值時,將不能滿足II類運行要求[1][2]。為保證監(jiān)控系統(tǒng)運行的穩(wěn)定性和可靠性,采用雙機容錯模式與力控工業(yè)控制組態(tài)軟件相結合的方法,通過硬件冗余、軟件組態(tài)的可靠設計、Visual C++與力控組態(tài)軟件的結合,并以RS-485總線作為網(wǎng)絡連接線,實現(xiàn)分布式的數(shù)據(jù)庫配置,設計了基于力控組態(tài)環(huán)境的雙機容錯系統(tǒng)。開發(fā)此系統(tǒng)的任務之一,就是自主開發(fā)驅動程序,將自定義的通信協(xié)議寫入驅動程序之中。而三維力控組態(tài)軟件提供了I/O驅動程序接口開發(fā)工具包(FIOS SDK),因此,開發(fā)驅動的主要工作就是利用組態(tài)軟件提供的接口函數(shù)和輸入輸出類庫編寫Ioapi中的代碼,以達到I/O設備的控制要求[3]。由于此項目的開發(fā)在Visual C++ 6.0環(huán)境中進行,學習Windows WDM驅動程序設計對于深入理解內核態(tài)驅動程序開發(fā)、編寫相應的接口程序也很有幫助。
        
        3 開發(fā)工具——FIOS SDK簡介[5][6]
        FIOS SDK開發(fā)環(huán)境完全基于32位Windows平臺。它使用動態(tài)鏈接庫(DLL)技術將開發(fā)人員開發(fā)的代碼整合到力控組態(tài)
        軟件系統(tǒng)中。FIOS SDK提供給程序員的開發(fā)接口為API函數(shù)和C++類庫。
        FIOS SDK主要由4部分組成:設備組態(tài)接口(Iodevcfg)、數(shù)據(jù)連接組態(tài)接口(Ioitemui)、I/O監(jiān)控接口Ioapi和I/O服務器程序Ioserver。其中,Iodevcfg:負責管理設備組態(tài)過程;Ioitemui:負責管理數(shù)據(jù)連接組態(tài)過程;Ioapi:負責完成與I/O設備間的數(shù)據(jù)交換,實現(xiàn)對設備的監(jiān)控過程,包括:對通信協(xié)議的解析、數(shù)據(jù)格式的轉換等;Ioserver:由FIOS SDK提供,用于完成對Ioapi 的動態(tài)裝載,調用并執(zhí)行Ioapi實現(xiàn)的導出函數(shù)。它封裝了大部分開發(fā)人員不必關心的技術細節(jié),如完成與I/O設備的底層通信(串口通信、網(wǎng)絡通信等)、設備超時處理、設備故障診斷等。Ioserver還完成與實時數(shù)據(jù)庫DB之間的通信,它把從I/O設備采集到的數(shù)據(jù)經(jīng)Ioapi解析轉換后提交給DB,或者將DB下置給I/O設備的數(shù)據(jù)經(jīng)Ioapi解析轉換后寫入I/O設備。
        因此,開發(fā)人員僅需要開發(fā)Iodevcfg、Ioitemui、Ioapi三部分的代碼。下面就以這三個部分的代碼、界面開發(fā)為例,說明在力控組態(tài)軟件中進行驅動開發(fā)的步驟。
        
        4 開發(fā)實例
        以C8051單片機實現(xiàn)數(shù)據(jù)采集為例,針對下層RS-485總線通信開發(fā)驅動程序。
        4.1 設備組態(tài)接口(Iodevcfg)開發(fā)
        (1) I/O描述文件
        在使用力控進行組態(tài)時,一般都要涉及I/O設備的定義過程。I/O描述文件的文件名為Iodesc.txt。文件內容規(guī)定的格式如下(其中,表示回車換行):
        類別;廠商或I/O程序描述;IOID
        子類型1;類型號;缺省通信方式;提供設備地址
        子類型2;類型號;缺省通信方式;提供設備地址
        ……
        因此,在本項目中的I/O描述文件定義為:
        “X計算機監(jiān)控系統(tǒng);華中科技大學控制系;CCMSController;0;1;0”表示類型號為0,RS-485通信,不設置設備地址。
        (2) 開發(fā)Iodevcfg.dll
        開發(fā)人員在編寫Iodevcfg接口程序時主要完成兩部分功能,一是為用戶進行設備組態(tài)時提供一個界面;另外就是將用戶組態(tài)的設備參數(shù)信息保存起來,以便在開發(fā)編程接口Ioapi時使用。如果力控提供的標準設備組態(tài)接口能夠完整地描述設備的有關信息,就不需要再編寫Iodevcfg接口程序。標準界面如圖1所示,并對串口進行相關設置,如圖2所示。
        
      按此在新窗口瀏覽圖片

      圖1 標準設備組態(tài)界面

      按此在新窗口瀏覽圖片  
      圖2 串口設置界面

        4.2 數(shù)據(jù)連接組態(tài)接口(Ioitemui)開發(fā)
        在用力控進行組態(tài)時,把實時數(shù)據(jù)庫DB中的點參數(shù)與某種設備的具體信道建立連接的過程被為數(shù)據(jù)連接過程。Ioitemui要以DLL形式提供,該DLL必須是MFC擴展DLL,其缺省文件名稱為Ioitemui.dll。
        數(shù)據(jù)連接過程對于不同的I/O設備,其形式和內容可能完全不同。因此,必須針對不同的I/O設備設計相應的數(shù)據(jù)連接形式以保存各種參數(shù)信息。
        開發(fā)人員在編寫Ioitemui接口程序時也是主要完成兩部分功能,一是為用戶進行數(shù)據(jù)連接組態(tài)時提供一個界面;二是將用戶組態(tài)的設備參數(shù)信息保存在數(shù)據(jù)連接項結構(以下簡稱連接項結構)IOITEMDEF中,以便在開發(fā)I/O監(jiān)控接口Ioapi時使用。這個連接項結構是一個通用結構,由開發(fā)人員自己賦值,自己解釋。界面如圖3所示:
        
      按此在新窗口瀏覽圖片
      圖3 數(shù)據(jù)連接組態(tài)界面

        4.3 I/O監(jiān)控接口Ioapi開發(fā)
        Ioapi是FIOS提供的最重要的一個編程接口,開發(fā)人員的主要工作就是開發(fā)Ioapi部分的程序代碼。Ioapi提供了一組API函數(shù)(掃描函數(shù))和一些C++類庫(IOC, Input Output Class)。這些IOC類庫全部以純虛類的形式提供,并且只有成員函數(shù),沒有成員變量,主要包括5個類:CItem(數(shù)據(jù)項類)、CPacket(數(shù)據(jù)包類)、CDevice(設備類)、CChannel(信道類)和CManager(管理器類)。以層級的結構來管理點、包、設備、信道,實現(xiàn)對設備組態(tài)、數(shù)據(jù)組態(tài)、參數(shù)信息的獲取和與實時數(shù)據(jù)庫DB之間的數(shù)據(jù)交換。
        Ioapi.dll程序中主要完成如下的導出函數(shù)(對于不需要的函數(shù),一定要刪除,這樣可以使程序的運行效率提高):
        OnCreate-載入Ioapi.dll后立即調用,這時信道、設備、包、點都不存在,一般用于設置程序的標題,使用戶比較清楚程序的用途;
        OnSortItem-所有點導入完畢后調用,這時候沒有任何包建立;
        OnItemToPacket-循環(huán)多次添加所有的點到各個包中,基本原則是能一次處理的點打成一個包,使打包合理化;
        OnBeforeScan-打包完成,正式調度之前調用一次,遍歷管理器,信道,設備,包,點;
        OnCreateDeviceLink-設備的初始化工作;
        OnCreatePacketLink-包的初始化工作;
        OnReadData-IOSCAN程序循環(huán)掃描調度,形成數(shù)據(jù)采集命令串;
        OnWriteData-發(fā)生數(shù)據(jù)下送時調用,形成數(shù)據(jù)下置命令串;
        OnIsResponseComplete-異步方式下判斷是否完成數(shù)據(jù)的接收,是否將數(shù)據(jù)設置到DB中;
        OnAfterSend-發(fā)送數(shù)據(jù)后調用一次,調試時可以查看發(fā)送的命令串是否正確;
        OnTimeout-發(fā)生超時的時候調用;
        OnUnloadPacket-包析構時調用;
        OnClose-CManager析構時調用一次。
        開發(fā)人員可根據(jù)項目中自定義的通信協(xié)議,將通信協(xié)議寫入函數(shù)OnReadData()、OnWriteData()中,實現(xiàn)數(shù)據(jù)的采集和下置。下面給出OnReadData函數(shù)的部分代碼:
        INT OnReadData( CPacket* pPacket, LPTSTR lpszSendString, INT& nSendStringLen )
        {
        pPacket->SetReady(TRUE);
        //生成采集命令字符串
        CDevice* pDevice = pPacket->GetDevice();
        //得到設備指針
        CChannel * pChannel = pDevice->GetChannel();
        //得到通道指針
        pChannel->ClearAcceptBuffer();
        //清空接收緩沖區(qū)
        CString csDeviceAddr = pDevice->GetAddr();
        //得到實際設備的地址
        IOITEMDEF * pItemStru = pPacket->GetItem(0)->GetItemStru();
        //得到包的數(shù)據(jù)
        BYTE ucIoType = pItemStru->n[IO_TYPE];
        //得到發(fā)送命令的I/O類型
        BYTE ucDeviceAddr = pItemStru->n[DEVICE_ADDR];//得到用戶輸入的設備地址
        ……
        //需要根據(jù)實際的通信協(xié)議書寫有關的程序
        CString csCommand = "";
        csCommand = BYTE(FRAME_HEAD);
        //寫入幀信息頭
        ……
        csCommand += BYTE(QUERY);
        //定義幀信息類型
        csCommand += BYTE(0x01);
        //有效信息長度為 1 字節(jié)
        csCommand += BYTE(ucDeviceAddr);
        //寫入設備的地址
        csCommand += LRCCheck(temp_que, 2);
        //寫入幀尾LRC校驗碼
        nSendStringLen = csCommand.GetLength();
        CString csPmessage;
        csPmessage.Format("讀取數(shù)據(jù):設備地址%X", ucDeviceAddr);
        pDevice->ShowProcessMessage(csPmessage);
        pDevice->ShowEventMessage(csPmessage, FALSE);
        //調試用,用以顯示觸發(fā)事件
        for ( int i = 0; i < nSendStringLen; i++ )
        lpszSendString[i] = csCommand[i];
        return SEND;
        }
        4.4 驅動程序的調試
        通過Visual C++ 6.0編寫的程序,如:Iodevcfg.dll、Ioitemui.dll、Ioapi.dll,必須生成Release版本,否則調試時,I/O Server調用時將會出錯,并立即跳出程序的執(zhí)行。調試顯示過程如附表所示。
        
        附表 設備驅動程序調試過程信息
        
      按此在新窗口瀏覽圖片
      附表 設備驅動程序調試過程信息

        調試結果表明該驅動程序可以實現(xiàn)與C8051單片機的異步通信,完成數(shù)據(jù)的采集,進而實現(xiàn)對助航燈光的控制。
        
        5 結束語
        組態(tài)軟件作為現(xiàn)場生產(chǎn)數(shù)據(jù)采集和過程控制的專用軟件,在許多行業(yè)領域都有應用。但任何組態(tài)軟件的驅動程序不可能囊括所有設備的驅動程序,特別是對通信協(xié)議有特定要求的設備,因此,就需要開發(fā)人員根據(jù)自己的通信協(xié)議編寫相應的驅動程序代碼,并結合實際的設備進行調試。一個好的驅動程序設計應該是可配置的、可移植的、可搶占式的、可中斷的和多處理器安全的[4]。若想能夠很好地掌握驅動程序的開發(fā),最根本的是閱讀驅動文檔并自己動手編寫驅動程序。

      文章版權歸西部工控xbgk所有,未經(jīng)許可不得轉載。

      主站蜘蛛池模板: 精品一区二区三区电影| 精品一区二区ww| 国产在线一区二区三区av| 天堂不卡一区二区视频在线观看| 久久人妻av一区二区软件| 亚洲A∨精品一区二区三区| 国产AV午夜精品一区二区三区| 精品视频一区二区三区在线播放| 亚洲va乱码一区二区三区| 精品福利一区二区三| 中文日韩字幕一区在线观看| 亚洲av成人一区二区三区观看在线 | 国产一区玩具在线观看| 精品无码成人片一区二区| 久久中文字幕无码一区二区| 人妻av无码一区二区三区| 精品日产一区二区三区手机| 亚洲一区二区三区偷拍女厕| 国产精久久一区二区三区| 无码人妻一区二区三区免费视频| 国产精品无码一区二区在线| 一区二区不卡在线| 亚洲熟女www一区二区三区| 国产精品一区视频| 国产一区二区视频免费| 国产精品一区二区久久精品| 国产成人无码AV一区二区 | 日韩毛片一区视频免费| 无码喷水一区二区浪潮AV| 欧美日韩一区二区成人午夜电影| 亚洲AV无码一区二区三区性色| 国产精品自拍一区| 日韩国产免费一区二区三区 | 北岛玲在线一区二区| 性色A码一区二区三区天美传媒| 高清无码一区二区在线观看吞精| 国内精品一区二区三区东京| 国产免费一区二区三区| 中文字幕无线码一区二区| 国产精品美女一区二区 | 亚洲综合一区二区三区四区五区 |