使用TestStand創(chuàng)建測試程序時,核心測試功能在單獨的代碼模塊中實現(xiàn)。TestStand提供的適配器可調(diào)用使用各種編程環(huán)境和語言(例如LabVIEW、LabVIEW NXG、LabWindows?/CVI?、C#、VB .NET、C/C++和ActiveX)開發(fā)的代碼模塊。
本文檔討論了開發(fā)測試系統(tǒng)代碼模塊并從測試序列中調(diào)用這些模塊時可能會用到的最佳實踐。要使用本文檔,您需要掌握TestStand的基本工作原理,其中包括創(chuàng)建基本測試序列的方法。
內(nèi)容
· 確定代碼模塊開發(fā)的策略
· 選擇要實現(xiàn)功能的位置
· 實現(xiàn)代碼模塊的最佳實踐
· 使用代碼模塊中的儀器
· 查閱TestStand高級架構(gòu)系列的其他章節(jié)
1 確定代碼模塊開發(fā)的策略
開始開發(fā)測試系統(tǒng)之前,請考慮為測試系統(tǒng)的以下方面確定一種通用方法:
· 代碼模塊的粒度 — 定義每個模塊的功能范圍。
· 定義測試代碼的目錄結(jié)構(gòu) — 定義明確的目錄結(jié)構(gòu)使開發(fā)人員之間可以更輕松地共享代碼,且更易于測試系統(tǒng)的代碼部署。
代碼模塊的粒度
在設(shè)計測試系統(tǒng)時,請務(wù)必為代碼模塊定義一致的粒度級別。 粒度是指測試系統(tǒng)中每個代碼模塊的功能范圍。 粒度低的測試序列調(diào)用的代碼模塊數(shù)量少,每個代碼模塊執(zhí)行的功能更多;而粒度高的測試序列調(diào)用的代碼模塊數(shù)量多,每個代碼模塊執(zhí)行的功能更少。
低粒度
· 代碼模塊更少,更易于維護
· 代碼模塊調(diào)用次數(shù)更少,因而提高了性能
高粒度
· 序列文件的可讀性提高,但粒度過高的序列會導致混亂
· 更容易隔離代碼模塊中的問題和漏洞
由于二者各有優(yōu)勢,因此您應(yīng)該在這些極端情況之間取得平衡。

利用不同的粒度級別實現(xiàn)簡單測試
為了在整個測試系統(tǒng)中保持一致的粒度,需要為代碼模塊開發(fā)創(chuàng)建一組標準,例如:
· 在單獨的代碼模塊中執(zhí)行硬件初始化和關(guān)閉,讓TestStand管理硬件會話的生命周期。
· 為每個需求項目創(chuàng)建單個測試步驟,從而根據(jù)測試需求確定粒度。 這種方法可以更輕松地確保所有要求均得到滿足。 此外,NI Requirements Gateway可與TestStand搭配使用,創(chuàng)建測試步驟與需求文檔之間的關(guān)聯(lián)。 如需更多信息,請參閱《NI Requirements Gateway與TestStand搭配使用》教程。
· 所需的測試結(jié)果結(jié)構(gòu)可用于幫助確定各個步驟的范圍。 由于每個步驟都會生成一個結(jié)果條目,因此創(chuàng)建測試步驟到所需結(jié)果條目的一對一映射將使組織測試結(jié)果變得更容易,且對報告或數(shù)據(jù)庫記錄的更改最少。
定義序列文件和代碼模塊的目錄結(jié)構(gòu)
指定測試步驟中代碼模塊的路徑時,可選擇使用絕對路徑或相對路徑。建議不要使用絕對路徑,原因如下:
· 在磁盤上移動序列文件及其依賴項后,相應(yīng)路徑將失效。
· 如果將序列文件部署到目標計算機,除非文件安裝在同一位置,否則相應(yīng)路徑將失效。
指定相對路徑時,TestStand會使用搜索目錄列表來解析路徑。 這些搜索目錄通常包含當前序列文件目錄、TestStand特定目錄和系統(tǒng)目錄。
在開始開發(fā)之前,請務(wù)必為測試序列和代碼模塊定義文件結(jié)構(gòu)。 請按照以下指南定義用于存儲序列文件和代碼模塊的策略。
· 對于用于單個序列文件的代碼模塊,請將代碼模塊文件保存在與序列文件相關(guān)的子目錄中。 這將確保,即使序列文件在系統(tǒng)中移動或復制到另一個系統(tǒng)上,它也能夠找到代碼模塊。
· 對于在多個相關(guān)序列文件之間共享的代碼模塊,如果相關(guān)序列文件保存在同一目錄中,則可以使用與單個序列文件相同的方法。 考慮創(chuàng)建一個工作區(qū)來容納所有相關(guān)的序列文件和代碼模塊。
· 對于在多個不相關(guān)的序列文件之間共享的代碼模塊,請考慮創(chuàng)建一個特定目錄來容納所有共享的代碼模塊,并創(chuàng)建指向此位置的新搜索目錄。 這將確保系統(tǒng)中的所有序列文件都可以使用此搜索目錄的相對路徑來找到相應(yīng)文件。 部署代碼模塊時,可同時部署位于\Cfg\SearchDirectories.cfg的搜索目錄配置文件。 使用此方法時,請不要在目錄內(nèi)移動代碼模塊文件,以免破壞調(diào)用序列文件時指定的路徑。

定義目錄結(jié)構(gòu),其中代碼模塊位于序列文件的子目錄中
使用TestStand部署工具部署測試代碼時,可為序列文件和相關(guān)代碼模塊選擇特定的目標。 如果序列文件和代碼模塊的目標目錄之間存在相對路徑,則TestStand部署工具會更新序列文件中的路徑來指向更新后的位置。 在大多數(shù)情況下,最好使部署的目錄結(jié)構(gòu)與開發(fā)系統(tǒng)上的目錄結(jié)構(gòu)相匹配,從而確保部署與開發(fā)計算機上的代碼盡可能相似。
2 選擇要實現(xiàn)功能的位置
在定義測試系統(tǒng)的代碼模塊范圍時,請務(wù)必定義在代碼模塊和序列文件中實現(xiàn)功能的策略。以下部分可幫助確定最適合實現(xiàn)常用功能的位置:
· 根據(jù)極限評估測試測量值
· 定義激勵值
· 報告并記錄測試結(jié)果和錯誤
· 循環(huán)操作
· 執(zhí)行開關(guān)操作
· 執(zhí)行計算和處理數(shù)據(jù)
評估極限和測試結(jié)果
理想情況下,代碼模塊應(yīng)包含與獲得測試測量值直接相關(guān)的功能,并且測試序列應(yīng)處理原始測試結(jié)果。這種方法具有以下優(yōu)勢:
· 由于在序列文件中可使用屬性加載器等工具在單個中心節(jié)點管理多個步驟的極限,因此測試極限在序列文件中更易于管理。
· 序列中定義的測試極限將自動添加到測試結(jié)果中,例如報告或數(shù)據(jù)庫。
· 測試極限可在不更改代碼模塊的情況下進行更新,并且由于只修改了測試序列,因此所需的驗證更少。
為了簡化測量,代碼模塊可以將原始測量值返回到序列中進行處理。例如,如果測試步驟用于測量待測設(shè)備(UUT)特定引腳上的電壓,則代碼模塊應(yīng)返回測量值,而不是直接在代碼模塊中執(zhí)行檢查。 您可以使用數(shù)值邊界測試步驟來處理該值,從而確定序列文件中的測試結(jié)果。

在測試步驟中評估極限可簡化代碼模塊并改進結(jié)果記錄
但是,由于某些測試十分復雜,因此并非總是能夠在序列文件中處理原始測試結(jié)果。 對于更復雜的測量,可能需要對結(jié)果數(shù)據(jù)進行進一步處理。 復雜數(shù)據(jù)可處理為單個字符串或數(shù)值結(jié)果,然后便可以在TestStand中使用字符串或數(shù)值比較功能對其進行評估。 例如,掃頻測試的結(jié)果很復雜,無法直接進行評估,但可以將這些數(shù)據(jù)處理為代表最小值的單個數(shù)字。 在這種情況下,代碼模塊應(yīng)評估處理后的結(jié)果,并以單獨的參數(shù)形式返回頻率數(shù)據(jù),以便記錄,如下面的移動設(shè)備測試示例所示:

對于更復雜的數(shù)據(jù),請在代碼模塊中處理數(shù)據(jù),生成數(shù)值或字符串結(jié)果,然后使用參數(shù)傳出原始數(shù)據(jù),以便記錄
如果原始數(shù)據(jù)非常大,則將數(shù)據(jù)傳遞給TestStand的過程可能會對性能產(chǎn)生重大影響。 在這種情況下,可考慮將數(shù)據(jù)直接記錄到TDMS文件中,并在測試報告中添加指向該文件的鏈接。 如此一來,可在無需將數(shù)據(jù)傳遞給TestStand的情況下從報告中引用數(shù)據(jù)。 關(guān)于此方法的更多信息,請參閱《在報告中添加超鏈接 — TDMS文件》。
如果該步驟無法使用測試步驟中可用的評估類型來確定測試結(jié)果,請考慮創(chuàng)建具有附加功能的新步驟類型來處理所需的測試類型。 關(guān)于創(chuàng)建自定義步驟類型的更多信息,請參閱本系列中的《自定義步驟類型開發(fā)的最佳實踐》一文。
定義測試激勵
對于許多測試而言,UUT或測試環(huán)境必須處于特定狀態(tài)下才能執(zhí)行測試。 例如,進行溫度測量可能需要使用激勵電壓,或者必須將加熱室設(shè)置為指定溫度。 對于這些類型的模塊,應(yīng)使用參數(shù)來傳遞輸入值,例如激勵電壓或所需溫度。 與上一部分所述的直接在代碼中處理極限相比,這與在測試代碼模塊中返回原始數(shù)據(jù)具有許多相同的優(yōu)勢。
記錄測試結(jié)果
TestStand具有使用測試步驟的結(jié)果來生成報告和記錄數(shù)據(jù)庫的內(nèi)置功能。因此,請避免直接在代碼模塊內(nèi)進行任何類型的數(shù)據(jù)記錄。 相反,請確保將要記錄的所有數(shù)據(jù)以參數(shù)形式傳出,并使用TestStand記錄相應(yīng)數(shù)據(jù)。 一些數(shù)據(jù)(例如測試結(jié)果、極限和錯誤信息)將自動記錄。 要記錄其他數(shù)據(jù),可使用其他結(jié)果功能來指定要添加到報告中的其他參數(shù)。
關(guān)于將結(jié)果添加到測試報告中的更多信息,請參閱TestStand隨附的《將自定義數(shù)據(jù)添加到報告》示例。
如果您對記錄有特定要求,請考慮修改或創(chuàng)建結(jié)果處理插件。如此一來,可以使用內(nèi)置的TestStand結(jié)果收集功能收集結(jié)果,同時可以確定結(jié)果的處理方式和顯示方式。如需更多信息,請參閱《TestStand過程模型開發(fā)和自定義的最佳實踐》文檔的“創(chuàng)建插件”部分
循環(huán)操作
由于實現(xiàn)循環(huán)的每種方法都有其自身的優(yōu)缺點,因此很難確定理想的方法。請使用以下指南來幫助確定最適合您的應(yīng)用程序的策略:
在代碼模塊中進行內(nèi)部循環(huán)
· 性能得以提高,尤其是在快速循環(huán)時。 由于每次代碼模塊調(diào)用都會產(chǎn)生幾毫秒的開銷,因此使用外部循環(huán)進行數(shù)百或數(shù)千次迭代循環(huán)會影響測試速度。
· 支持更復雜的循環(huán)行為。
在序列文件中進行外部循環(huán)
· 直接在序列文件中查看和修改循環(huán)設(shè)置,不需要修改代碼模塊。
· 輕松訪問序列文件中的循環(huán)索引。 這對于確定基于當前迭代而變化的開關(guān)路由或其他行為很有用。
· 循環(huán)的每次迭代均單獨記錄,在報告或數(shù)據(jù)庫中顯示每次迭代的結(jié)果。
執(zhí)行開關(guān)操作
許多測試系統(tǒng)可借助開關(guān)功能使用單個硬件測試多個待測區(qū)。 借助預定義的路由,開關(guān)功能支持以編程方式控制連接到特定硬件的待測設(shè)備(UUT)引腳。
您可以通過以下方式在TestStand代碼模塊中實現(xiàn)開關(guān)功能:
· 使用步驟的內(nèi)置開關(guān)屬性(需要NI Switch Executive)
· 使用TestStand IVI Switch步驟(僅適用于32位TestStand)
· 直接在代碼模塊中調(diào)用開關(guān)驅(qū)動程序函數(shù)
使用NI Switch硬件時,NI Switch Executive可用于快速定義路由。在可以訪問NI Switch Executive的情況下,使用內(nèi)置的步驟設(shè)置來實現(xiàn)開關(guān)功能通常是最佳方法,此方法具有以下優(yōu)勢:
· 在步驟中定義開關(guān)配置可以將開關(guān)函數(shù)與測試代碼分離,從而提高可復用性并降低代碼模塊的復雜性。
· 開關(guān)設(shè)置中的許多字段都是通過表達式指定的,因此可利用RunState.LoopIndex屬性或其他變量來為要迭代的步驟建立路由或路由組名稱的索引。
· 對于并行測試,可在路由字符串中添加測試插槽索引(RunState.TestSockets.MyIndex),對每個測試插槽使用不同的開關(guān)路由。
· 連接生命周期可與步驟、序列、線程或執(zhí)行關(guān)聯(lián)起來。

使用NI Switch Executive直接在TestStand步驟設(shè)置中指定路由,包括TestStand表達式支持,從而使用當前循環(huán)索引或其他屬性來動態(tài)確定路由
關(guān)于使用開關(guān)步驟屬性整合開關(guān)功能的更多信息,請參見《借助NI Switch Executive加速開發(fā)并簡化維護》在線教程。
執(zhí)行計算和處理數(shù)據(jù)
為了避免為較簡單的任務(wù)維護代碼模塊,可使用TestStand中的表達式語言來執(zhí)行基本計算和單維數(shù)組操作。由于編程語言提供了更適合這些任務(wù)且更強大的功能,因此應(yīng)在代碼模塊中執(zhí)行更高級的編程要求。 例如,與使用表達式語言相比,使用原生LabVIEW創(chuàng)建數(shù)組函數(shù)可更輕松地完成多維數(shù)組的連接。
在某些情況下,可使用.NET框架隨附的原生類避免創(chuàng)建過于復雜的表達式。 例如,System.IO.Path類可在無需創(chuàng)建代碼模塊的情況下用于快速執(zhí)行路徑操作。

無需代碼模塊的參與,即可借助.NET步驟來使用.NET框架方法
3 實現(xiàn)代碼模塊的最佳實踐
實現(xiàn)代碼模塊時,許多設(shè)計決策都會影響創(chuàng)建的許多代碼模塊。 本部分提供有關(guān)以下概念的指南:
· 將數(shù)據(jù)從TestStand傳遞到代碼模塊
· 處理代碼模塊中的序列終止
· 向TestStand報告代碼模塊錯誤
· 管理代碼模塊的執(zhí)行速度和內(nèi)存使用
將數(shù)據(jù)從TestStand傳遞到代碼模塊
訪問代碼模塊中的TestStand數(shù)據(jù)的方法有兩種:
· 通過代碼模塊參數(shù)傳遞數(shù)據(jù)
· 使用TestStand API在代碼模塊內(nèi)直接訪問數(shù)據(jù)
在大多數(shù)情況下,與使用TestStand API直接訪問數(shù)據(jù)相比,使用參數(shù)傳遞數(shù)據(jù)是一種更好的方法,具體原因如下:
· 出錯可能性更低 — 由于參數(shù)值是在TestStand的步驟類型設(shè)置中定義的,而不是直接在代碼模塊中定義的,因此更容易發(fā)現(xiàn)屬性名稱或數(shù)據(jù)類型中的錯誤。
· 更易于維護 — 對步驟屬性的更改是在TestStand的參數(shù)配置中指定的,無需修改代碼模塊。
· 更容易在TestStand之外復用 — 由于代碼模塊不依賴于TestStand API,因此模塊無需修改即可在TestStand之外使用

盡可能使用參數(shù)將所需數(shù)據(jù)傳遞到代碼模塊
但是,根據(jù)步驟的狀態(tài),當代碼模塊需要動態(tài)訪問各種數(shù)據(jù)時,使用API直接訪問屬性可能很有幫助。 在這種情況下,使用步驟參數(shù)會導致參數(shù)過多,而在不同情況下,實際用到的參數(shù)只有一部分。
如果要在代碼模塊中使用TestStand API,則需要向SequenceContext對象(ThisContext)傳遞一個引用作為參數(shù)。SequenceContext對象可訪問所有其他TestStand對象,包括TestStand引擎和當前的Runstate。如果使用終止監(jiān)視器或模態(tài)對話框VI,則需要序列上下文引用。

使用SequenceContext訪問代碼模塊中的TestStand API,可用于以編程方式訪問數(shù)據(jù)
如果要在TestStand之外復用代碼模塊,請記住,只有在從TestStand序列調(diào)用相應(yīng)模塊的情況下,才能使用TestStand API進行操作。模塊通過API從TestStand獲取的所有數(shù)據(jù)將不可用。 從TestStand外部調(diào)用代碼模塊時,可先檢查序列上下文引用是否為空,從而定義獲取測試數(shù)據(jù)的備用機制。 在LabVIEW中,可以使用Not A Number/Path/Refnum?函數(shù),它會返回一個布爾值,如圖3所示。

對于在TestStand之外使用的代碼模塊,請使用Not a Number/Path/Refnum?檢查SequenceContext對象引用的有效性
在代碼模塊中處理大型數(shù)據(jù)集
在許多情況下,代碼模塊會在測量或分析過程中生成大量復雜數(shù)據(jù)。 由于TestStand會在存儲此類數(shù)據(jù)時創(chuàng)建數(shù)據(jù)副本,因此請避免將此類數(shù)據(jù)存儲在TestStand變量中。 這些副本可能會降低Runtime性能和/或?qū)е聝?nèi)存不足錯誤。 使用以下方法來管理大型數(shù)據(jù)集,即可避免創(chuàng)建不必要的副本:
· 在代碼模塊內(nèi)處理大型數(shù)據(jù)集,例如在獲取數(shù)據(jù)的同一代碼模塊中分析數(shù)據(jù),并且僅向TestStand返回所需的結(jié)果
· 在TestStand和代碼模塊之間傳遞數(shù)據(jù)指針。 對于LabVIEW代碼模塊,請使用數(shù)據(jù)值引用(DVR)
處理代碼模塊中的序列終止
用戶按下“終止”按鈕時,TestStand會停止執(zhí)行序列并運行所有“清理”步驟。但是,如果執(zhí)行調(diào)用了代碼模塊,則該模塊必須完成執(zhí)行并將控制權(quán)交回TestStand,然后序列才能終止。如果代碼模塊的運行時間超過數(shù)秒,或者模塊需要等待用戶輸入之類的條件發(fā)生,對于用戶來說,終止命令可能會被忽略。
要解決此問題,可以使用終止監(jiān)視器,讓代碼模塊檢查并響應(yīng)調(diào)用執(zhí)行的終止狀態(tài)。例如,“計算機主板測試”隨附范例會使用仿真對話框中的終止監(jiān)視器,如下圖所示。 如果測試序列終止,則檢查終止狀態(tài)VI會返回假值,循環(huán)停止。

