TestStand​ 代碼​模​塊​開發​最佳​實踐【1】


概覽

使用​TestStand​創建​測試​程序​時,​核心​測試​功能​在​單獨​的​代碼​模​塊​中​實現。​TestStand​提供​的​適​配​器​可​調​用​使用​各種​編​程​環境​和​語言​(例如​LabVIEW、​LabVIEW NXG、​LabWindows™/​CVI™、​C#、​VB .NET、​C/​C​+​+和​ActiveX)​開發​的​代碼​模​塊。

​​本文​檔​討論​了​開發​測試​系統​代碼​模​塊​並從​測試​序列​中​調​用​這些​模​塊​時​可能​會​用到​的​最佳​實踐。​要​使用​本文​檔,​您​需要​掌握​TestStand​的​基本​工作​原理,​其中​包括​創建​基本​測試​序列​的​方法。​如果​您​不​熟悉​這些​概念,​請在​使用​本文​檔​之前​了解​以下​入門​資源: NI TestStand 基礎學習篇

內容

  • 確定​代碼​模​塊​開發​的​策略
  • 選擇​要​實現​功能​的​位置
  • 實現​代碼​模​塊​的​最佳​實踐
  • 使用​代碼​模​塊​中的​儀器

確定​代碼​模​塊​開發​的​策略

開始​開發​測試​系統​之前,​請​考慮​為​測試​系統​的​以下​方面​確定​一種​通用​方法:

  • 代碼​模​塊​的​粒度 — 定義​每​個​模​塊​的​功能​范圍。
  • 定義​測試​代碼​的​目錄​結構 — 定義​明確​的​目錄​結構​使​開發​人員​之間​可以​更​輕松​地​共享​代碼,​且​更易​於​測試​系統​的​代碼​部署。


代碼​模​塊​的​粒度

在​設計​測試​系統​時,​請​務必​為​代碼​模​塊​定義​一致​的​粒度​級別。 粒度​是​指​測試​系統​中​每​個​代碼​模​塊​的​功能​范圍。 粒度​低​的​測試​序列​調​用​的​代碼​模​塊​數量​少,​每​個​代碼​模​塊​執行​的​功能​更多;​而​粒度​高​的​測試​序列​調​用​的​代碼​模​塊​數量​多,​每​個​代碼​模​塊​執行​的​功能​更少。

 

低​粒度 高​粒度
  • 代碼​模​塊​更少,​更易​於​維護
  • 代碼​模​塊​調​用​次數​更少,​因而​提高​了​性能
  • 序列​文件​的​可讀​性​提高,​但​粒度​過​高​的​序列​會​導致​混亂
  • 更​容易​隔離​代碼​模​塊​中的​問題​和​漏洞

 

由於​二者​各有​優勢,​因此​您​應該​在​這些​極端​情況​之間​取得​平衡。 

利用​不同​的​粒度​級別​實現​簡單​測試


為了​在​整個​測試​系統​中​保持​一致​的​粒度,​需要​為​代碼​模​塊​開發​創建​一​組​標准,​例如:

  • 在​單獨​的​代碼​模​塊​中​執行​硬件​初始​化​和​關閉,​讓​TestStand​管理​硬件​會話​的​生命​周期。
  • 為​每​個​需求​項目​創建​單​個​測試​步驟,​從而​根據​測試​需求​確定​粒度。 這種​方法​可以​更​輕松​地​確保​所有​要求​均​得到​滿足。 此外,​NI Requirements Gateway​可與​TestStand​搭配​使用,​創建​測試​步驟​與​需求​文​檔​之間​的​關聯。 如需​更多​信息,​請​參閱《NI Requirements Gateway​與​TestStand​搭配​使用》​教程。
  • 所需​的​測試​結果​結構​可​用於​幫助​確定​各個​步驟​的​范圍。 由於​每​個​步驟​都會​生成​一個​結果​條目,​因此​創建​測試​步驟​到​所需​結果​條目​的​一對​一​映射​將使​組織​測試​結果​變得​更​容易,​且​對​報告​或​數據​庫​記錄​的​更改​最少。

 

定義​序列​文件​和​代碼​模​塊​的​目錄​結構

指定​測試​步驟​中​代碼​模​塊​的​路徑​時,​可​選擇​使用​絕對​路徑​或​相對​路徑。​建議​不要​使用​絕對​路徑,​原因​如下:

  • 在​磁盤​上​移動​序列​文件​及其​依賴​項​后,​相應​路徑​將​失效。
  • 如果​將​序列​文件​部署​到​目標​計算​機,​除非​文件​安裝​在​同一​位置,​否則​相應​路徑​將​失效。

指定​相對​路徑​時,​TestStand​會​使用​搜索​目錄​列表​來​解析​路徑。 這些​搜索​目錄​通常​包含​當前​序列​文件​目錄、​TestStand​特定​目錄​和​系統​目錄。

在​開始​開發​之前,​請​務必​為​測試​序列​和​代碼​模​塊​定義​文件​結構。 請​按照​以下​指南​定義​用於​存儲​序列​文件​和​代碼​模​塊​的​策略。

  • 對於​用於​單​個​序列​文件​的​代碼​模​塊,​請將​代碼​模​塊​文件​保存​在​與​序列​文件​相關​的​子​目錄​中。 這​將​確保,​即使​序列​文件​在​系統​中​移動​或​復制​到​另​一個​系統​上,​它​也​能夠​找到​代碼​模​塊。
  • 對於​在​多個​相關​序列​文件​之間​共享​的​代碼​模​塊,​如果​相關​序列​文件​保存​在​同一​目錄​中,​則​可以​使用​與​單​個​序列​文件​相同​的​方法。 考慮​創建​一個​工作​區​來​容納​所有​相關​的​序列​文件​和​代碼​模​塊。
  • 對於​在​多個​不​相關​的​序列​文件​之間​共享​的​代碼​模​塊,​請​考慮​創建​一個​特定​目錄​來​容納​所有​共享​的​代碼​模​塊,​並​創建​指向​此​位置​的​新​搜索​目錄。 這​將​確保​系統​中的​所有​序列​文件​都可以​使用​此​搜索​目錄​的​相對​路徑​來​找到​相應​文件。 部署​代碼​模​塊​時,​可​同時​部署​位於<TestStand Application Data>​\Cfg​\SearchDirectories.cfg的​搜索​目錄​配置​文件。 使用​此​方法​時,​請​不要​在​目錄​內​移動​代碼​模​塊​文件,​以免​破壞​調​用​序列​文件​時​指定​的​路徑。

定義​目錄​結構,​其中​代碼​模​塊​位於​序列​文件​的​子​目錄中

使用​TestStand​部署​工具​部署​測試​代碼​時,​可​為​序列​文件​和​相關​代碼​模​塊​選擇​特定​的​目標。 如果​序列​文件​和​代碼​模​塊​的​目標​目錄​之間​存在​相對​路徑,​則​TestStand​部署​工具​會​更新​序列​文件​中的​路徑​來​指向​更新​后​的​位置。 在​大​多數​情況​下,​最好​使​部署​的​目錄​結構​與​開發​系統​上​的​目錄​結構​相​匹配,​從而​確保​部署​與​開發​計算​機上​的​代碼​盡可能​相似。

選擇​要​實現​功能​的​位置

在​定義​測試​系統​的​代碼​模​塊​范圍​時,​請​務必​定義​在​代碼​模​塊​和​序列​文件​中​實現​功能​的​策略。​以下​部分​可​幫助​確定​最​適合​實現​常用​功能​的​位置:

  • 根據​極限​評估​測試​測量值
  • 定義​激勵值
  • 報告​並​記錄​測試​結果​和​錯誤
  • 循環​操作
  • 執行​開關​操作
  • 執行​計算​和​處理​數據


評估​極限​和​測試​結果

理想​情況​下,​代碼​模​塊​應​包含​與​獲得​測試​測量​值​直接​相關​的​功能,​並且​測試​序列​應​處理​原始​測試​結果。​這種​方法​具有​以下​優勢:

  • 由於​在​序列​文件​中​可​使用​屬性​加​載​器​等​工具​在​單​個​中心​節點​管理​多個​步驟​的​極限,​因此​測試​極限​在​序列​文件​中​更易​於​管理。
  • 序列​中​定義​的​測試​極限​將​自動​添加​到​測試​結果​中,​例如​報告​或​數據​庫。
  • 測試​極限​可在​不​更改​代碼​模​塊​的​情況​下​進行​更新,​並且​由於​只​修改​了​測試​序列,​因此​所需​的​驗證​更少。

為了​簡化​測量,​代碼​模​塊​可以​將​原始​測量​值​返回​到​序列​中​進行​處理。​例如,​如果​測試​步驟​用於​測量​待​測​設備​(UUT)​特定​引​腳上​的​電壓,​則​代碼​模​塊​應​返回​測量​值,​而不是​直接​在​代碼​模​塊​中​執行​檢查。 您​可以​使用​數值​邊界​測試​步驟​來​處理​該​值,​從而​確定​序列​文件​中的​測試​結果。

在​測試​步驟​中​評估​極限​可​簡化​代碼​模​塊​並​改進​結果​記錄

 

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

對於​更​復雜​的​數據,​請在​代碼​模​塊​中​處理​數據,​生成​數值​或​字符​串​結果,​然后​使用​參數​傳​出​原始​數據,​以便​記錄

 

如果​原始​數據​非常​大,​則​將​數據​傳遞​給​TestStand​的​過程​可能​會對​性能​產生​重大​影響。 在​這種​情況​下,​可​考慮​將​數據​直接​記錄​到​TDMS​文件​中,​並​在​測試​報告​中​添加​指向​該​文件​的​鏈​接。 如此​一​來,​可在​無​需​將​數據​傳遞​給​TestStand​的​情況​下​從​報告​中​引用​數據。 關於​此​方法​的​更多​信息,​請​參閱《在​報告​中​添加​超​鏈​接 — TDMS​文件》。

如果​該​步驟​無法​使用​測試​步驟​中​可用​的​評估​類型​來​確定​測試​結果,​請​考慮​創建​具有​附加​功能​的​新​步驟​類型​來​處理​所需​的​測試​類型。 關於​創建​自​定義​步驟​類型​的​更多​信息,​請​參閱​本​系列​中的《自​定義​步驟​類型​開發​的​最佳​實踐》​一文。


定義​測試​激勵

對於​許多​測試​而言,​UUT​或​測試​環境​必須​處於​特定​狀態​下​才能​執行​測試。 例如,​進行​溫度​測量​可能​需要​使用​激勵​電壓,​或者​必須​將​加熱​室​設置​為​指定​溫度。 對於​這些​類型​的​模​塊,​應​使用​參數​來​傳遞​輸入​值,​例如​激勵​電壓​或​所需​溫度。 與​上​一部分​所述​的​直接​在​代碼​中​處理​極限​相比,​這​與​在​測試​代碼​模​塊​中​返回​原始​數據​具有​許多​相同​的​優勢。


記錄​測試​結果

TestStand​具有​使用​測試​步驟​的​結果​來​生成​報告​和​記錄​數據​庫​的​內​置​功能。​因此,​請​避免​直接​在​代碼​模​塊​內​進行​任何​類型​的​數據​記錄。 相反,​請​確保​將要​記錄​的​所有​數據​以​參數​形式​傳​出,​並​使用​TestStand​記錄​相應​數據。 一些​數據​(例如​測試​結果、​極限​和​錯誤​信息)​將​自動​記錄。 要​記錄​其他​數據,​可​使用​其他​結果​功能​來​指定​要​添加​到​報告​中的​其他​參數。

關於​將​結果​添加​到​測試​報告​中的​更多​信息,​請​參閱​TestStand​隨​附​的《將​自​定義​數據​添加​到​報告》​示例。

如果​您​對​記錄​有​特定​要求,​請​考慮​修改​或​創建​結果​處理​插​件。​如此​一​來,​可以​使用​內​置​的​TestStand​結果​收集​功能​收集​結果,​同時​可以​確定​結果​的​處理​方式​和​顯示​方式。​如需​更多​信息,​請​參閱《TestStand​過程​模型​開發​和​自​定義​的​最佳​實踐》​文​檔​的“創建​插​件”部分


循環​操作

由於​實現​循環​的​每​種​方法​都有​其​自身​的​優​缺點,​因此​很​難​確定​理想​的​方法。​請​使用​以下​指南​來​幫助​確定​最​適合​您​的​應用​程序​的​策略:

在​代碼​模​塊​中​進行​內部​循環

  • 性能​得以​提高,​尤其是​在​快速​循環​時。 由於​每次​代碼​模​塊​調​用​都會​產生​幾​毫秒​的​開銷,​因此​使用​外部​循環​進行​數百​或​數​千​次​迭代​循環​會​影響​測試​速度。
  • 支持​更​復雜​的​循環​行為。 

在​序列​文件​中​進行​外部​循環

  • 直接​在​序列​文件​中​查看​和​修改​循環​設置,​不需要​修改​代碼​模​塊。
  • 輕松​訪問​序列​文件​中的​循環​索引。 這​對於​確定​基於​當前​迭代​而​變化​的​開關​路​由​或​其他​行為​很有​用。
  • 循環​的​每次​迭代​均​單獨​記錄,​在​報告​或​數據​庫​中​顯示​每次​迭代​的​結果。

 

執行​開關​操作

許多​測試​系統​可​借助​開關​功能​使用​單​個​硬件​測試​多個​待​測​區。 借助​預​定義​的​路​由,​開關​功能​支持​以​編​程​方式​控制​連接​到​特定​硬件​的​待​測​設備​(UUT)​引​腳。 

您​可以​通過​以下​方式​在​TestStand​代碼​模​塊​中​實現​開關​功能:

  • 使用​步驟​的​內​置​開關​屬性​(需要​NI Switch Executive)
  • 使用​TestStand IVI Switch​步驟​(僅​適用​於​32​位​TestStand)
  • 直接​在​代碼​模​塊​中​調​用​開關​驅動​程序​函數

使用​NI Switch​硬件​時,​NI Switch Executive​可​用於​快速​定義​路​由。​在​可以​訪問​NI Switch Executive​的​情況​下,​使用​內​置​的​步驟​設置​來​實現​開關​功能​通常​是​最佳​方法,​此​方法​具有​以下​優勢:

  • 在​步驟​中​定義​開關​配置​可以​將​開關​函數​與​測試​代碼​分離,​從而​提高​可​復​用​性​並​降低​代碼​模​塊​的​復雜​性。
  • 開關​設置​中的​許多​字​段​都是​通過​表達​式​指定​的,​因此​可​利用RunState.LoopIndex屬性​或​其他​變量​來​為​要​迭代​的​步驟​建立​路​由​或​路​由​組​名稱​的​索引。
  • 對於​並行​測試,​可在​路​由​字符​串​中​添加​測試​插​槽​索引(RunState.TestSockets.MyIndex),​對​每​個​測試​插​槽​使用​不同​的​開關​路​由。
  • 連接​生命​周期​可與​步驟、​序列、​線​程​或​執行​關聯​起來。


使用​NI Switch Executive​直接​在​TestStand​步驟​設置​中​指定​路​由,​包括​TestStand​表達​式​支持,​從而​使用​當前​循環​索引​或​其他​屬性​來​動態​確定​路由

 

關於​使用​開關​步驟​屬性​整合​開關​功能​的​更多​信息,​請​參見《借助​NI Switch Executive​加速​開發​並​簡化​維護》​在​線​教程。



執行​計算​和​處理​數據

為了​避免​為​較​簡單​的​任務​維護​代碼​模​塊,​可​使用​TestStand​中的​表達​式​語言​來​執行​基本​計算​和​單​維​數​組​操作。​由於​編​程​語言​提供​了​更​適合​這些​任務​且​更​強大​的​功能,​因此​應​在​代碼​模​塊​中​執行​更​高級​的​編​程​要求。 例如,​與​使用​表達​式​語言​相比,​使用​原生​LabVIEW​創建​數​組​函數​可​更​輕松​地​完成​多​維​數​組​的​連接。

在​某些​情況​下,​可​使用.NET​框架​隨​附​的​原生​類​避免​創建​過於​復雜​的​表達​式。 例如,​System.IO.Path​類​可在​無​需​創建​代碼​模​塊​的​情況​下​用於​快速​執行​路徑​操作。

無​需​代碼​模​塊​的​參與,​即可​借助.NET​步驟​來​使用.NET​框架​方法

實現​代碼​模​塊​的​最佳​實踐

實現​代碼​模​塊​時,​許多​設計​決策​都會​影響​創建​的​許多​代碼​模​塊。 本​部分​提供​有關​以下​概念的​指南:

  • 將​數據​從​TestStand​傳遞​到​代碼​模塊
  • 處理​代碼​模​塊​中的​序列​終止
  • 向​TestStand​報告​代碼​模​塊​錯誤
  • 管理​代碼​模​塊​的​執行​速度​和​內存​使用


將​數據​從​TestStand​傳遞​到​代碼​模塊

訪問​代碼​模​塊​中的​TestStand​數據​的​方法​有​兩​種:

  • 通過​代碼​模​塊​參數​傳遞​數據
  • 使用​TestStand API​在​代碼​模​塊​內​直接​訪問​數據


在​大​多數​情況​下,​與​使用​TestStand API​直接​訪問​數據​相比,​使用​參數​傳遞​數據​是​一種​更好​的​方法,​具體​原因​如下:

  • 出​錯​可能性​更低 — 由於​參數​值​是在​TestStand​的​步驟​類型​設置​中​定義​的,​而不是​直接​在​代碼​模​塊​中​定義​的,​因此​更​容易​發現​屬性​名稱​或​數據​類型​中的​錯誤。
  • 更易​於​維護 — 對​步驟​屬性​的​更改​是在​TestStand​的​參數​配置​中​指定​的,​無​需​修改​代碼​模​塊。
  • 更​容易​在​TestStand​之外​復用 — 由於​代碼​模​塊​不​依賴​於​TestStand API,​因此​模​塊​無​需​修改​即可​在​TestStand​之外​使用


盡可能​使用​參數​將​所需​數據​傳遞​到​代碼​模塊

 

但是,​根據​步驟​的​狀態,​當​代碼​模​塊​需要​動態​訪問​各種​數據​時,​使用​API​直接​訪問​屬性​可能​很有​幫助。 在​這種​情況​下,​使用​步驟​參數​會​導致​參數​過多,​而​在​不同​情況​下,​實際​用到​的​參數​只有​一部分。

如果​要​在​代碼​模​塊​中​使用​TestStand API,​則​需要​向​SequenceContext​對象​(ThisContext)​傳遞​一個​引用​作為​參數。​SequenceContext​對象​可​訪問​所有​其他​TestStand​對象,​包括​TestStand​引擎​和​當前​的​Runstate。​如果​使用​終止​監視​器​或​模​態​對話​框​VI,​則​需要​序列​上下文​引用。


使用​SequenceContext​訪問​代碼​模​塊​中的​TestStand API,​可​用於​以​編​程​方式​訪問​數據

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

對於​在​TestStand​之外​使用​的​代碼​模​塊,​請​使用Not a Number/​Path/​Refnum?檢查​SequenceContext​對象​引用​的​有效性

 

在​代碼​模​塊​中​處理​大型​數據集


在​許多​情況​下,​代碼​模​塊​會​在​測量​或​分析​過程​中​生成​大量​復雜​數據。 由於​TestStand​會​在​存儲​此類​數據​時​創建​數據​副本,​因此​請​避免​將​此類​數據​存儲​在​TestStand​變量​中。 這些​副本​可能​會​降低​Runtime​性能​和/​或​導致​內存​不足​錯誤。 使用​以下​方法​來​管理​大型​數據​集,​即可​避免​創建​不必要​的​副本:

  • 在​代碼​模​塊​內​處理​大型​數據​集,​例如​在​獲取​數據​的​同一​代碼​模​塊​中​分析​數據,​並且​僅​向​TestStand​返回​所需​的​結果
  • 在​TestStand​和​代碼​模​塊​之間​傳遞​數據​指針。 對於​LabVIEW​代碼​模​塊,​請​使用數據​值​引用​(DVR)


處理​代碼​模​塊​中的​序列​終止

用戶​按下“終止”按鈕​時,​TestStand​會​停止​執行​序列​並​運行​所有“清理”步驟。​但是,​如果​執行​調​用​了​代碼​模​塊,​則​該​模​塊​必須​完成​執行​並​將​控制​權​交回​TestStand,​然后​序列​才能​終止。​如果​代碼​模​塊​的​運行​時間​超過​數​秒,​或者​模​塊​需要​等待​用戶​輸入​之類​的​條件​發生,​對於​用戶​來說,​終止​命令​可能​會​被​忽略。

要​解決​此​問題,​可以​使用​終止​監視​器,​讓​代碼​模​塊​檢查​並​響應​調​用​執行​的​終止​狀態。​例如,“計算​機​主​板​測試”隨​附​范​例會​使用​仿真​對話​框​中的​終止​監視​器,​如下​圖​所​示。 如果​測試​序列​終止,​則​檢查​終止​狀態​VI​會​返回​假​值,​循環​停止。


處理​錯誤

測試​系統​中的​錯誤​是非​預期​Run-​Time​行為,​會​妨礙​測試​的​執行。​代碼​模​塊​產生​錯誤​時,​請將​該​信息​傳​回​測試​序列,​以此​確定​下一步​要​執行​的​操作,​例如​終止​執行、​重復​上​一次​測試​或​提示​測試​操作​員。

要​向​TestStand​提供​來自​代碼​模​塊​的​任何​錯誤​信息,​請​使用​步驟的Result.Error容器,​如下​圖​所​示。 執行​每​個​步驟​之后,​TestStand​都會​自動​檢查​此​屬性​來​確定​是否​發生​錯誤。 無​需​將​錯誤​信息​從​TestStand​傳遞​到​代碼​模​塊。​如果​代碼​模​塊​向​TestStand​返回​錯誤,​則​執行​過程​會​引出​分支​到​測試​序列​的​另一​部分,​例如“清理”步驟​組。

您​可以​使用“測試​站​選項”的“執行”選項​卡​中的“Run-​Time​錯誤”設置​來​確定​TestStand​響應​步驟​錯誤​的​方式。 通常,​在​開發​用於​協助​調​試​的​序列​時​應​使用“顯示​對話​框”選項,​因為​此​選項​可​中斷​執行​並​檢查​序列​的​當前​狀態。 對於​已​部署​的​系統,​請​考慮​使用“運行​清理”或“忽略”選項,​而不是​要求​測試​操作​員​進行​輸入。 錯誤​信息​將​自動​記錄​到​測試​結果​中,​可​用於​查找​錯誤​的​原因。
 


將​錯誤​信息​傳遞​到​Step.Result.Error​容器,​用於​通知​TestStand​是否​發生​了​步驟​錯誤


管理​代碼​模​塊​的​性能​和​內存​使用

默認​狀態​下,​在​文件​中​執行​序列​時,​TestStand​會​將​序列​文件​中的​所有​代碼​模​塊​加​載到​內存​中,​並​保持​加​載​狀態,​直到​關閉​序列​文件​為止。 使用​這些​設置​后,​如果​在​模​塊​加​載​的​同時​開始​一個​序列,​則會​出現​初始​延遲。 但是,​由於​模​塊​仍在​內存​中,​因此​序列​文件​的​后​續​執行​會​更​快。

步驟​設置​窗​格​的“運行​選項”選項​卡​可​用於​配置​何時​加​載​和​卸​載​代碼​模​塊。​通常,​默認​的​加​載​選項​可​提供​出色​的​性能,​但是​在​某些​情況​下,​可​將​加​載​選項​設置為動態​加載,​從而​使​代碼​模​塊​僅​在​使用​時​才​加​載,​這​可能是​一種​更好​的​選擇。 對於​不在​常用​執行​中​調​用​的​代碼​模​塊,​例如​僅​在​特定​測試​失敗​后​才​運行​的​診斷,​應​采取​動態​加​載​方式,​因為​在​大​多數​情況​下​這些​模​塊​根本​不需要​加​載。

請​注意,​在​動態​加​載​代碼​模​塊​時,​TestStand​只​會​在​加​載​代碼​模​塊​之后​才​會​報告​相應​代碼​模​塊​的​問題,​此時​漫長​的​執行​過程​可能​即將​結束。​但是,​可以​在​執行​之前​使用​序列​分析​儀​驗證​序列​中​是否​存在​錯誤。 分析​儀​將​檢查​靜態​和​動態​加​載​的​代碼​模​塊。

對於​內存​密集​型​代碼​模​塊,​可​修改​默認​的​卸​載​選項​來​減少​總​內存​使用​量。 例如,​將​模​塊​設置為步驟​執行​后​卸載或序列​執行​后​卸載。 但是,​此​更改​將​增加​執行​時間,​因為​TestStand​需要​為​每次​后​續​調​用​重新​加​載​模​塊。​如有​可能,​可以​使用​64​位​版本​的​TestStand​和​具有​更多​物理​內存​的​系統,​這種​方法​更好,​在​對​內存​使用​量​有​較​高​要求​的​情況​下​仍​獲得​出色​的​測試​性能。

如果​代碼​模​塊​維護​共享​數據,​例如​靜態​變量​或​LabVIEW​功能​全局​變量,​由於​在​模​塊​卸​載​時​會​丟失​全局​數據,​因此​修改​卸​載​選項​可能​會​導致​行為​改變。​更改​卸​載​選項​時,​請​確保​將​任何​必需​的​數據​傳遞​到​TestStand​序列​或​存儲​在​更​為​永久​的​位置,​防止​數據​丟失。

關於​優​化​測試​系統​性能​的​其他​方式​的​更多​信息,​請​參閱《提高​NI TestStand​系統​性能​的​最佳​實踐》。

 

使用​代碼​模​塊​中的​儀器

代碼​模​塊​的​常見​用途​是​與​測試​硬件​連接​以​設置​激勵​並​進行​測試​測量。 與​硬件​通信​的​方法​包括:

• 使用​硬件​驅動​程序​(例如​NI-​DAQmx)​直接​與​硬件​通信。
• 使用​儀器​驅動​程序,​此​驅動​程序​可在​內部​通過​VISA​或​IVI​硬件​驅動​程序​將​命令​發送​到​儀器。
所​采用​的​通信​方式​取決​於​使用​的​硬件​類型。 對於​這​兩​種​通信,​您​都​需要​在​進行​特定​驅動​程序​的​調​用​之前​打開​針對​驅動​程序​的​引用​或​會話,​並​在​交互​完成后​關閉​句柄。

 

選擇​管理​硬件​引用​的​方法

在​大​多數​情況​下,​您​將​在​多個​測試​步驟​中​與​同一​硬件​進行​通信。​為了​避免​在​每​個​代碼​模​塊​中​打開​和​關閉​儀器​會話​對​性能​的​影響,​請​務必​考慮​如何​在​測試​序列​中​管理​硬件​引用。 管理​硬件​引用​的​常用​方法​有​兩​種:

  • 通過​從​代碼​模​塊​調​用​初始​化​和​關閉​函數​來​手​動​管理​硬件​引用。
  • 使用​會話​管理​器​自動​管理​硬件​引用​生命​周期。

如果​使用​的是​儀器​驅動​程序,​或者​使用​VISA​或​IVI​驅動​程序​直接​與​儀器​通信,​除非​特別​需要​直接​控制​硬件​會話​生命​周期,​否則​請​使用​會話​管理​器。 如果​使用​的是​DAQmx​等​硬件​驅動​程序,​則​不能​使用​會話​管理​器,​必須​手​動​管理​引用。

 

使用​TestStand​變量​手​動​管理​硬件​引用

初始​化​儀器​時,​將會​話​引用​作為​輸出​參數​傳遞​給​調​用​序列,​然后​將​引用​存儲​在​變量​中。 然后,​可​將​變量​作為​輸入​傳遞​到​需要​訪問​儀器​的​各個​步驟。

包括​NI-​DAQmx​和​VISA​在內​的​許多​驅動​程序​以及​大​多數​儀器​驅動​程序​都​使用​I/​O​引用​數據​類型​來​存儲​會話​引用。​在​TestStand​中​使用​LabviewIOControl​數據​類型​來​存儲​這些​引用。 


使用​LabVIEWIOControl​類型​的​變量​在​代碼​模​塊​之間​傳遞​硬件​引用,​例如​DAQ​任務​引用

 

在​TestStand​和​代碼​模​塊​之間​顯​式​傳遞​儀器​句柄​時,​請將​硬件​引用​存儲​在​局部​變量​中。 如果​硬件​在​多個​序列​中​使用,​請將​句柄​作為​序列​參數​傳遞​給​有​需求​的​每​個​序列。 避免​使用​全局​變量​存儲​硬件​引用,​因為​可能​難以​確保​儀器​已​在​使用​引用​之前​完成​初始​化。

請​使用“設置”步驟​組​初始​化​硬件,​並​使用“清理”步驟​組​關閉​硬件​引用,​具體​原因​如下:

  • 由於​清除​步驟​組​總是​在​執行​終止​時​運行,​因此​如果​用戶​終止​序列​執行,​硬件​引用​仍​將​關閉。
  • 由於​設置​和​清除​步驟​組​會​在​所​選​步驟​之前​和​之后​執行,​因此​可​交互​地​執行​使用​硬件​引用​的​步驟。


使用“設置”和“清理”組​初始​化​和​關閉​硬件​引用

 


使用​會話​管理​器​自動​管理​硬件​引用

對於​VISA​和​IVI​儀器​句柄,​可​使用​會話​管理​器​自動​管理​硬件​引用。​使用​會話​管理​器​具有​諸​多​優勢,​包括:

  • 減少​耦合 — 不必​在​軟件​組​件​之間​傳遞​儀器​句柄​變量。​每​個​組​件​都會​指定​一個​邏輯​儀器​名稱​來​獲取​會話。
  • 減少​編​程​語言​障礙 — 用​不同​語言​編寫​的​代碼​模​塊​可以​使用​同一​會話,​而無​需​傳遞​可能​難以​在​各種​語言​之間​轉換​的​句柄。
  • 生命​周期​控制 — 由於​儀器​會話​是​具有​引用​計數​的​ActiveX​對象,​因此​可​將會​話​的​生命​周期​與​ActiveX​引用​變量​的​生命​周期​相關​聯,​而無​需​使用​支持​ActiveX​引用​變量​的​語言​顯​式​關閉​儀器。

會話​管理​器​會​在​創建​會話​后​自動​初始​化​相應​句柄,​並​在​針對​此​會話​的​最后​一個​引用​釋放​后​自動​關閉​相應​句柄。​代碼​模​塊​和​序列​會​傳遞​一個​邏輯​名稱​(例如“DMM1”),​用於​從​會話​管理​器​中​獲取​會話​對象,​該​對象​包含​相應​的​儀器​句柄。

使用​會話​管理​器​時,​請將​會話​對象​存儲​在​TestStand​對象​引用​變量​中。 由於​會話​生命​周期​與​對象​引用​變量​的​生命​周期​相關​聯,​因此​無論​有​多少​序列​代碼​模​塊​和子​序列​訪問​同一​會話,​每次​執行​時​儀器​句柄​都會​初始​化​和​關閉​一次。

在​以下​示例​中,“獲取​DMM​會話”步驟​使用​邏輯​名稱​獲取​針對​DMM​儀器​會話​對象​的​引用。​此​步驟​將會​話​引用​存儲​在​局部​變量​中,​使​會話​在​序列​執行​期間​保持​初始​化​狀態。

借助​會話​管理​器,​可​使用​邏輯​名稱​引用​儀器。 會話​管理​器​VI​使用​邏輯​名稱​獲取​DMM IO​引用



關於​如何​使用​會話​管理​器​的​更多​信息,​請​參閱<Program Files>​\National Instruments​\Shared​\Session Manager中的《NI​會話​管理​器​幫助》。

上​一個​示例​序列​從​調​用​會話​管理​器​的​LabVIEW​代碼​模​塊​中​獲取​會話,​而不是​直接​調​用​會話​管理​器,​因為​該​示例​將​LabVIEW​適​配​器​配置​為​在​單獨​的​進程​中​運行​VI。 關於​如何​使用​會話​管理​器​的​更多​信息,​請​參閱<Program Files>​\National Instruments​\Shared​\Session Manager中的《NI​會話​管理​器​幫助》。


調​用​硬件​驅動​程序庫

要​與​任意​類型​的​硬件​通信,​需要​使用​驅動​程序​庫,​該​庫​提供​的​一系列​功能​有助​於​使用​編​程​語言​執行​各種​任務。 使用​驅動​程序​庫​時,​通常​會​調​用​多個​VI​或​函數​來​執行​單​個​邏輯​操作,​例如​進行​測量​或​配置​觸發​器。 創建​代碼​模​塊​來​實現​此​功能,​而不是​直接​在​TestStand​步驟​中​調​用​庫​函數,​此​方法​具有​以下​優勢:

  • 避免​了​針對​各​函數​的​步驟​功能​產生​的​開銷
  • 提供​了​驅動​程序​調​用​和​TestStand​序列​之間​的​抽象層
  • 更易​於​跨​測試​程序​共享​實現​過程

本文轉載:

https://www.ni.com/content/ni/locales/zh-cn/support/documentation/supplemental/09/teststand-code-module-development-best-practices.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM