回看自己的博客已經有五年之久了,最近幾年也只是逛逛園子,看看別人寫的文章和新聞板塊,也可能是這兩年從事的工作偏離了大眾,對於一些新語言、新工具、也只能看看了,壓根不是很了解。
園子里面相對於工控、測試、仿真人員基本很少,相關文章也很少,工業控制方面編程語言NI Labview圖像化、數據流、模塊化的編程語言確實屬於小眾了;對於半實物仿真測試有興趣的或者對NI VeriStand仿真平台想了解的,希望可以對於你們有幫助;以及后續基於NI VeriStand仿真引擎開發自己的HIL(硬件在環)仿真測試環境;先熟悉下,NI的HIL仿真平台NI VeriStand;


1. 概述
VeriStand是美國 National Instruments公司專門針對HiL仿真測試系統而開發出的軟件環境。
VeriStand是一種基於配置的軟件環境,它簡單易用,無需編程就完成實時測試系統的創建,實現HIL測試中所需的各種功能。NI VeriStand能夠配置模擬、數字和基於FPGA的硬件I/O接口;能夠配置激勵生成、記錄數據、計算通道和事件警報;能夠從NI LabVIEW和MathWorks Simulink®等建模環境中導入控制算法和仿真模型;能夠利用操作界面實時在線監控運行任務並與之交互。

本文檔介紹了NI VeriStand各項主要功能的使用方法,並按照通用的開發測試順序編寫,主要內容包括:
- 創建軟件模型(基於Matlab);
- 創建MiL測試系統;
2. 創建軟件模型(基於Matlab)
Veristand支持市面上主流的圖形建模工具以及代碼建模開發工具所生成的模型庫的導入。包括MathWorks, Inc.的Simulink®軟件、ITI的SimulationX、Maplesoft的MapleSim、Gamma Technologies Inc.的GT-POWER,YHSIM以及其他編程環境所創建並編譯的函數或模型代碼。本文介紹基於matlab2015b以及Veristand2015 sp1版本的模型建立。Veristand可以從NI官網下載,程序安裝順序,先裝matlab R2015b開發環境,再裝NI VeriStand。
NI VeriStand可以利用*.dll文件導入由Matlab/Simulink創建的算法或仿真模型,下圖所示為Simulink模型導入NI VeriStand的過程:

注意:veristand 2015 sp1版本支持

不同版本的veristand支持不同版本的matlab生成的模型庫,可以從ni官網查找版本對應;
2.1 創建被控對象模型
下面過程將演示如何將Simulink中的發動機Engine模型,轉換為VeriStand可用的被控對象模型。
搜索Modeling Engine Timing Using Triggered Subsystem打開Simulink模型: Modeling Engine Timing Using Triggered Subsystem另存到新建工作目錄中,例如 D:\NIVS_HandsOn,為避免和原有模型沖突,重命名為Engine.mdl。

該發動機模型要求的輸入信號為
- Throttle Angle 節氣門開度
- Drag Torque 拖拽扭矩(負載扭矩)
輸出信號為
- Engine Speed 發動機轉速
關於該模型的具體信息,請參考Simulink幫助文檔。

運行后結果如下所示,上圖為發動機模型所需輸入信號,黃色曲線為負載扭矩,紫色曲線為節氣門開度;下圖中為發動機模型計算的輸出信號,黃色曲線為發動機轉速。
- 0~5s,節氣門開度不變,負載扭矩在2s時,由25 Nm 下降到20 Nm,發動機轉速因負載扭矩變小而提高;
- 5s時,節氣門開度增加,負載不變時,發動機轉速快速升高;
- 8s時,負載扭矩再次增加,節氣門開度不變,轉速下降。

1.正確安裝VeriStand后,在Simulink Library Browser 中會自動添加 NI VeriStand Blocks,如下圖所示:

2.修改模型
將模型中需要做映射的端口,用相應的NIVeriStand In 和NIVeriStand Out 替代;
完成修改后的發動機模型如下所示:

3.設置編譯環境並編譯
1) 打開Simulink模型的Configuration Parameters (快捷鍵:Ctrl+E),
2) 在Code Generation中,指定System target file為NIVeriStand.tlc,點擊OK確認。
注意:如果實時目標機為cRIO系列,此處要選擇NIVeriStand_VxWorks.tlc