關(guān)于使用終止監(jiān)視器的更多信息,請參閱終止監(jiān)視器示例。
處理錯誤
測試系統(tǒng)中的錯誤是非預期Run-Time行為,會妨礙測試的執(zhí)行。代碼模塊產(chǎn)生錯誤時,請將該信息傳回測試序列,以此確定下一步要執(zhí)行的操作,例如終止執(zhí)行、重復上一次測試或提示測試操作員。
要向TestStand提供來自代碼模塊的任何錯誤信息,請使用步驟的Result.Error容器,如下圖所示。 執(zhí)行每個步驟之后,TestStand都會自動檢查此屬性來確定是否發(fā)生錯誤。 無需將錯誤信息從TestStand傳遞到代碼模塊。如果代碼模塊向TestStand返回錯誤,則執(zhí)行過程會引出分支到測試序列的另一部分,例如“清理”步驟組。
您可以使用“測試站選項”的“執(zhí)行”選項卡中的“Run-Time錯誤”設(shè)置來確定TestStand響應(yīng)步驟錯誤的方式。 通常,在開發(fā)用于協(xié)助調(diào)試的序列時應(yīng)使用“顯示對話框”選項,因為此選項可中斷執(zhí)行并檢查序列的當前狀態(tài)。 對于已部署的系統(tǒng),請考慮使用“運行清理”或“忽略”選項,而不是要求測試操作員進行輸入。 錯誤信息將自動記錄到測試結(jié)果中,可用于查找錯誤的原因。

