官术网_书友最值得收藏!

5.3.3 當前上下文(ThisContext)屬性

在變量窗格中還有一級屬性ThisContext,它的數據類型很特殊,即Sequence Context(序列上下文)。“序列上下文”從字面上理解就是一個序列的所有信息,因此展開ThisContext時,會發現它同樣包含了Locals、Parameters、FileGlobals、StationGlobals、ThisContext、RunState等所有變量窗格中的一級屬性,如圖5-20所示。由此可見,ThisContext包含的信息量是很大的。

在5.3.2節介紹運行時屬性時,提到RunState容器下包含的動態屬性RunState.Root、RunState.Main、RunState.Caller等在序列編輯狀態時值為空,在序列執行時TestStand傳遞了序列上下文類型引用給它們,這樣它們就包含了不同序列的上下文信息,如圖5-21所示。

圖5-20 展開ThisContext一級屬性

圖5-21 RunState容器下的Sequence Context類型子屬性

ThisContext的數據類型是序列上下文,而且它指向的是當前序列,一般會將ThisContext作為參數傳遞給代碼模塊或者其他序列,這相當于把當前序列的所有信息傳遞了出去。細心的讀者可能會發現,在圖5-21中,變量窗格中有一個ThisContext,而RunState下也有一個ThisContext,這兩個屬性是否有聯系?回答是肯定的,它們其實是同一個屬性,ThisContext就是RunState.ThisContext的拷貝,“This”這種表達方式指的就是創建一個指向自己的引用。TestStand為了方便數據傳遞和訪問起見,在每個序列上下文容器中都額外創建了ThisContext,用于指向這個序列上下文本身。可以預見的是,如果將ThisContext傳遞給代碼模塊,在代碼模塊中就可以訪問當前序列的所有信息,也可以對序列中屬性和變量的值進行修改。

下面的練習讀者可任選其一。

【練習5-4A】傳遞ThisContext屬性給LabVIEW代碼模塊

在本練習中,將ThisContext作為參數傳遞給LabVIEW VI,然后在VI中獲取ThisContext中屬性和變量的值。

(1)打開序列編輯器,新建一個序列文件并將其保存為<Exercises>\Chapter 5\Sequence Context\ThisContext-LabVIEW.seq。

(2)創建數值型局部變量Locals.input_a和Locals.output_b,以及字符串型局部變量Locals.status。

(3)在插入選板中選擇模塊適配器為“LabVIEW”。

(4)添加動作步驟,并將其命名為“Get Local Variable”,在模塊頁面VI路徑中選擇Get TestStand Variable through ThisContext.vi,該VI位于<Exercises>\Chapter 5\Sequence Context。讀者可以查看它的程序框圖,如圖5-22所示,非常簡單,調用了TestStand選板函數TestStand-Get Property Value.vi,它是一個多態函數,這里選擇多態實例為“Number”。它的輸入參數為“Sequence Context In”,結合“Lookup String”就可以獲取子屬性或變量,查找字符串就是子屬性或變量的訪問路徑,如ThisContext.RunState.Sequence。第11章中還會詳細介紹查找字符串的方法。

圖5-22 Get TestStand Variable through ThisContext.vi程序框圖

說明:所有TestStand選板函數都是在TestStand安裝時自動添加到LabVIEW應用開發環境中的。

回到TestStand,在參數列表中,Sequence Context In的值為“ThisContext”,Lookup String的值為“"Locals.input_a"”,其他參數設置如圖5-23所示。

(5)添加動作步驟,并將其命名為“Get Property Value”,在VI路徑中選擇Get TestStand Property through ThisContext.vi,該VI位于<Exercises>\Chapter 5\Sequence Context。同樣可以查看它的程序框圖,如圖5-24所示,它調用的也是TestStand選板函數TestStand-Get Property Value.vi,選擇多態實例為“String”。

回到TestStand,在參數列表中,Sequence Context In的值為“ThisContext”,Lookup String的值為“"RunState.Sequence.Main[Get Local Variable].Result.Status"”,其他參數設置如圖5-25所示。

圖5-23 Get Local Variable步驟參數列表

圖5-24 Get TestStand Property through ThisContext.vi程序框圖

圖5-25 Get Property Value步驟參數列表

(6)添加消息對話框步驟,在消息表達式中輸入“"The value of Locals.output_b is"+Str(Locals.output_b)+"\n"+"The status of step\"Get Local Variable\"is"+Locals.status”。

(7)保存序列文件,執行菜單命令“ExecuteSingle Pass”,觀察消息對話框的彈出結果,如圖5-26所示。

圖5-26 消息對話框結果