3) 回到Solver頁面,選擇定步長求解器:fixed step-size ordinary differential equation(ODE) solver
注意:NI VeriStand只支持使用定步長的常微分方程求解器

4) 指定步長:Fixed-step size (fundamental sample time)為0.001,也就是1kHz
5) 注意:步長越小仿真模型計算越准確,但相應的會消耗更多技術資源。修改完步長后,要再次運行仿真模型,觀察結果,既要避免因步長選擇過大,出現如無法收斂,計算精度無法滿足要求,又要避免過小的步長造成cpu運算負擔過大,影響實時性。
6) 點擊 Build Model圖標或者Ctrl + B,開始編譯
7) ![]()
8) 編譯成功后,Matlab的Command Windows中出現下列提示,
9) ### Successful completion of Real-Time Workshop build procedure for model: ModelName,
10)並生成與Engine.mdl同名的Engine.dll文件,保存在新生成的Engine_niVeriStand_rtw文件夾內.

2.2 創建控制器模型
在Simulink提供的Demo Engine Timing Model with Closed Loop Control中包含了控制器ECU的算法。我們需要把其中的控制器(Controller)算法從閉環模型中分割出來,建立單獨的ECU模型,並編譯為對應的 *.dll文件。
Controller采用PI控制算法,可根據目標發動機轉速,結合發動機模型中的負載扭矩,計算出節氣門開度,最終使發動機實際轉速與目標轉速一致。
下圖中黃色曲線為發動機負載曲線,紫色曲線為控制器輸出的節氣門開度
1) 2s時,由25 Nm變為20 Nm
2) 8s時,由20 Nm變為25 Nm

下圖中黃色曲線為目標轉速(Speed Setpoint),在5s時由2000 rpm跳變為3000 rpm,紫色曲線為實際轉速。

- 分割、修改ECU模型
1) 打開所需的Demo:Engine Timing Model with Closed Loop Control

2) 提取模型中的Controller子模塊

3) 添加NIVeriStand In、NIVeriStand Out和NIVeriStandSignalProbe,另存為Ecu.mdl。修改后的ECU模型如下所示:

4) 設置編譯環境並編譯,最終生成所需的Ecu.dll文件。具體配置過程請參考發動機模型轉換部分。

3. 創建MiL測試環境
在上一章中,我們准備好了Engine和Ecu的軟件模型,在本章中,我們會將其導入到NI VeriStand中,創建一個MiL (Model-in-the-Loop) 測試環境,並介紹如何在Work Space中添加控件,控制和觀察Engine、Ecu的行為。
1.運行 NI VeriStand
Start » Program Files » National Instruments » NI VeriStand » NI VeriStand.
2.新建一個項目(Create a new project).
1) 選擇 File » New Project.或者直接選擇NEW NI VeriStand Project
2) 在Project Name中輸入項目名稱:ecu hil hands on.
3) 指定項目根目錄 Project Root Folder 到 <Public Documents>\National Instruments\NI VeriStand 2015 \Projects
4) 勾選Create folder for project.
5) 點擊OK確認.

3.點擊 Configure Project, 打開項目瀏覽器Project Explorer.
項目瀏覽器(Project Explorer) 用於配置測試所需的全部設置。通過Project Explorer可以部署(Deploy)和運行(Run)系統定義文件。項目瀏覽器包括所有運行和自動化測試所需關鍵的參數,同時也可以添加定制文件
4.展開 System Definition File 節點.

5.鼠標右鍵單擊 <ProjectName>.nivssdf 文件,選擇 Launch System Explorer.
系統瀏覽器 (System Explorer) 用於創建NI Veristand系統定義文件。系統定義文件是一個配置NI Veristand引擎特性的文件。通過添加,刪除和修改位於系統瀏覽器左部的各項配置可以定義各種屬性,包括NI VeriStand引擎的執行方式、硬件端口、計算通道、對仿真模型的控制、報警,執行順序以及管理通道之間的映射關系。完成系統定義文件的設置后,它將被部署到NI VeriStand 引擎並開始運行。
6.添加發動機Engine模型
1) 展開Targets » Controller,點擊Simulation Models;
2) 添加模型 Add Simulation Model.

3) 將目錄轉換到Engine.dll所在目錄