將錯誤信息傳遞到Step.Result.Error容器,用于通知TestStand是否發(fā)生了步驟錯誤
管理代碼模塊的性能和內(nèi)存使用
默認狀態(tài)下,在文件中執(zhí)行序列時,TestStand會將序列文件中的所有代碼模塊加載到內(nèi)存中,并保持加載狀態(tài),直到關(guān)閉序列文件為止。 使用這些設(shè)置后,如果在模塊加載的同時開始一個序列,則會出現(xiàn)初始延遲。 但是,由于模塊仍在內(nèi)存中,因此序列文件的后續(xù)執(zhí)行會更快。
步驟設(shè)置窗格的“運行選項”選項卡可用于配置何時加載和卸載代碼模塊。通常,默認的加載選項可提供出色的性能,但是在某些情況下,可將加載選項設(shè)置為動態(tài)加載,從而使代碼模塊僅在使用時才加載,這可能是一種更好的選擇。 對于不在常用執(zhí)行中調(diào)用的代碼模塊,例如僅在特定測試失敗后才運行的診斷,應(yīng)采取動態(tài)加載方式,因為在大多數(shù)情況下這些模塊根本不需要加載。
請注意,在動態(tài)加載代碼模塊時,TestStand只會在加載代碼模塊之后才會報告相應(yīng)代碼模塊的問題,此時漫長的執(zhí)行過程可能即將結(jié)束。但是,可以在執(zhí)行之前使用序列分析儀驗證序列中是否存在錯誤。 分析儀將檢查靜態(tài)和動態(tài)加載的代碼模塊。
對于內(nèi)存密集型代碼模塊,可修改默認的卸載選項來減少總內(nèi)存使用量。 例如,將模塊設(shè)置為步驟執(zhí)行后卸載或序列執(zhí)行后卸載。 但是,此更改將增加執(zhí)行時間,因為TestStand需要為每次后續(xù)調(diào)用重新加載模塊。如有可能,可以使用64位版本的TestStand和具有更多物理內(nèi)存的系統(tǒng),這種方法更好,在對內(nèi)存使用量有較高要求的情況下仍獲得出色的測試性能。
如果代碼模塊維護共享數(shù)據(jù),例如靜態(tài)變量或LabVIEW功能全局變量,由于在模塊卸載時會丟失全局數(shù)據(jù),因此修改卸載選項可能會導致行為改變。更改卸載選項時,請確保將任何必需的數(shù)據(jù)傳遞到TestStand序列或存儲在更為永久的位置,防止數(shù)據(jù)丟失。
關(guān)于優(yōu)化測試系統(tǒng)性能的其他方式的更多信息,請參閱《提高NI TestStand系統(tǒng)性能的最佳實踐》。
4 使用代碼模塊中的儀器
代碼模塊的常見用途是與測試硬件連接以設(shè)置激勵并進行測試測量。 與硬件通信的方法包括:
? 使用硬件驅(qū)動程序(例如NI-DAQmx)直接與硬件通信。
? 使用儀器驅(qū)動程序,此驅(qū)動程序可在內(nèi)部通過VISA或IVI硬件驅(qū)動程序?qū)⒚畎l(fā)送到儀器。
所采用的通信方式取決于使用的硬件類型。 對于這兩種通信,您都需要在進行特定驅(qū)動程序的調(diào)用之前打開針對驅(qū)動程序的引用或會話,并在交互完成后關(guān)閉句柄。
選擇管理硬件引用的方法
在大多數(shù)情況下,您將在多個測試步驟中與同一硬件進行通信。為了避免在每個代碼模塊中打開和關(guān)閉儀器會話對性能的影響,請務(wù)必考慮如何在測試序列中管理硬件引用。 管理硬件引用的常用方法有兩種:
? 通過從代碼模塊調(diào)用初始化和關(guān)閉函數(shù)來手動管理硬件引用。
? 使用會話管理器自動管理硬件引用生命周期。
如果使用的是儀器驅(qū)動程序,或者使用VISA或IVI驅(qū)動程序直接與儀器通信,除非特別需要直接控制硬件會話生命周期,否則請使用會話管理器。 如果使用的是DAQmx等硬件驅(qū)動程序,則不能使用會話管理器,必須手動管理引用。
使用TestStand變量手動管理硬件引用
初始化儀器時,將會話引用作為輸出參數(shù)傳遞給調(diào)用序列,然后將引用存儲在變量中。 然后,可將變量作為輸入傳遞到需要訪問儀器的各個步驟。
包括NI-DAQmx和VISA在內(nèi)的許多驅(qū)動程序以及大多數(shù)儀器驅(qū)動程序都使用I/O引用數(shù)據(jù)類型來存儲會話引用。在TestStand中使用LabviewIOControl數(shù)據(jù)類型來存儲這些引用。

