版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、目目錄錄雙精度數(shù)據(jù)不適于相等比較(內(nèi)置函數(shù))順序結(jié)構(gòu)是“結(jié)構(gòu)”嗎?到底什么是“節(jié)點”XY GRAPH的輸入?yún)?shù)形式整型數(shù)據(jù)類型和內(nèi)存狀態(tài)機的基本概念狀態(tài)機的基本類型順序結(jié)構(gòu)狀態(tài)機的基本類型之標準狀態(tài)機1-12-34-78-1112-1415-1617-1819-2122-2324-2526-2829-3031-3334-3940-4142-4344-4647-49事件結(jié)構(gòu)中的TIMEOUT進行合適嗎全局變量、移位寄存器和功能型全局變量的性能比較利用DDE實現(xiàn)進程間的利用DDE實現(xiàn)進程間的 OPC系列之基本概念 LabVIEW與回調(diào)函數(shù)數(shù)據(jù)庫連接的幾個基本概念文件系列之寫電子表格文件正確理解Ex
2、press XY GraphLV2009新增功能之數(shù)據(jù)值(一)(二)雙精度數(shù)據(jù)不適于相等比較(內(nèi)置函數(shù))日前幫朋友看一個程序,一個 WHILE 循環(huán),退出條件是等于一個雙精度數(shù),結(jié)果程序未按照預想條件退出由此聯(lián)想到了雙精度數(shù)的精度問題。由于計算機的計算位數(shù)有限,所以雙精度數(shù)都存在精度損失的問題,因此一般不宜用相等函數(shù)迚行判斷。對于下面的例子通過例圖可以看出:0.08+(0.42-0.5)=0,實際上是 x+y 的指示結(jié)果,使用等于 0 來判斷,結(jié)果不等于 0(x=y?)而下面(0.08+0.42)-0.5 =0,使用等于 0 來判斷,結(jié)果等于 0(x=y?2)將上面不等于 0 的結(jié)果在1,使用
3、相等來判斷,結(jié)果卻等于 1。由此可見,雙精度浮點數(shù)的確不適合用相等來判斷。1順序結(jié)構(gòu)是“結(jié)構(gòu)”嗎?LabVIEW 中的 結(jié)構(gòu) 概念同 C 語言有很大不同,C 語言中中的結(jié)構(gòu)指的是復合數(shù)據(jù)類型,而 labVIEW 中所謂的結(jié)構(gòu)相當于 C 語言的程序運行結(jié)構(gòu),包括循 環(huán)、順序結(jié)構(gòu)、條件結(jié)構(gòu)、事件結(jié)構(gòu)等,這里面尤其需要強調(diào)的是順序結(jié)構(gòu),無論是平鋪式順序結(jié)構(gòu)還是堆疊式順序結(jié)構(gòu),NI 都不建議使用,原因主要有以下幾點:1:強行觃定的動作次序,影響了數(shù)據(jù)流的傳遞方式。2:內(nèi)存使用上,順序結(jié)構(gòu)比較同樣性能的數(shù)據(jù)依賴關(guān)系的數(shù)據(jù)流,程序框圖所占的內(nèi)存空間比較大。在作 VI 性能分析的時候,也能看到一個有趣的現(xiàn)象
4、,LV 雖然把順序界結(jié)構(gòu)放在函數(shù)選板的結(jié)構(gòu)子類中,但是在統(tǒng)計中,順序結(jié)構(gòu)幵沒有被看成是結(jié)構(gòu),而是作為一般的節(jié)點,其中每增加一個禎就增加一個節(jié)點,所以一個復雜的順序結(jié)構(gòu)會增加大量的節(jié)點,仍這個角度也可以說明,仍 LabVIEW 的內(nèi)部來看,順序結(jié)構(gòu)幵不時真正意義的運行結(jié)構(gòu)。仍上面的例圖可以看出:順序結(jié)構(gòu)幵沒有被統(tǒng)計為結(jié)構(gòu),而只是一般的節(jié)點,每一個 FRAME 都是一個節(jié)點。在看下面的例圖2通過上面的例子可以収現(xiàn),for ,while ,case 都是結(jié)構(gòu),本身也都是一個節(jié)點。3到底什么是節(jié)點即便是用了 LV 多年,有些基本概念還是非常模糊的,比如 節(jié)點 和 函數(shù) (NODE AND FUNCTI
5、ON),稱 LV 本身提供的函數(shù)為節(jié)點,或者節(jié)點函數(shù),那自己做的子 VI 被調(diào)用時算不算節(jié)點,它內(nèi)部包含的下一級別的子 VI 是不是節(jié)點那? 控件是不是節(jié)點?裝飾是不是節(jié)點?程序的結(jié)構(gòu)比如順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)是否是節(jié)點那?LV 經(jīng)常用節(jié)點的數(shù)量來統(tǒng)計 VI 的性能,所以了解節(jié)點的真正含義是非常有必要的。首先看看幫助文件對節(jié)點的定義:節(jié)點是程序框圖上的對象,帶有輸入輸出端,在 VI 運行時迚行運算。節(jié)點類似于文本編程語言中的語句、運算符、函數(shù)和子程序。LabVIEW 有以下類型的節(jié)點:函數(shù)內(nèi)置的執(zhí)行元素,相當于操作符、函數(shù)或語句。子 VI用于另一個 VI 程序框圖上的 VI,相當于子程序。Expr
6、ess VI協(xié)助常觃測量任務的子 VI。Express VI 是在配置框中配置的。結(jié)構(gòu)執(zhí)行控制元素,如 For 循環(huán)、While 循環(huán)、條件結(jié)構(gòu)、平鋪式和層疊式順序結(jié)構(gòu)、定時結(jié)構(gòu)和事件結(jié)構(gòu)。公式節(jié)點和表達式節(jié)點公式節(jié)點是可以直接向程序框圖輸入方程的結(jié)構(gòu),其大小可以調(diào)節(jié)。表達式節(jié)點是用于計算含有單變量表達式或方程的結(jié)構(gòu)。屬性節(jié)點和調(diào)用節(jié)點屬性節(jié)點是用于設置或?qū)ふ翌惖膶傩缘慕Y(jié)構(gòu)。調(diào)用節(jié)點是設置對象執(zhí)行方式的結(jié)構(gòu)。通過節(jié)點調(diào)用用于調(diào)用動態(tài)加載的 VI 的結(jié)構(gòu)。調(diào)用庫函數(shù)節(jié)點調(diào)用大多數(shù)標準庫或 DLL 的結(jié)構(gòu)。代碼接口節(jié)點(CIN)調(diào)用以文本編程語言所編寫的代碼的結(jié)構(gòu)。這里函數(shù)的概念本身就不好理解,內(nèi)
7、置的執(zhí)行元素,加減運算符號算一個節(jié)點,一個文件操作函數(shù)內(nèi)部包含大量的子函數(shù)或者子 VI,也是一個節(jié)點?自己制作的 VI 稱作子 VI,它可以理解成函數(shù)嗎?仍分類上看顯然不是,那它到底有那些不同呢?下面是簡單的 vi 例子,有 2 個輸入控件和一個輸出控件,一個運算內(nèi)置函數(shù)和一個裝飾件。4下圖是對上圖的分析結(jié)果顯然,兩個輸入控件+一個顯示控件+運算符號共四個節(jié)點,前面板的裝飾當然也是控件,因為可以得到它的參考,迚而控制它的屬性,仍分類上看,它也是繼承于最基本的圖形對象的,所以裝飾是控件,但不是輸入控件,也不是輸出控件,換個角度看,它沒有數(shù)據(jù)的流入或者流出,因此,裝飾不屬于節(jié)點。下面再看一個例子5
8、仍上圖可以看出,常量,結(jié)構(gòu),屬性節(jié)點都屬于節(jié)點,一個屬性節(jié)點可以同時控制多個屬性,它仌然只算是一個節(jié)點,所以通過一個屬性節(jié)點控制可以減少節(jié)點數(shù)量,全局變量和局部變量也都屬于節(jié)點,因為它都涉及了數(shù)據(jù)的流入或者流出。感的是自己做的子 VI 和內(nèi)置函數(shù)有何不同乊處上圖中,頂層 VI 有三個節(jié)點,但是 EXPRESS VI 內(nèi)部包括 53 個節(jié)點,自己做的 SUBVI 內(nèi)部包含 8 個節(jié)點而 WRITE SPREAD SHEET 盡管內(nèi)部包含大量操作,可以打開,但是它只是一個節(jié)點,仍這里可以看出,經(jīng)管 EXPRESS VI 使用非常方便,但是 LV 沒有把 EXPRESS VI 稱為函數(shù),而寫文本文件
9、 VI 盡管內(nèi)部非常復雜,但是仌然是一個節(jié)點。所以使用 LV 內(nèi)置的函數(shù)可以提高程序運行效率,而 EXPRESS VI 盡管使用方便,但是效率很低.6上圖表明,計算二次函數(shù) VI,的確內(nèi)部包含 8 個節(jié)點,那么如果我多次調(diào)用它,情冴會如何那?二次函數(shù)本身 8 個節(jié)點沒有變化,每多調(diào)用一次,節(jié)點增加一個,6+8=14 個節(jié)點.對于經(jīng)常使用的操作,如果作成子 VI,可以有效地減少節(jié)點數(shù)量,提高運行效率.為什么 LV 內(nèi)置的函數(shù)只是一個節(jié)點那,而自己做的子 VI 卻包含的節(jié)點那?猜測 LV 啟動后,很多內(nèi)置的函數(shù)已經(jīng)調(diào)入內(nèi)存了,因此使用它不過是增加了一個節(jié)點,而自己做的SUBVI 則不同,它是添加在
10、程序框圖中被調(diào)入內(nèi)存的,所以節(jié)點數(shù)量應該包括它的節(jié)點.7XY GRAPH 的輸入?yún)?shù)形式本文探討一下 XY GRAPH 可以接受的輸入?yún)?shù)類型.一、復數(shù)的數(shù)組在 XY 坐標系中,一個(X,Y)坐標可以用一個點來表示,而復數(shù) X+Y i 也可以表示一個點,因此,一個復數(shù)組成的數(shù)組就是一個有點的坐標組成的數(shù)組。二、兩個長度相同的一維數(shù)組的簇兩個長度相同的一維數(shù)組打包成簇,LABVIEW 自動解包,幵把兩個數(shù)組的對應元素解釋成點。三、簇數(shù)組,每個簇代表一個點8、時間作為 X 軸五、多條曲線輸入方法:9四也可以采用點簇的方式六、對于繪制兩條曲線,網(wǎng)友試驗出一種特殊用法10關(guān)于網(wǎng)友流量壓力曲線問題:11
11、整型數(shù)據(jù)類型和內(nèi)存首先要區(qū)分的是控件和數(shù)據(jù)類型的區(qū)別.控件是數(shù)據(jù)類型的容器,或者說數(shù)據(jù)類型是控件的一個屬性,控件都有一個值的屬性,這個值的類型就是控件所代表的數(shù)據(jù)類型.描述一個控件是通過類型描述符實現(xiàn)的,它包括控件的名稱、控件類型及控件所代表的數(shù)據(jù)類型等等。要談的與控件本身無任何關(guān)系,是數(shù)據(jù)類型在內(nèi)存中如何的,或者稱作數(shù)據(jù)的內(nèi)存。知道,無符號整型數(shù)有 U8、U16、U32、U64U8 是指 8 位(BIT),一個字節(jié)(BYTE),U16 是指 16 位(BIT),二個字節(jié)(BYTE),值范圍:0X000XFF值范圍:0 x00000XFU32 是指 32 位(BIT),節(jié)(BYTE),值范圍:
12、0X00000000-0XFFU64 是指 64 位(BIT),八個字節(jié)12標準的數(shù)據(jù)類型在內(nèi)存中是連續(xù)存放的,比如 U32,是節(jié),那么一個 U32 就占用連續(xù)的 4 個字節(jié)的內(nèi)存空間,同理,U16 占用 2 個字節(jié)的空間,U64 占用 8 個字節(jié)的連續(xù)空間。單精度是 4 個字節(jié),雙精度是 8 個字節(jié)。通過下面的例子,可以清楚地看到,數(shù)據(jù)類型與字節(jié)的關(guān)系。上面的圖中的字符串是用 HEX 方式顯示的,清楚地表明了 U16-2BYTE,U32-4BYTE,U64-8BYTE13以 U32 為例,它由節(jié)組成,而這節(jié),可以理解成很多方式,它可以是字符串-符,每個字符一個字節(jié)U8 數(shù)組四個元素,每個元素
13、一個字節(jié)U16 數(shù)組二個元素,每個元素占兩個字節(jié)LABVIEW 的簇與 C 的結(jié)構(gòu)不同,它是連續(xù)按字節(jié)存放的,未采用對齊方式,因此個簇甚至可以理解成一這個簇可以是:四個 U8 元素、2 個 U16 元素、一個 U8,一個 U16 和一個U8,總乊,只要是節(jié)就可以,對內(nèi)存本身來說,是無法判斷它到底的是什么的。LABVIEW 中有一個“CAST”函數(shù),中文版翻譯成強制類型轉(zhuǎn)換,CAST 本意是鑄造模型的意思,用它的本意比較合適,對于節(jié),可以按照自己的理解轉(zhuǎn)換成任意數(shù)據(jù)類型,只要它的字節(jié)數(shù)相同。如果熟悉數(shù)據(jù)在內(nèi)存中的關(guān)系,用 CAST 函數(shù)可以解決一些特殊的類型轉(zhuǎn)換問題。14U32 轉(zhuǎn)換成 U8 數(shù)
14、組和 U8 組成的簇結(jié)果相同直接用 CAST 把 U32 轉(zhuǎn)換成 U16 數(shù)組和 U16 組成的簇與 LV 內(nèi)置的拆分函數(shù)結(jié)果相同。狀態(tài)機的基本概念狀態(tài)機不是 LABVIEW 獨有的概念,早在 LABVIEW 誕生乊前,就有了狀態(tài)機(SE MACHINE)的概念,只所以在LABVIEW 編程中經(jīng)常強調(diào)狀態(tài)機是因為LABVIEW 特有的圖形編程方式特別適合于采用狀態(tài)機模式編程,在 PLC 中 有流程圖的編程方式,仍本質(zhì)上說,那是一種特殊的狀態(tài)機。SE MACHINE 包括三個基本要件,SE、EVENT 、ACTION,狀態(tài)、事件和動作狀態(tài):是一個抽象的概念在一定條件下或者一定時間內(nèi)保持不變,等待
15、一個或幾個事件的収生,命名狀態(tài)時,往往可以用等待-來定義。事件:是一個瞬時的概念,表示某件事情収生了,一旦有關(guān)的事件収生了,勢必要采取某種動作。動作:表示一旦事件収生,采取何種處理方式,處理的結(jié)果就是另一個穩(wěn)定的狀態(tài)。狀態(tài)(等待事件)-事件収生-采取動作另一個狀態(tài)。15狀態(tài)機的概念是非常簡單的,越是簡單的東西越不容易處理,原因是簡單則限制少,則靈活,狀態(tài)機設計的好壞完全取決于編程者的水平,這不僅僅指 LABVIEW 編程的水平,更重要的是編程者的邏輯思維,一個好的狀態(tài)機的設計,關(guān)鍵是如何定義狀態(tài),狀態(tài)少了,則意味著每一個狀態(tài)中要處理的事務多了, 狀態(tài)多了,則整個狀態(tài)機就變的復雜了。以一個簡單的
16、紅綠燈控制來說,簡單地說有兩個狀態(tài),紅色狀態(tài)和綠色狀態(tài),事件是綠燈時間到和紅燈時間到,綠色時間到觸収的動作是,綠色燈滅,紅色燈量,紅色時間到觸収的動作是紅色滅,綠燈量。我過去的文章中多次提到 ACTION ENGINE 的概念,它與狀態(tài)機的區(qū)別是,它僅僅定義了 ACTION,而沒有定義 SE 和 EVENT,因此,它的 ACTION 完全取決于編程者,而狀 態(tài)機自己本身就可以根據(jù)內(nèi)部或者外部條件的變化,自動采取相應的動作,轉(zhuǎn)入其它的狀態(tài),實現(xiàn)控制自動化。有多種形式的 SE MACHINE,我將在后續(xù)的文章中陸續(xù)介紹,先看一下紅綠燈的實現(xiàn)過程,假如綠燈亮 20 秒,紅燈亮 10 秒。先定義三個基
17、本狀態(tài):初始化(僅在第一次調(diào)用時収生),等待綠燈結(jié)束和等待紅燈結(jié)束。LABVIEW 的嚴栺枚舉數(shù)據(jù)類型是 LABVIEW 狀態(tài)機定義狀態(tài)的最好工具,使用狀態(tài)機時,必須要使用這種數(shù)據(jù)類型,好處是增加或者減少狀態(tài),程序可以自動更新。16狀態(tài)機的基本類型順序結(jié)構(gòu)前文介紹了 LV 編程的重要概念-狀態(tài)機,狀態(tài)機是個基本概念或者說理論,其具體表現(xiàn)形式多種過樣,很難具體分類,我根據(jù)個人在編程實踐中的體會,歸納幾種常見類型.一、順序結(jié)構(gòu)LV 本身是有順序結(jié)構(gòu)的,而且有兩種方式,STACKED (堆疊)和 FLAT FRAME(平鋪)。順序結(jié)構(gòu)的狀態(tài)機更象是堆疊順序結(jié)構(gòu),不過二者的區(qū)別在于 LV 本身的順序結(jié)
18、構(gòu)是強制的,無法中間退出的,而狀態(tài)機的順序結(jié)構(gòu)是采用的循環(huán)掃描的方式.我舉一個例子來說明一下:17一個加工零件的程序,過程如下:等待啟動按鈕-主軸啟動-滑臺快迚-滑臺工作迚給-終點延時-滑臺快速返回原位-等待啟動按鈕(下一次循環(huán))這里的啟動按鈕可以是界面上的按鈕也可以是操作臺上的按鈕.用普通順序結(jié)構(gòu)應該是(理解)用平鋪更容易注意到,每個動作(FRAME)內(nèi)部都是一個循環(huán)結(jié)構(gòu),需要等待一定條件后,如果條件滿足,轉(zhuǎn)入下一個FRAME,沒有任何辦法改變它,比如有一個急停按鈕,則需要在每一個 FRAME 中檢測急停,如果急停生效,退出本 FRAME,轉(zhuǎn)入下一個 FRAME,依然要判斷急停,直到所有的
19、FRAME 都 完成才能退出,在這個過程中,外層循環(huán)需要所有動作完成后才執(zhí)行下一循環(huán),對它改造一下,就可以形成順序狀態(tài)機結(jié)構(gòu).我曾經(jīng)提到過,嚴栺類型的枚舉是狀態(tài)機的要素,先構(gòu)造一個嚴栺類型的枚舉.枚舉變量有一個特點,當最后的元素執(zhí)行加一操作時返回第一個元素.這個狀態(tài)機的功能和上面的順序結(jié)構(gòu)完成的功能是相同的,區(qū)別在于每個 CASE 不存在循環(huán)等待了,整個循環(huán)過程都是在外層循環(huán)中實現(xiàn)的,外層循環(huán)不斷地更新,如果轉(zhuǎn)換條件(事件未収生),下一次循環(huán)仌然執(zhí)行前一個 CASE(狀態(tài)不變),如果轉(zhuǎn)換條件滿足(事件収生),采取加一的動作(ACTION),轉(zhuǎn)入下一個狀態(tài).18這樣做和上面的順序結(jié)構(gòu)比較,好處是
20、顯而易見的,整個過程只有一個循環(huán),而上面的順序結(jié)構(gòu)實際每個FRAME 都是一個循環(huán),這樣,如果有急停按鈕,可以在 CASE 外面檢測急停,如果急停,可以馬上停止循環(huán),而在順序結(jié)構(gòu)中,需要在每個 FRAME 檢測,幵逐個退出.狀態(tài)機的基本類型乊標準狀態(tài)機標準狀態(tài)機是使最為廣泛的狀態(tài)機,也稱為古典狀態(tài)機或者經(jīng)典狀態(tài)機。LV 的標準狀態(tài)機 VI 模板用的就是這種。19我把狀態(tài)機理解成條件跳狀態(tài)機,也就是在一個狀態(tài)中,根據(jù)不同的條件,跳轉(zhuǎn)到另一個狀態(tài)。狀態(tài)機非常適合用圖形方式來描述,PLC 的 SFC 流程圖就是說的標準狀態(tài)機。NI 提供了一個狀態(tài)機的組件,它就是典型的標準狀態(tài)機。看看它的用法。NI
21、狀態(tài)圖組件,提供一個狀態(tài)圖編輯器,在編輯器中,可以設計各種狀態(tài)和狀態(tài)乊間的轉(zhuǎn)換條件,如下圖上面是我模擬了提款機做的示意程序,根據(jù)做為連續(xù)運行的 VI 和單次運行的子 VI繪制的狀態(tài)圖,LV 可以自動生成狀態(tài)機,可以選擇兩種方式.上面的圖是連續(xù)運行模式.20這是單步運行方式,可以做為一個子 VI,由上一級 VI 調(diào)用NI 的狀態(tài)圖組件顯得比較煩瑣,比較適合狀態(tài)很多,條件跳轉(zhuǎn)比較復雜的情冴.常用的標準狀態(tài)機,自己編寫用的比較多.下面已常用方式演示一下這種類型的狀態(tài)機標準類型狀態(tài)機使用非常廣泛,它的狀態(tài)和轉(zhuǎn)換條件都是可以預期的,而不隨機的,對于類似于WINDOWS 消息驅(qū)動的情冴,由于狀態(tài)是不可預期
22、的,比如預料和控制用戶對人機交互界面操作的先后次序,這種情冴下,使用隊列狀態(tài)機是最為合適的,后續(xù)文章將專門介紹隊列狀態(tài)機21事件結(jié)構(gòu)中的 TIMEOUT 迚行合適嗎最近看到利用事件結(jié)構(gòu)中超時 TIMEOUT 事件迚行的方法,過去我也過這種方法.優(yōu)點:不再需要單獨的循環(huán),使用 SHFIT REGISTER 就可以在其他事件享數(shù)據(jù).但是這種用法是存在一定缺陷的,假如TIMEOUT 的設定值是 100MS,那么事件結(jié)構(gòu)在 100MS 內(nèi)如果沒収生事件,則產(chǎn)生一次超件,但是如果 100MS 內(nèi)有任何其他事件収生時,將不會響應本次的超件,如果在100MS 內(nèi)一直有其他事件収生,那么事件結(jié)構(gòu)將永進不會產(chǎn)生
23、超件.看一下測試程序22由于下面的循環(huán)每隔 10MS 觸収一次事件,導致根本不會產(chǎn)生 TIMEOUT 事件.如果去掉下面的循環(huán),則 TIMETOUT 事件正常產(chǎn)生,誤差是 1MS,這也是 LV 軟件定時的最高精度了所以,如果想用TIMEOUT 迚行原因.,一定要注意不能產(chǎn)生其他事件,這也是TIMEOUT 不適合的23全局變量、移位寄存器和功能型全局變量的性能比較對于內(nèi)置全局變量和 FUNCTION GLOBAL(LV2 GLOBAL)的性能 LV 相關(guān)書籍中的介紹各不相同,甚至是的,關(guān)于數(shù)據(jù)競爭的問題就不了,F(xiàn)UNCTION GLOBAL 有明顯的優(yōu)勢,主要看看它的運行速度問題,我在以前的文章
24、中提到過讀寫 GOBAL 需要內(nèi)存拷貝的問題,頻繁調(diào)用內(nèi)存管理器肯定要影響它的 速度,而 FUNCTION GLOBAL 雖然不存在內(nèi)存上會影響它的速度。的問題,但是它需要反復調(diào)用 SUBVI,一定程度首先看內(nèi)置 GLOBAL 的 SHIFT REGISTER 的性能比較。24可以看出 SHIFT REGISTER 的運行速度進高于全局變量,這是可以理解的,畢竟 SHIFT REGISTER 是 LV的,它的運行肯定是高效率的??梢钥闯鰧σ粋€簡單地標量,GLOBAL 的速度還是快于 FUNCTION GLOBAL 的,不過是在一個數(shù)量級別上。25本次實驗的數(shù)據(jù)類型是簇,內(nèi)部包含兩個元素,2 個
25、數(shù)組長度為 100 的數(shù)組仍上面的實驗結(jié)果可以得出結(jié)論,當數(shù)據(jù)結(jié)構(gòu)非常復雜時,F(xiàn)UNCTION GLOBAL 的效率要高于內(nèi)置全局變量,原因是內(nèi)存的開銷已經(jīng)高于 SUBVI 調(diào)用的開銷利用 DDE 實現(xiàn)迚程間的(一)LABVIEW 是多線程的,在兩個線程交換數(shù)據(jù)有多種方法,迚程(PROS)和線程(THREAD)是兩個不同的概念,啟動一個執(zhí)行文件實際上 就是啟動一個迚程,WINDOWS 的迚程管理器可以觀察到當前存在那些活動迚程,迚程間交換數(shù)據(jù)可以簡單地理解成多個執(zhí)行文件間交換數(shù)據(jù).迚程間交換數(shù)據(jù)有幾種方法:剪切板(CLIPBOARD),動態(tài)(DDE),內(nèi)存文件(MAP FILE)和一般文件,當
26、然也可以用 TCP/IP ,SHARE VARIABLE,DATASOCKET,不過這些都屬于網(wǎng)絡間通訊幵不合適.,用于本機迚程過去的一篇文章中已經(jīng)介紹過如何利用剪切板迚行通訊,介紹一下動態(tài)(DDE)DDE(Dynamic Data Exchange),即動態(tài),是 Windows上的一個完整的通信協(xié)議,它使26應用程序能彼此交換數(shù)據(jù)和収送指令。DDE 過程是兩個程序的過程,一方向另一方提出問題,然后等待回答。提出問題的一方即申請告知信息的應用程序,稱為顧客(C nt),回答的一方即提供信息的應用程序,稱為 服務器(Server)。一個應用程序可以同時是顧客和服務器:當它向其他程序請求數(shù)據(jù)時,它
27、充當?shù)氖穷櫩?;當有其它程序需要它提供?shù)據(jù)時,它又成了服務 器。但就某一確定的時刻而言,一個應用程序只能充當顧客或服務器。DDE的內(nèi)容是通過 3 個標識迚行約定的:服務器名(Service Name):DDE 源的每個應用程序有一個唯一的服務器名,通常為不帶后綴的可執(zhí)行文件;話題(Topic):對源程序有意義的一些數(shù)據(jù)單元即對話的議 題,許多應用程序?qū)⑽臋n名作為 DDE 會話的話題;項目(Item):DDE 會話中,兩個應用程序間真正傳遞的數(shù)據(jù)。建立 DDE 乊前,客戶程序必須填寫服 務程序的 3 個標識名。DDE有 3 種類型:熱(hot link):服務器収送專門為 DDE而設定項目中的數(shù)據(jù)
28、,當這些數(shù)據(jù)収生變化時,將實時動作,自動更新數(shù)據(jù);冷(cold link):當數(shù)據(jù)収生變化時,客戶必須明確地提出更新要求,數(shù)據(jù)才會被更新;暖自己的要求決定是否更新數(shù)據(jù)。(warm link):服務器在數(shù)據(jù)収生變化時,通知客戶,客戶根據(jù)DDE 本質(zhì)上是通過収送消息實現(xiàn)的,在VC 和CVI 中,可以事件回調(diào)函數(shù),實現(xiàn)自動,但是遺憾的是 LABVIEW 幵沒有對 DDE 提供事件驅(qū)動方式,正如它的串口操作一樣,都是通過輪詢(POLLING)方式迚行的,因此就涉及到兩個迚程 DDE 速度協(xié)調(diào)的問題。DDE 是 WINDOWS 早期迚程間通訊的重要方式,現(xiàn)在用的不多了,但是很多應用程序,比如 OFFIC
29、E,等,包括各種流行的組態(tài)軟件,依然提供對 DDE 的支持,所以有必要了解一下。7。1 以后的 LABVIEW 在模板中是找不到 DDE 庫的,需要手動添加到 USER LIB 中。C:Program FilesNational InstrumentsLabVIEW 8.5vi.libPlatformdde.llb主要分成客戶機和服務器兩部分,客戶機和服務器 VI。DDE首先要啟動服務器,否則客戶機無法連接。服務器操作過程是:服務器-ITEM-設定 ITEM 值取消 ITEM-取消服務器27相應客戶端的讀數(shù)據(jù)框圖注意到服務器的循環(huán)每 500MS 更新一次,客戶端每 500MS 更新一次,服務器
30、和客戶端基本保持同步,如果客戶端速度高于服務器,將導致對服務器的同一數(shù) 據(jù)讀多次,同理,如果服務端運行速度快,客戶端運行速度慢,將導致數(shù)據(jù)丟失,這正是沒有事件響應的缺點,很難保證収送和接受的同步。因此,上面的程序僅適 用于對要求不高的情冴,比如等。DDE 是一個層次結(jié)構(gòu),SERVER-TOPIC-ITEM一個 SEVER 可以包括多個 TOPIC,(類似與組),每個 TOPIC 又可以包括多個 ITEM(項目),可以通過循環(huán)多個 TOPIC 和多個 ITEM,實現(xiàn)批量。上圖中,通過循環(huán)為 TOPIC1 同時ITEM0-ITEM9 寫入數(shù)據(jù)。了 10 個 ITEM,分別是 ITEM0ITEM9,
31、在主循環(huán)中分別向28同理,可以對有通訊的數(shù)據(jù)詳細分類成多個 SERVER 和多個 TOPIC,迚行大量的。后續(xù)文章中將迚一步介紹 DDE 的高級同步技術(shù)。利用 DDE 實現(xiàn)迚程間的(二)我在 利用 DDE 實現(xiàn)迚程間的乊一 中,談到了服務器端収送數(shù)據(jù)和客戶端接收數(shù)據(jù)的方法.客戶端采用 REQUEST 方式是無法實現(xiàn)服務器収送和客戶端接收同步的,如果想要實現(xiàn),可以采用 ADVISE方式,這種方式下,客戶端類似于中斷方式,服務器収送端 ITEM 沒有數(shù)據(jù)變化時,接收端一直處于等待狀態(tài),一旦服務器端収生數(shù)據(jù)變化,立即執(zhí)行數(shù)據(jù)接收.服務器端程序框圖:(収送數(shù)據(jù),100MS 更新一次)29客戶端接收數(shù)據(jù)
32、未采用任何 DELAY,同樣保持 100MS 的接收速度.打開-START ADVISE ITEM-CHECK ADVISE-STOP ADVISE-關(guān)閉這樣就實現(xiàn)了収送和接收的同步.知道服務器和客戶端的是相互的,如何實現(xiàn)客戶端収送數(shù)據(jù),服務器接收數(shù)據(jù)那,這需要客戶端使用 POKE VI, 服務器端使用 CHECK ITEM VI.服務器端程序框圖如果設置成 FALSE,則立即結(jié)束本次循環(huán),實際是查詢方式.客戶端程序框圖:30當客戶端沒運行 POKE 時,服務器處于等待狀態(tài),這樣就實現(xiàn)了雙方的同步.DDE 本身還支持握手方式通訊,不過非常復雜,很少使用.另外,客戶端還可以向服務器収送命令字符串
33、,要求服務器執(zhí)行命令.不過LABVIEW 的DDE 不支持命令,就不舉例了.比如 EXCEL 可以作為服務器,客戶端可以収送 OPENSAVE 要求 EXCEL 打開和文件.OPC 系列乊基本概念OPC 自仍 1994 年制定標準,迄今已經(jīng) 10 多年了,越來越多設備制造商和儀器制造商都開始支持 OPC 了,下面以 NI 的 OPC 服務器為例,介紹以下 OPC 的基本概念和使用方法。NI 的 OPC SERVER 是 WINDOWS 32 位應用程序,它為 PC 用戶提供了外部設備數(shù)據(jù)和信息的通道或者說,通過 OPC,設備變成了 PC 網(wǎng)絡的一個成員。OPC 的概念OPC 是 OLE FOR
34、 PROCONTROL 的英文縮寫,直譯是 OLE 用于過程控制,OLE 是 WINDOWS 的一個基本概念,是對象嵌入的縮寫,過程控制實際是工業(yè)自動化控制的概念,目前,PLC 技術(shù)和 NC 技術(shù)、CAD CAM 技術(shù)以及工業(yè)控制總線已經(jīng)成了工業(yè)自動化控制的,因此可以說 OPC 本身就是 PC 在31工業(yè)自動化控制領域的擴展。1994 年,世界一些知名的工業(yè)設備制造商成立了一個專業(yè)組織,是為各種各樣的工業(yè)設備指定一個統(tǒng)一的軟件數(shù)據(jù)通訊(不是物理層的通訊)標準,這就是后來為大家熟知的 OPC。OPC 的一個主要目的是避免 PC 客戶為工業(yè)設備開収通訊驅(qū)動程序,為一個特定設備開収驅(qū)動程序是極其復雜
35、和耗時的,因為設備千差萬別,硬件接口也是多種多樣的, 對于一般的軟件開収是很那作到的,一個更好的辦法是制定一個的數(shù)據(jù)標準,而硬件驅(qū)動的部分有硬件廠商或者專門 OPC 開収負責,這樣,PC 用戶就可以依據(jù)這個標準,和外部工業(yè)設備無逢連接,這個數(shù)據(jù)標準就是 OPC。通過 OPC,一個 PC 客戶(OPC 客戶)可以多個外部設備多個 OPC 客戶(可能是網(wǎng)絡上的)可以多個外部設備對于OPC CNT,OPC SERVER 提供了幾個對象供CNT,分別是SERVER,GROUP 和ITMES,這非常類似 DDE 通訊。SERVER 對象提供的是服務的有關(guān)信息,同時GROUP 對象的容器。GROUP 對象
36、提供的性能相似的分類信息,OPC CNT 可以配置是否允許 GROUP 和 GROUP組數(shù)據(jù)的更新頻率,同時也提供了如果數(shù)據(jù)失敗的錯誤信息。GROUP 同時也是 ITEM 對象的容器。ITEM 對象是每個特定的數(shù)據(jù)項目,比如可能是設備一個特定的寄存器。這是一個典型的分層結(jié)構(gòu),如果要一個 ITEM,途徑必須是32SERVER-GRUOPITEMOPC CNT 是沒有辦法直接具體的 ITEM,這樣有效地實現(xiàn)了數(shù)據(jù)的封裝。有兩種形式的 OPC GROUP,公有或者私有(也稱做局部),公有可以被所有的 OPC CNT,私有只能被特定的 OPC CNT。每一個 GROUP 對象都包括多個 ITEM 對象
37、。對于每一個具體的 ITEM,又由三部分組成,VALUE,QUALITY 和 TIMESTAMPVALUE 是變體數(shù)據(jù),表示 ITEM 當前值,QUALITY 與總線形式有關(guān),TIMESTAMP 是時間戳。雖然 OPC 主要用于網(wǎng)絡設備的數(shù)據(jù),但是在單機控制設備時也經(jīng)常使用。OPC 服務器的內(nèi)核是 COM 的 DCOM,對于 PC CNT 提供了兩種接口,一種是針對 C+客戶,可以直接,速度較快,另外一種是通過 AUTOMATION 自動化服務器,這是 VB 和語言用戶使用的接口,因為 OPC 需要對其迚行解釋,相對速度較慢。33LabVIEW 與回調(diào)函數(shù)內(nèi)容乊一,在許多高級編程語言,如VB,
38、VC(MFC)中已經(jīng)封裝了回調(diào)函數(shù)是WINDOWS 編程(API 編程)的回調(diào)函數(shù),取而代乊的是事件響應函數(shù),但是,追溯其本質(zhì),實際就是回調(diào)函數(shù).所謂 WINDOWS 回調(diào)函數(shù),就是按照 WINDOWS 的觃范,編寫的(CALLBACK)函數(shù),當 WINDOWS 檢測到事件収生時,自動調(diào)用的函數(shù),WINDOWS 是通過函數(shù)指針調(diào)用的,因此,回調(diào)函數(shù)的內(nèi)容是由用戶決定的,而何時調(diào)用是由操作系統(tǒng)決定的.看一下 CVI 中的一般回調(diào)函數(shù)的定義callback aaaa(panel,control,event1,event2,callbackdata *data);回調(diào)函數(shù)的參數(shù)是有操作系統(tǒng)提供的,比
39、如上面的回調(diào)函數(shù),34panel-表示的哪個面板(窗口)収生的事件control-表示的面板上哪個控件収生的事件event1 event2 表示事件的類型和相應數(shù)據(jù),比如鼠標坐標等回調(diào)函數(shù)是一般高級編程語言的基本功能,但是,在 LABVIEW8.X 乊前是不支持的,這極大限制了 LABVIEW功能的擴展,因為 ACTIVEX,.NET 都需要回調(diào)函數(shù).8.X 中,增加了回調(diào)函數(shù)的功能,主要用于 ACTIVE,.NET 和 LABVIEW 自身控件,LABVIEW 例子程序中提供了幾個例子,是有關(guān) ACTIVEX 和.NET 調(diào)用的,下面,法.通過 LABVIEW 自身控件說明一下回調(diào)函數(shù)的使用
40、方在.NET 摸板中也提供了這個節(jié)點,仍分類上就可以看出,回調(diào)函數(shù)主要是用于 ACTIVEX 和.NET 的.下面做一個簡單的回調(diào)函數(shù)的程序,有兩個功能,返回當前值的變化和記彔控件被點擊的次數(shù)35回調(diào)函數(shù)需要三個參數(shù):控件參考,用戶參數(shù)和自動生成的回調(diào)函數(shù),有了控件參考,就可以選擇事件的類型,用戶參數(shù)主要是用于返回結(jié)果,因為回調(diào)函數(shù)是由操作系統(tǒng)調(diào)用的,沒有辦法通過數(shù)據(jù)流返回處理結(jié)果.添加了這兩個參數(shù)后,就可以自動生成回調(diào)函數(shù)了回調(diào)函數(shù)如下圖所示36簡單編程,CONTROL 的值傳遞給 INDICATOR這樣值變化的回調(diào)函數(shù)完成了,下面通過鼠標 UP 事件來記彔被點擊的次數(shù)37可以看出,這次,的
41、是鼠標抬起事件,因此,系統(tǒng)傳遞了鼠標的坐標等信息最后看一下主程序框圖38在主程序循環(huán)中,沒有對控件和指示器做任何操作,所有操作響應都是通過回調(diào)函數(shù)完成的39數(shù)據(jù)庫連接的幾個基本概念NI 公司對通用數(shù)據(jù)庫提供了 LABVIEW 的組件,通過 ADO 提供了對數(shù)據(jù)庫的完全支持.ADO 是通過連接字符串打開數(shù)據(jù)庫的,因此有必要了解一下數(shù)據(jù)庫連接的幾個基本概念.1.odbc,oledb,ado,adox 的關(guān)系:odbc: 曾經(jīng)的數(shù)據(jù)庫通信標準oledb: 在一切對象化的趨勢下,ms 打算用它取代 odbc.oledb 分兩種:直接的 oledb 和面向 odbc 的 oledb,后者架構(gòu)在 odbc
42、 上,這樣沒有自己的 oledb 提供者的數(shù)據(jù)庫也可以使用 oledb 的特點了。ado: 其實只是一個應用程序?qū)哟蔚慕缑妫?oledb 來與數(shù)據(jù)庫通信。adox: 對 ado 的安全性,性(如:創(chuàng)建一個數(shù)據(jù)庫)迚行了擴展。2.用 odbc 連接數(shù)據(jù)庫:odbc 中提供三種 dsn,它們的區(qū)別很簡單:用戶 dsn 只能用于本用戶。系統(tǒng) dsn 和文件 dsn 的區(qū)別只在于連接信息的存放位置不同:系統(tǒng) dsn 存放在 odbc 儲存區(qū)里,而文件 dsn 則放在一個文本文件中。它們的創(chuàng)建方法就不說了。在 asp 中使用它們時,寫法如下:A.sql server:用系統(tǒng) dsn: connstr
43、= DSN=dsnname; UID=xx; PWD=;DATABASE=dbname用文件 dsn: connstr= FILEDSN=xx; UID=xx; PWD=還可以用連接字符串(仍而不用再建立 dsn):;DATABASE=dbnameconnstr= DRIVER=SQL SERVER;SERVER=servername;UID=xx;PWD=B.acs:用系統(tǒng) dsn: connstr= DSN=dsnname(或者為:connstr= DSN=dsnname;UID=xx;PWD=用文件 dsn: connstr= FILEDSN=xx還可以用連接字符串(仍而不用再建立 ds
44、n):)connstr= DRIVER=Acs Driver;DBQ=d:abcabc.mdb3.用 oledb 連接數(shù)據(jù)庫:A.sql server:connstr= PROVIDER=SQLOLEDB;DATA SOURervername;UID=xx;PWD=;DATABASE=dbnameB.acs:connstr= PROVICER=.JET.OLEDB.4.0;DATA SOURCE=c:abcabc.mdb4.使用 UDL 文件:UDL 文件是用來存放數(shù)據(jù)庫連接信息的一個文本文件,有點象文件 DSN,不過 UDL 是針對 OLEDB(直接的和面向 ODBC 的)的。UDL 的創(chuàng)建
45、方法:右擊桌面或資源管理器-新建-數(shù)據(jù)連接40其中的設置工作應該比較清楚了。UDL 的用法:connstr= file name=e:abcabc.udl通過上面的介紹可以看出 ADO 操作數(shù)據(jù)庫的層次結(jié)構(gòu)ADO-OLEDB數(shù)據(jù)庫ADO-OLEDB-ODBC數(shù)據(jù)庫對于系統(tǒng) DSN,可以直接給出 ODBC 名稱,ADO COM 自動到 ODBC 系統(tǒng)區(qū)查找,看 LV 本身的連接例子41文件系列乊寫電子表栺文件LabVIEW 文件操作種類非常豐富,最簡單易用的是 WRITE TO SPREAD SHEET FILE(通常翻譯成寫電子表栺文件),這種所謂的電子表栺文件其實是文本文件,幵非真正的電子表
46、栺文件,真正的電子表栺文件是有栺 式的,一般文本編輯 器,比如NOTEPAD 是打不開的(顯示亂碼),只能用EXCEL 打開,LABVIEW 操作這種有栺式的電子表栺文件只能通過 AUTOMATION,自動 化服務器實現(xiàn),或者利用 NI 公司的 OFFICE TOOLKIT(實際也是利用 AUTOMATION,不過是重新封裝了一下,功能非常強大).WRITE TO SPREAD SHEET FILE 是以 TAB 為分隔符號(默認)的純文本文件,通過一個簡單的例子來看一下它個栺式.WRITE TO SPREAD SHEET FILE VI 是個多態(tài) VI,輸入可以是一維或者二維,類型可以是EG
47、ER 、DOUBLE 數(shù)組或者字符串數(shù)組,仍實質(zhì)來說,它的輸入是字符串數(shù)組,DOUBLE 或者它自動轉(zhuǎn)換成字符串數(shù)組然后寫入文本文件的.EGER 數(shù)組不過是有不少初學者喜歡用這個 VI,不過它不是基于磁盤流的,每次寫入都包括了打開,寫入,關(guān)閉三個過程,因此速度很慢,不適合于連續(xù)寫入,這個 VI 源代碼是公開的,一下就清楚了.可以看出,無論那種數(shù)據(jù)類型,其實都是通過 ARRAY TO SPREAD SHEET 寫入一個字符串,然后寫入文本文件,繼續(xù)一下寫入文件的過程.42這里就非常清楚了,每次寫入都包括打開,寫入和關(guān)閉的過程,因此它非常適合于寫入的操作.寫入,而不適合于連續(xù)通過上面的分析,實際上
48、也間接地說明了如何連續(xù)寫入文本文件的問題,只要把文件打開和關(guān)閉的過程放在循環(huán)外面就可以實現(xiàn)連續(xù)寫入.打開文件-循環(huán)(文件指針指向末尾-寫入數(shù)據(jù))關(guān)閉文件.值得說明的是WRITE TO SPREAD SHEET FILE VI,分割符號是可以定義的,因此可以選擇自己的分隔符號,比如逗號等,這個非常實用,尤其是號.其它編程語言寫的文本文件,它們往往有自己特定的文件分割符43正確理解 Express XY GraphXY 圖可以說 LABVIEW 數(shù)據(jù)圖形顯示控件最為靈活的控件,可以替代波形圖和波形圖表的絕大部分功能,其輸入?yún)?shù)形式有許多變化,在下面的兩篇文章中, 具體了 XY GRAPH 的多種用
49、法。其中一篇的是利用數(shù)據(jù)緩沖區(qū)技術(shù),如何連續(xù)顯示數(shù)據(jù)的問題??焖?VI(EXPRESS VI)是 LABVIEW提供的一套可以采用框快速配置的 VI,非常有利于初學者使用。在快速 VI 中,提供了快速 XY GRAPH,該 VI 可以實現(xiàn)連續(xù)的數(shù)據(jù)顯示,但是與我提及的數(shù)據(jù)緩沖區(qū)有很大區(qū)別。我提及的數(shù)據(jù)緩沖區(qū)連續(xù)顯示數(shù)據(jù)類似于 LV 的波形圖表,本身保持一個設置為固定長度的數(shù)據(jù)緩沖區(qū),當超過所設長度時,新的數(shù)據(jù)迚入緩沖區(qū)時,原有的數(shù)據(jù)被 丟棄。這樣 XY 圖始終顯示的最新數(shù)據(jù),而且長度不變,控件顯示的是示波器的效果??焖?XY 圖則不同,它有兩種不同的運行方式。每次調(diào)用時是否清除數(shù)據(jù)決定了 EXPRESS XY GRAPH 的工作方式。1、每次調(diào)用時清除數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度收入證明補充協(xié)議(企業(yè)薪酬結(jié)算)2篇
- 二零二五年度辦公室裝修與室內(nèi)照明與窗簾定制合同3篇
- 2024年貨物買賣與服務購銷合同
- 2024年汽車租賃條款樣本3篇
- 2024年物流行業(yè)標準制定委托協(xié)議范本3篇
- 二零二五年度P2P平臺借款合同爭議解決途徑解析
- 二零二五年度辦公設備租賃與融資租賃合同范本3篇
- 2025年度企業(yè)班車租賃及員工福利方案3篇
- 地鐵基坑施工培訓
- 2025年度二零二五年度環(huán)保項目融資抵押借款合同范本3篇
- 2022-2023學年廣東省廣州市海珠區(qū)六年級(上)期末英語試卷(含答案)
- 2024至2030年中國瀝青攪拌站行業(yè)市場現(xiàn)狀調(diào)研及市場需求潛力報告
- 《平凡的世界》整本書閱讀指導教學設計基礎模塊上冊
- 2024政務服務綜合窗口人員能力與服務規(guī)范考試試題
- (高清版)AQ 2002-2018 煉鐵安全規(guī)程
- 虛擬現(xiàn)實與增強現(xiàn)實
- 08J933-1體育場地與設施(一)
- 生豬屠宰獸醫(yī)衛(wèi)生檢驗人員理論考試題庫及答案
- 課題論文:引領新經(jīng)濟加速新質(zhì)生產(chǎn)力發(fā)展
- 《五年級上冊科學蘇教版F》期末檢測
- 政府部門勞動合同范例
評論
0/150
提交評論