4) 選擇Engine.dll,單擊 OK.確認
發動機模型有2個輸入 (節氣門開度和負載扭矩) 和1個輸出(發動機輸出)。
7.添加控制器ECU模型
1) 點擊 Simulation Models,添加仿真模型 Add Simulation Model;
2) 選擇Ecu.dll,單擊 OK 確認。
控制器模型包含2個輸入(目標轉速rpm和實際轉速 rad/s)和1個輸出(節氣門位置)。目標轉速由上位機給定、實際轉速來自於發動機模型,ECU計算出的節氣門位置再傳遞給發動機模型。
8.調整發動機模型和控制器模型的運行順序
1) 在System Explorer左側的樹狀結構中選擇Execution Order;
2) 將發動機模型的色條由Group1拖到Group2

9.現在需要將發動機和控制器模型的輸入輸出端口映射到一起
1) 從菜單中選擇Tools » Edit Mappings
2) 從Sources 來源窗口中選擇Simulation Models » Models » Ecu » Outports » throttle angle setpoint
3) 從Destinations目標窗口中選擇Simulation Models » Models » Engine » Inports » Throttle Angle.
4) 點擊Connect,完成兩個信號的相互映射

10.NI VeriStand中也可以實現批量導入導出映射配置文件
1) 在System Mapping的工具條上點擊Open.
2) 選擇文件映射文件 <Public Documents>\National Instruments\NI VeriStand\Projects\ecu hil hands on\ecu hil mapping.txt.
3) 點擊Import,導入剩余的映射配置到VeriStand中.
4) 點擊Exit,所有的映射關系會在Mappings的列表中顯示出來

11.添加標定參數,實現在線標定功能
1) 展開 Models » Ecu » Parameters,里面包含了Simulink模型中所有Block的參數
2) 雙擊Source窗口中的 Proportional Gain,添加PI控制器的比例系數
3) 雙擊Source窗口中的 Integral Gain,添加PI控制器的積分系數