使用LabVIEWIOControl類型的變量在代碼模塊之間傳遞硬件引用,例如DAQ任務(wù)引用
在TestStand和代碼模塊之間顯式傳遞儀器句柄時,請將硬件引用存儲在局部變量中。 如果硬件在多個序列中使用,請將句柄作為序列參數(shù)傳遞給有需求的每個序列。 避免使用全局變量存儲硬件引用,因為可能難以確保儀器已在使用引用之前完成初始化。
請使用“設(shè)置”步驟組初始化硬件,并使用“清理”步驟組關(guān)閉硬件引用,具體原因如下:
? 由于清除步驟組總是在執(zhí)行終止時運行,因此如果用戶終止序列執(zhí)行,硬件引用仍將關(guān)閉。
? 由于設(shè)置和清除步驟組會在所選步驟之前和之后執(zhí)行,因此可交互地執(zhí)行使用硬件引用的步驟。

使用“設(shè)置”和“清理”組初始化和關(guān)閉硬件引用
使用會話管理器自動管理硬件引用
對于VISA和IVI儀器句柄,可使用會話管理器自動管理硬件引用。使用會話管理器具有諸多優(yōu)勢,包括:
? 減少耦合 — 不必在軟件組件之間傳遞儀器句柄變量。每個組件都會指定一個邏輯儀器名稱來獲取會話。
? 減少編程語言障礙 — 用不同語言編寫的代碼模塊可以使用同一會話,而無需傳遞可能難以在各種語言之間轉(zhuǎn)換的句柄。
? 生命周期控制 — 由于儀器會話是具有引用計數(shù)的ActiveX對象,因此可將會話的生命周期與ActiveX引用變量的生命周期相關(guān)聯(lián),而無需使用支持ActiveX引用變量的語言顯式關(guān)閉儀器。
會話管理器會在創(chuàng)建會話后自動初始化相應(yīng)句柄,并在針對此會話的最后一個引用釋放后自動關(guān)閉相應(yīng)句柄。代碼模塊和序列會傳遞一個邏輯名稱(例如“DMM1”),用于從會話管理器中獲取會話對象,該對象包含相應(yīng)的儀器句柄。
使用會話管理器時,請將會話對象存儲在TestStand對象引用變量中。 由于會話生命周期與對象引用變量的生命周期相關(guān)聯(lián),因此無論有多少序列代碼模塊和子序列訪問同一會話,每次執(zhí)行時儀器句柄都會初始化和關(guān)閉一次。
在以下示例中,“獲取DMM會話”步驟使用邏輯名稱獲取針對DMM儀器會話對象的引用。此步驟將會話引用存儲在局部變量中,使會話在序列執(zhí)行期間保持初始化狀態(tài)。

