<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > LabWindows/CVI儀器驅(qū)動程序的開發(fā)

          LabWindows/CVI儀器驅(qū)動程序的開發(fā)

          作者: 時間:2012-05-14 來源:網(wǎng)絡(luò) 收藏

          1引言

          本文引用地址:http://www.ex-cimer.com/article/149069.htm

          在BC3192測試程序的過程中,最復(fù)雜的是。同VXI總線間進行的每一步聯(lián)系和操作,都少不了的幫助。

          用Labwindows/CVI(以下簡稱Labwin)軟件可以。這主要是因為Labwin具有一部分通用的儀器設(shè)備驅(qū)動庫。有了它們,用戶可以比較容易地開發(fā)出幾個系列的總線兼容設(shè)備驅(qū)動程序。如RS232儀器驅(qū)動系列、GPIB儀器驅(qū)動系列、VXI總線系列驅(qū)動程序,還有一些典型的特定驅(qū)動程序的實例,如Fluke45Digital Multimeter(VISAI/O)(Fluke45數(shù)字型萬用表)、HewlettPackard34401AMultimeter(VISA)(惠普34401A型萬用表)等。

          一個典型的驅(qū)動程序由4部分組成。

          第一部分是主程序,主要是由*.lib,*.obj,*.dll或*.c文件組成。

          第二部分是包含文件(*.h),包括函數(shù)功能的定義,常量的聲明以及全局變量的聲明。

          第三部分是設(shè)備功能面板部分(*.fp),包括樹狀功能信息定義。

          第四部分是由ASCII碼構(gòu)成的幫助文件(*.doc),它包括指導(dǎo)用戶的詳細(xì)驅(qū)動程序幫助。

          2儀器驅(qū)動程序的操作

          對用戶來說,驅(qū)動程序完成一種或多種儀器功能,整個驅(qū)動程序庫由多組程序有選擇地構(gòu)成。在Labwin的編程環(huán)境中選取儀器菜單,再從菜單中選取一個設(shè)備。這時將從屏幕中彈出一個功能面板,功能面板顯示儀器的一些交互控制。函數(shù)調(diào)用自動生成的功能也隨之加入整個應(yīng)用程序。即使不提供功能面板,也能以手工方式進行驅(qū)動函數(shù)的調(diào)用??偟貋碚f,設(shè)備驅(qū)動程序包括用以執(zhí)行高級設(shè)備相關(guān)任務(wù)的功能函數(shù)。當(dāng)用戶把功能函數(shù)包含到程序中后,即使不了解設(shè)備的編程協(xié)議,也可以控制一個儀器正常運轉(zhuǎn)。對它們的應(yīng)用,可以在很大程度上減輕編程人員的負(fù)擔(dān)。它們可以在軟件開發(fā)中形成模塊化,并大大提高軟件的易用性和可維護性。

          3開發(fā)驅(qū)動程序的優(yōu)勢

          Labwin中設(shè)備的驅(qū)動程序是比傳統(tǒng)概念中的驅(qū)動程序更高一層的概念。他們免去了編程人員頻繁地同I/O端口打交道。它是放入用戶應(yīng)用程序的一種高層的軟件功能。它不僅完全適用于目前各種標(biāo)準(zhǔn)的儀器設(shè)備,而且可對一大批老的儀器設(shè)備提供支持。

          所有的Labwin應(yīng)用的驅(qū)動程序,傳遞時在可能的情況下都伴有源碼,并且很多都有完整的幫助文件。它們都是在Labwin的標(biāo)準(zhǔn)開發(fā)環(huán)境下開發(fā)的,用戶可以根據(jù)具體情況改造自己的程序,使它們更加強大并對自己的應(yīng)用程序有更大的彈性。

          開發(fā)儀器驅(qū)動程序包括外部接口模塊和內(nèi)部設(shè)計模塊。

          3.1外部接口模塊

          外部接口模塊如圖1所示。

          功能主體:設(shè)備驅(qū)動的代碼部分

          程序員交互接口:圖形化的編程助手,把交互控件狀態(tài)轉(zhuǎn)化為代碼

          程序員編程接口:調(diào)用各種函數(shù)

          子程序接口:調(diào)用其它軟件模塊

          3.2內(nèi)部設(shè)計模塊

          內(nèi)部設(shè)計模塊如圖2所示。

          功能主體:設(shè)備驅(qū)動的代碼部分。包括初始化(包括結(jié)構(gòu)復(fù)位、自檢等)、設(shè)置函數(shù)(用一個軟件程序集來實現(xiàn)相應(yīng)功能。各種設(shè)備都有特定的設(shè)置函數(shù)。)、動作/狀態(tài)函數(shù)(動作函數(shù)使儀器開始和停止測試,狀態(tài)函數(shù)可獲得儀器操作當(dāng)前和即將出現(xiàn)的狀態(tài)。)、數(shù)據(jù)函數(shù)(向儀器發(fā)送和接收數(shù)據(jù))、終結(jié)函數(shù)(終結(jié)同儀器間的連接并釋放系統(tǒng)資源)、應(yīng)用程序函數(shù)(高級面向測試和功能函數(shù))。

          4儀器驅(qū)動程序的設(shè)計

          4.1設(shè)計原則

          在設(shè)計之前,必須進行驅(qū)動程序結(jié)構(gòu)的設(shè)計,因為如果驅(qū)動程序的結(jié)構(gòu)比較明了,會使程序員設(shè)計應(yīng)用程序時更有條理。

          其次,一定要把設(shè)計的驅(qū)動程序基于一個已設(shè)計好的核心驅(qū)動程序(即Labwin自帶的驅(qū)動程序庫)、或者是由一個核心驅(qū)動程序演化出來的驅(qū)動程序。

          最后,以一個明確的步驟來編寫你的儀器驅(qū)動程序(將在后面介紹)。

          4.2設(shè)計步驟

          (1)命名這個驅(qū)動程序。

          (2)定義這個驅(qū)動程序的功能和類。

          (3)建立一個驅(qū)動程序的功能樹。在Labwin中的功能樹都以*.fp模式存儲,并在引用時以層次化形式出現(xiàn),并且在各分支功能上加幫助信息。

          (4)對于程序中的每個函數(shù):

          ——對于函數(shù)的參數(shù)定義包括變量類型、變量范圍、錯誤代碼等相關(guān)信息;

          ——在功能面板上實現(xiàn)新功能的創(chuàng)建,包括對功能面板和其中各個控件的幫助信息;

          ——為執(zhí)行功能函數(shù)寫代碼;

          ——檢驗代碼執(zhí)行效果。

          (5)為最終的設(shè)備源程序創(chuàng)建包含文件,包括函數(shù)定義和常量聲明。

          4.3兩個輔助工具介紹

          (1)功能樹的編輯器

          用圖3所示的是功能樹編輯器,可以靈活地添加和刪除各種函數(shù),可從各個分支進入具體的函數(shù)定義功能面板編輯器。

          圖4所示的功能面板編輯器,可以控件的形式描述諸如函數(shù)參數(shù)、返回值、參考說明等函數(shù)的相關(guān)信息。隨著各種控件的加入,相應(yīng)的源代碼也被實時地翻譯在面板下方的文本框中。

          4.4自定義的數(shù)據(jù)類型

          控件的使用方法相當(dāng)簡單,只需補充常說的可移植性問題,這一點同數(shù)據(jù)的定義是分不開的。Labwin對于驅(qū)動程序開發(fā)有自己專門的一套數(shù)據(jù)類型,它們可以精確地定義參數(shù)的類型和大小,而且它們具有很好的可移植性。各種定義如表1所示。

          表1各種定義

          QQ截圖20120514143453.jpg

          4.5函數(shù)定義的方法驅(qū)動程序函數(shù)調(diào)用的返回值也與眾不同,VISA/IO(Labwin中的虛擬設(shè)備接口)定義了一種非常有用的調(diào)用設(shè)備函數(shù)時使用的宏,如表2所示。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();