在范例資源的第5章練習中,例程<Exercises>\Chapter 5\Sequence Context\ThisContext-LabVIEW-solution.seq完成的是上面的練習,讀者可以通過菜單命令“ExecuteSingle Pass”運行該范例并觀察結果。

【練習5-4B】傳遞ThisContext屬性給CVI代碼模塊

在本練習中,將ThisContext作為參數傳遞給LabWindows/CVI生成的DLL,通過DLL獲取ThisContext中的屬性和變量的值。

(1)打開序列編輯器,新建一個序列文件并將其保存為<Exercises>\Chapter 5\Sequence Context\ThisContext-CVI.seq。

(2)創建數值型局部變量Locals.input_a和Locals.output_b,以及字符串型局部變量Locals.status,保持初始默認值。

(3)在插入選板中選擇模塊適配器為“LabWindows/CVI”。

(4)添加動作步驟,并將其命名為“Get Local Variable”,在模塊頁面DLL路徑中選擇“PassThisContext.dll”,該DLL位于<Exercises>\Chapter 5\Sequence Context\CVI Project。PassThisContext.dll一共導出兩個函數:Get_Num_Variable和Get_Str_Variable,分別獲取數值型屬性/變量的值和字符串型屬性/變量的值(如圖5-27所示)。其中調用了TestStand函數庫TS_PropertyGetValNumber和TS_PropertyGetValString,位于“NI TestStand API 20××Property ObjectValues”下,如圖5-28所示。它們有兩個關鍵的輸入參數:ThisContext和LookupString。ThisContext結合Lookup String就可以獲取子屬性或變量,查找字符串就是子屬性或變量的訪問路徑,如ThisContext.RunState.Sequence。第11章中還會詳細介紹查找字符串的方法。

圖5-27 PassThisContext.dll導出函數原型

圖5-28 LabWindows/CVI中的TestStand函數庫

說明:關于TestStand函數庫,第13章中會詳細介紹,包括如何將函數庫添加到工程中。

回到TestStand,選擇函數Get_Num_Variable,在參數列表中,Sequence Context In的值為“ThisContext”,Lookup String的值為“"Locals.input_a"”,其他參數設置如圖5-29所示。

圖5-29 Get_Num_Value步驟參數列表

(5)添加動作步驟,并將其命名為“Get Property Value”,在模塊頁面DLL路徑中同樣選擇PassThisContext.dll,選擇Get_Str_Variable函數。在參數配置列表中,Sequence Context In的值為“ThisContext”,Lookup String的值為“"RunState.Sequence.Main[Get Local Variable].Result.Status"”,其他參數設置如圖5-30所示。

圖5-30 Get_Str_Value步驟參數列表

(6)添加消息對話框步驟,在消息表達式中輸入“"The value of Locals.output_b is"+Str(Locals.output_b)+"\n"+"The status of step\"Get Local Variable\"is"+Locals.status”。

圖5-31 消息對話框結果

(7)保存序列文件,執行菜單命令“ExecuteSingle Pass”,觀察消息對話框的彈出結果,如圖5-31所示。

在范例資源的第5章練習中,例程<Exercises>\Chapter 5\Sequence Context\ThisContext-CVI-solution.seq完成的是上面的練習,讀者可以通過菜單命令“ExecuteSingle Pass”運行該范例并觀察結果。

因為“ThisContext”就是當前的序列上下文,動作步驟Get Local Variable通過查找字符串"Locals.Input_a"獲取到局部變量Locals.input_a的值,進行一定運算后再返回給Locas.Output_b。動作步驟Get Property Value通過查找字符串"RunState.Sequence.Main[Get Local Variable].Result.Status"獲取前一步驟Get Local Variable的狀態,因此在消息對話框中會得到它的狀態“Done”。這個練習主要是告訴我們,將ThisContext傳遞給代碼模塊,只要能夠提供屬性和變量的訪問路徑,那么當前序列的所有上下文信息在代碼模塊中都是可以訪問并被修改的。

說明:本書不會對LabVIEW或LabWindows/CVI中的具體編程做更細致的介紹,讀者可以參考書中提供的范例代碼,以加快對知識點的掌握。

主站蜘蛛池模板: 云霄县| 富平县| 乐业县| 永顺县| 通道| 乌什县| 高淳县| 张家港市| 民丰县| 通城县| 定南县| 阿图什市| 东台市| 全椒县| 江达县| 信丰县| 大邑县| 南漳县| 金湖县| 赞皇县| 定西市| 印江| 织金县| 额尔古纳市| 砚山县| 油尖旺区| 佳木斯市| 西林县| 宝坻区| 新绛县| 龙江县| 沅陵县| 奇台县| 肥西县| 洛阳市| 辽宁省| 南开区| 清原| 枣阳市| 嘉黎县| 新疆|