借助會話管理器,可使用邏輯名稱引用儀器。 會話管理器VI使用邏輯名稱獲取DMM IO引用
關(guān)于如何使用會話管理器的更多信息,請參閱\National Instruments\Shared\Session Manager中的《NI會話管理器幫助》。
上一個示例序列從調(diào)用會話管理器的LabVIEW代碼模塊中獲取會話,而不是直接調(diào)用會話管理器,因為該示例將LabVIEW適配器配置為在單獨的進程中運行VI。 關(guān)于如何使用會話管理器的更多信息,請參閱\National Instruments\Shared\Session Manager中的《NI會話管理器幫助》。
調(diào)用硬件驅(qū)動程序庫
要與任意類型的硬件通信,需要使用驅(qū)動程序庫,該庫提供的一系列功能有助于使用編程語言執(zhí)行各種任務(wù)。 使用驅(qū)動程序庫時,通常會調(diào)用多個VI或函數(shù)來執(zhí)行單個邏輯操作,例如進行測量或配置觸發(fā)器。 創(chuàng)建代碼模塊來實現(xiàn)此功能,而不是直接在TestStand步驟中調(diào)用庫函數(shù),此方法具有以下優(yōu)勢:
? 避免了針對各函數(shù)的步驟功能產(chǎn)生的開銷
? 提供了驅(qū)動程序調(diào)用和TestStand序列之間的抽象層
? 更易于跨測試程序共享實現(xiàn)過程





廣告






















