12.在System Explorer的樹狀節點中選擇 Controller。
此頁面包括以下組件:
目標規格 - 包括以下組件:
- 名稱 - 指定系統的名稱。您指定的名稱將替換控制器配置樹。
- 操作系統 -指定目標的操作系統。您可以從以下選項中進行選擇:
- PharLap
- VxWorks
- Windows - (默認)
- Linux_32_ARM
- Linux_x64
- P地址 - 指定目標的IP地址。
- 處理器分配 - 包括以下組件,可用於指定執行VeriStand Engine 的主控制循環和數據處理循環的處理器:
- 主控制回路模式 -指定用於確定運行主控制回路的處理器的模式。您可以從以下選項中進行選擇:
- 自動 - (默認)RT調度程序確定在每個迭代執行循環的最佳處理器。
- 手動 -執行您在“ 處理器”字段中指定的處理器上的循環。如果目標具有多個處理器,NI建議您選擇此選項,以便RT調度程序不會通過重復確定最佳處理器來危及系統時序。
- 處理器 -指定執行循環的處理器。默認值為-2(任何可用的處理器)。如果指定了無效的處理器,則循環將在第一個可用處理器上執行。
- 數據處理循環模式 -指定用於確定運行數據處理循環的處理器的模式。您可以從以下選項中進行選擇:
- 自動 - (默認)RT調度程序確定在每個迭代執行循環的最佳處理器。
- 手動 -執行您在“ 處理器”字段中指定的處理器上的循環。如果目標具有多個處理器,NI建議您選擇此選項,以便RT調度程序不會通過重復確定最佳處理器來危及系統時序。
- 處理器 -指定執行循環的處理器。默認值為-2(任何可用的處理器)。如果指定了無效的處理器,則循環將在第一個可用處理器上執行。
- 目標抽取 - 包括以下組件,可用於指定各種循環從主控制循環獲取更新數據的頻率:
- 數據處理循環 -指定數據處理循環從主控制循環讀取值的頻率。默認值為1,這意味着每次主控制循環執行時,數據處理循環讀取值。但是,如果您知道系統通道表中的值不會頻繁更改,則可以指定更高的值來加速整個系統的執行時間。例如,如果指定10,則數據處理循環僅在主控循環的每十次迭代讀取值。
- 其他設置 - 包括以下組件:
- 最大流量通道 - 指定VeriStand Engine可以流式傳輸到主機的通道的最大數量。默認值為512。
- 執行模式 - 指定VeriStand Engine循環的執行模式。您可以從以下選項中進行選擇:
- 並行 - (默認)並行執行VeriStand Engine的所有循環。在這種模式下,系統僅寫入值,並啟動的執行模型執行循環(一個或多個)對系統的第一次迭代中,但它並沒有從環路(一個或多個)讀取的值。在第二次和隨后的迭代中,系統從先前執行的模型執行循環中讀取值。這會導致執行模型時出現一個周期的延遲,但可以提高整個系統的執行速度,特別是在多核目標上。
- 低延遲 - 並行執行VeriStand Engine的所有循環,但在系統的每次迭代(包括第一個)中寫入值,執行和讀取模型執行循環中的值。National Instruments建議您僅在需要最小化輸入,型號執行和輸出之間的延遲時才選擇此模式。在每次迭代中等待模型執行循環讀取,執行和寫入可能會顯着降低系統的執行速度。
- 過濾DAQ錯誤 -指定是否從NI-DAQmx函數調用中過濾錯誤。如果您不希望在NI-DAQ設備報告錯誤時關閉系統,請選擇此選項。該數據采集錯誤系統通道仍寄存器過濾錯誤,這樣就可以監視該信道跟蹤誤差DAQ如果您選擇此選項。
- 濾波器看門狗錯誤 -指定是否過濾由定時監視器報告的錯誤。例如,如果將主控制循環設置為高速執行,並且系統包含大型或復雜型號,則如果型號無法快速執行以跟上主控制回路,則看門狗會報告錯誤。如果您希望NI VeriStand忽略這些錯誤,請選擇此選項。
- FPGA /掃描界面模式 -指定NI掃描引擎在RT目標上的界面模式。您可以使用此選項來覆蓋NI掃描引擎的當前設置,這對某些C系列模塊(如NI 986x系列設備)非常有用。此選項被禁用,並且對Windows目標沒有影響。
- 您可以從以下選項中進行選擇:
- 使用當前 - (默認)使用當前配置的NI掃描引擎接口模式。NI VeriStand不會覆蓋任何設置。
- FPGA模式 - 將NI掃描引擎設置為LabVIEW FPGA接口模式。
- 掃描模式 - 將NI掃描引擎設置為掃描界面模式。
- DAQ DIO速率 -指定DIO循環讀取和寫入DAQ數字線路值的赫茲速率。默認值為100 Hz。
- 預熱時間 -指定系統在開始記錄延遲計數之前必須等待的時間量(以秒為單位)。使用此選項可以避免在初始化系統執行后的最初幾秒鍾內由於預期的抖動而收到延遲計數錯誤。
- 定時源設置 -包括以下可用於指定系統時序的組件:
- 主控制回路定時源 -指定系統的定時源。定時源將系統發送給主控制回路。您可以從以下選項中進行選擇:
- 自動定時 - (默認)NI VeriStand確定要使用的定時源。如果在機箱配置頁面上指定有效的定時設備作為機箱主硬件同步設備,NI VeriStand將使用該設備作為定時源。如果您沒有在該頁面上指定有效的定時設備,NI VeriStand將選擇第一個可用的定時設備。定時設備可以包括具有至少一個模擬輸入通道的NI-DAQ設備,任何NI FPGA設備或定制設備。如果系統不包括有效的定時設備,NI VeriStand將使用您指定的目標速率來計時系統。
- DAQ Timing -NI VeriStand在系統中使用NI-DAQ設備作為定時源。將具有至少一個模擬輸入通道的NI-DAQ設備添加到配置樹以啟用此選項。
- 自定義設備定時 -NI VeriStand使用您指定的定制設備作為時序源。
- 目標速率 - 以Hz為單位指定目標速率。默認值為100.如果您的系統定義不包含有效的硬件或定制設備定時源,NI VeriStand將使用此值來計算主控制循環的執行時間。
- 定時源超時 -指定主控制循環在超時之前等待從定時源接收到其第一個刻度的時間(秒)。
- 定時源設置 - [主控制回路定時源:DAQ Timing]指定主控制回路的定時源設置:
- 控制循環從任務 - (默認)創建一個使用采樣時鍾和睡眠時間的組合的定時源來確定何時向主控制回路發送刻度。
- 任務信號(示例完成) - 每次主DAQ設備從其AI通道中完成采集采樣時,都會創建一個定時源,該定時源向主控制回路發送一個刻度。
- 主DAQ設備 - [主控制環路定時源:DAQ時序]指定用作主控制回路的主定時設備的DAQ設備。
- DAQ超時 - [主控制循環定時源:DAQ Timing]指定在超時之前等待DAQ設備傳輸數據的時間。
- 定時循環休眠時間 - [主控制循環定時源:DAQ Timing]以微秒為單位指定主控循環在每次打勾之后睡眠的時間。默認值為0.如果設備具有外部定時源,則NI VeriStand將忽略此值。
- 主自定義設備 - [主控制環路定時源:自定義設備定時]指定要用作主定時源的自定義設備。任何定時和同步設備或包括定時源VI的任何定制設備可以是主定時設備。
13.改變目標速率Target Rate 為1000 Hz (1 kHz)

14.保存並且關閉系統瀏覽器System Explorer
至此我們已經導入了所需的模型並且將端口映射到了一起,下面就可以將系統定義文件部署到計算機中並開始運行。通過在Workspace中添加相應控件,可以設定發動機目標轉速,然后觀察控制器是如何通過調整節氣門開度,使發動機達到指定轉速的。
15.選擇Operate » Run, 部署和執行系統定義文件
16.點擊Screen » Screen Properties…從中可以修改頁面(screen)名稱
1) Name the screen:MIL.
2) 選擇 OK.
17.切換到編輯模式,可以添加控件。選擇 Screen » Edit Mode or CTRL+M.
18.從左側的Workspace Controls欄中,拖拽一個圖形控件Graph(Simple)
1) 名稱Graph Title: Engine Speed
2) 選擇通道Channel:
Controller » Simulation Models » Models » Engine » Outports » Engine Speed
3) 點擊
將Engine Speed添加到Graph中
4) 選擇Format & Precision 標簽
5) 修改Y軸的顯示范圍最大值Maximum:5000 和最小值Minimum: 0
6) 修改Y軸坐標名稱scale Label: rpm
7) 修改X軸坐標名稱scale label: time
19.從左側的Workspace Controls欄中,拖拽一個數字控件Numeric Control (Medium)
- 選擇通道Channel: Controller » Simulation Models » Models » Ecu » Inports » rpm Setpoint
- 填寫控件名稱Control Label: rpm Setpoint
20.從左側的Workspace Controls欄中,拖拽一個數字控件Numeric Control (Medium)
- 選擇通道Channel: Controller » Simulation Models » Models » Engine » Inports » Load Torque
- 填寫控件名稱Control Label: Load Torque
21.退出編輯模式,選擇 Screen » Edit Mode (Ctrl + M).
22.添加對Engine模型運行的控制,從左側的Workspace Controls欄中,拖拽一個模型控件Model (Model Control)
- Model: Controller / Ecu
23.添加對Ecu模型運行的控制,從左側的Workspace Controls欄中,拖拽一個模型控件Model (Model Control)
- Model: Controller / Engine

24.修改Ecu控制器中的I參數,從左側的Workspace Controls欄中,拖拽一個模型標定控件Model Calibration Control (Medium)
- 需要標定的通道名稱Calibration:ECU/Controller/Integral Gain/Gain
- 填寫控件名稱Control Label: I 參數
25.修改Ecu控制器中的P參數,從左側的Workspace Controls欄中,拖拽一個模型標定控件Model Calibration Control (Medium)
- 需要標定的通道名稱Calibration: ECU/Controller/Proportional Gain/Gain
- 填寫控件名稱Control Label: P 參數

26.至此基本的MiL測試環境創建完成,可以改變目標轉速和負載,驗證Ecu控制器中的算法是否滿足要求,也就是實際轉速能否快速、穩定的跟隨目標轉速。並能通過修改P、I參數,優化Ecu的控制效果,並確定出最佳數值。

上面的操作相信你已經對veristand有了初步的了解;回頭我將操作做整理成手冊,后續對
- 實現自動化測試、記錄數據;
- 創建HiL測試系統。
- 創建實時激勵配置文件
- Verstand高級功能
- 創建HIL測試系統
- 為NI Veristand創建自定義設備
- 為NI Veristand創建自定義工作空間對象
- 了解NI Veristand引擎架構
- 了解內聯硬件接口自定義設備
園子里從事這方面的人不是很多,冷門;
