贊助商連結

目前分類:綜合_進階學習 (10)

瀏覽方式: 標題列表 簡短摘要

之前提到有關優化程式的文章系列 :LabVIEW_使用Parallel增加For Loop效率 ,介紹使用For Loop Parallel 增加程式效率,這篇介紹 In Place Element Structure 來減少記憶體使用。以往使用"取代"來更改數值的方法,會造成許多的數據的複製現象,這在大數據的處理上,會造成電腦很大的負擔,甚至影響到程式運行的效率。In Place Element structure 提供了更有效率的方法解決以往的取代編成方式。

image(此圖來自NI官網)

In place Element structure用法就如同上面展示的,可以處理Array、Bundle、Varient、waveform、Data Value Reference...

我自己比較常用的應用如下:

1.Unbundle 然後做數值變化後再Bundle回去

image

2. In place in: 基本上就是什麼資料型態進來,什麼資料型態出去

  • 將Time Stamp的時間加上固定時間-->有效時間設置

image

  • String 改寫為大寫

image

  • 去除小於0的數值

image

3. Array Replace功能

image

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

Queue應用

Synchornization學習

Array陣列

檔案讀寫

Listbox、Table元件

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

之前就想出一個專題聊聊關於增加程式效率、減少記憶體消耗的專題,不過這議題實在太大,每每理好思緒想開始寫,就會被其他事情羈絆。於是,我決定先將各各小議題先各自寫文章,最後再做統整,今天就使用For loop的Parallel來起手,因為他是最簡單、最快速、最顯著的修改方法。

image

Parallel Foor Loop 大約是2009後的功能,這功能有一段一時間了,但使用的人並不多,一大原因是目前的電腦處理速度很快,普通應用其實並不需要使用這功能。Parallel Foor Loop就如同字面上的英文意思: 同步Foor迴圈,如何做到同步呢?假設處理程式的主機使用的是4核心電腦,如果未開啟這功能時,Foor Loop只會使用單一核心來處理此段程式,但如果開啟此功能,就可以選擇以多核心來處理。當然,此功能有它的限制,下面介紹如何使用後在介紹其限制。

在For Loop 上按右鍵-->Configure Iteration Parallelism 設定並開啟此功能。

image

接著會彈跳出設定視窗

image

設定完後,就可以開始使用了。下面用2個Foor loop使用一樣的程式碼,唯一不同的是上面foor loop將 iteration parallelism功能開啟。

image

將兩段程式計時比較,注意,兩段程式不能同步跑唷,需要disable其中一個,才能精準測試。

image

image

測試後兩個Elapse Time比較,可以發現其顯著的不同!!幾乎差了10^4倍

image

當然使用這parallel會有限制,其限制也跟他的特性有關,因為開啟此功能後會,是多核心同步運行,其資料不會互相傳遞,限制如下:

  1. Feedback node
  2. Shift Register
  3. Conditional Terminal
  4. ....可查如下表

image(此圖截自NI官網)

如果有多個迴圈需要分配時也可以參考下面寫法,達到CPU的分配,

image(此圖截自NI官網)

詳細的使用,包含上面幾個圖的解釋,可以參考NI的白皮書: http://www.ni.com/tutorial/9393/en/

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

Queue應用

Synchornization學習

Array陣列

檔案讀寫

Listbox、Table元件

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

LabVIEW中Event可以偵測不同事件,當使用靜態的方法註冊事件(Static Event Registeration) ,也就是我們最熟悉的使用Event Structure 的方法,這個方法每當事件被觸發時LabVIEW就會自動的把這項事件排到處理佇列中。如果是選擇動態的註冊事件,那使用者就可以自由的管理被處發的事件,可以設計這些事件所觸發的排程應用,甚至決定事件發生的條件,這篇就是介紹什麼是動態的註冊事件(Dynamic Event Registration),和 靜態註冊事件(Static Event Registration) 的不同

Static Event Registration 靜態註冊事件

就是大家最熟悉的Event偵測,也就是使用Event Structure來偵測人機介面上使用者的操作。 

Dynamic Event Registration 動態註冊事件

使用動態註冊事件除了上面講到可以管理被處放的事件的排程,在排程上的應用之外還有以下應用優點:

 

  1. 事件偵測 ->比靜態註冊事件更有效率、明確
  2. 動態管理觸發的事件 -->根據需求即時(Run time)取消註冊和重新註冊事件
  3. 可將觸發事件包裝成SubVI-->幫助模組化
  4. 可以在其他的subVI中處理事件 -->更彈性的程式架構

1.事件偵測

就像靜態使用Event Structure一樣,使用時可以針對控制元件、應用程式、使用者動作做事件的偵測,但是比起靜態註冊,卻更有彈性了。下圖的應用,若是在工程模式則用Stop 2的事件偵測。

2.動態管理觸發的事件

除了靠成事邏輯去管理觸發的程序,也可以使用像是Flush Event Queue的元件去管理動態註冊。如下圖(1)展示如何動態的取消Boolean 的Mouse Down、Mouse Up的事件偵測。

3.可將觸發事件包裝成SubVI

這在LabVIEW內建Template-QMH的架構裡面也有被應用到(Queued Message Handler),在這架構裡主要使用在離開被觸發的時候;同一個開發團隊或是類似的專案,可以將觸發事件的條件、觸發偵測內容都建立成SubVI,增加程式模組化和重複使用率。

4.可以在其他的subVI中處理事件

在第三點鐘,提到QMH的架構也有使用到動態註冊事件去偵測被按下"Stop"離開訊息,之前我自己的應用還會用在Alarm的觸發上,包裝成subVI後,可以在不同的VI或迴圈裡,觸發Alarm的事件,去限制使用者的操作。

 

還是不事很明瞭動態註冊嗎? 沒關係,下一篇介紹如何寫動態註冊的程式,就能對動態註冊事件更了解

 

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

這篇介紹如何利用SMTP Email Send Message.vi來傳送簡單的文字信件,Mail Server 的設定可以參考下圖Outlet的參考位置。這篇有範例(Example)可供下載。

程式碼可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

Mail Server可以參考Outlook中,資訊-->帳號資訊

更新: LabVIEW 2014 已經不再支援這個VI 換成新版的SMTP,擴充了許多功能,但是這個方法還是可以使用。

程式碼可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

繼上一篇介紹什麼是Polymorphic VI:LabVIEW_什麼是Polymorphic VI?應用的時機?這篇介紹如何創造出彈性又易讀的Polymorphic多態程式。使用LabVIEW的元件 Spreadsheet VI 雖然很方便,但因為他可接受的Input型態很少,一直很困擾我;另外一個困擾我的點是如果沒有設定好,而且操作錯誤會跳出Error Dialog;基於上述的原因,所以改良原本的Spreadsheet VI,並保留其多工的特性,增加目前沒有的Path、Boolean、U32..等功能。這篇手把手介紹如創造Polymorphic VI,讓程式更為整齊乾淨、並在多人開發時更能一目了然模組所擁有的功能。

此篇範例可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

範例可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

創立Polymorphic VI之前必須先把所有的功能都創建出來,例如這個範例,就必須先創建出 Bolean、DBL、I32、Path、String、U32的VI出來。

這裡就不解釋裡面的VI功能,可以直接下載程式來看(範例在文末和文首處有連結點)。

 

建立Polymorphic VI : File--->New...

選擇Polymorphic VI

按下Add...將所有的子VI都加入,也就是所有創建好的功能都加入

以此範例為例,加入完後所有的VI都會在表格中

接著需要設定Menu Name、Selector Name,先來講解一下,

Menu Name是在下拉式選單中出現的名字、Selector Name是選好後在Block Diagram看到的名字。

當Menu Name中包含( : ) 這個字元 ,就會讓下拉式選單多一階層。

如上圖,將Write Data_Boolean.vi的Menu Name 寫成 Numeric:Boolean,這樣在下拉式選單中出現的就是如下圖中 Numeric-->Boolean。

 

接著為了美觀,可以透過Edit Icon修改Icon的圖示

或者選擇下方的 "Draw Instance VI Icon",這樣圖示會根據不同的VI而改變Icon樣式。

接著儲存此Polymorphic VI 就可以使用了。

若需做修改,可以直接對著元件按右鍵-->Open Polymorphic VI

補充,應用的時候如果需要看到所有的子VI選項,需將Selector變可視化。 Visible Items-->Polymorphic VI Selector

也可以在創立時將"Show Selector by Default" 勾選起來

在部署Polymorphic VI前,建議先閱讀上一篇,介紹什麼是Polymorphic VI:LabVIEW_什麼是Polymorphic VI?應用的時機?,了解其最佳的應用時機。

 

範例可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

 

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

Polymorphic VI在LabVIEW 2017推出Malleable VI後又再被廣泛地討論,這篇介紹什麼是Polymorphic VI、和其應用的時機和使用的優點另外一篇是如何創建Polymorphic VI的教學,可以搭配一起閱讀: LabVIEW_Polymorphic VI創建教學、範例下載(Spreadsheet改良)

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

什麼是Polymorphic VI? (多型態VI)

其實,在LabVIEW原生的功能就已經有Polymorphic VI,所以每個人都有用到這個功能,以Sreadsheet VI來舉例,Write to Spreadsheet.vi同一個VI卻可以輸入包括Double、Integer、Double型態,如下圖。

種同一VI卻可以有不同的資料型態輸入,就是Polymorphic VI,他的概念像是,程式根據輸入的型態呼叫不同的後端程式

在原生LabVIEW的Polymorphic VI可以利用Selector切換、查看所有的子程式(功能),Visible Item-->Polymorphic VI Selector

切換後就可以在下拉式選單中看到所有可以切換的程式。

這裡補充一下雖然用Spreadsheet 舉例,不過Polymorphic VI的子功能,並沒有規定接角位置都要相同,也就是可以每個VI的輸入輸出數量都可以不相同、型態也都可以不同

 

Polymorphic VI的應用時機? 

在相同的功能上,卻有很多的不同輸入、輸出型態,這種功能在資料輸入、輸出時用的特別多,這種應用很常見,如同今天介紹的Spreadseet VIs的應用。另外有種情況我也是很推薦使用Polymorphic的VI;若是創建了共同模組/儀器的功能,將這些功能都綁在一起寫成Polymorphic VI,這樣只要透過Selector的切換就能使用不同的功能,不用再去找對應的VI

例如相機的功能有初始化、各種參數的設定、拍照、關相機的功能,這樣在使用時,其他使用者無法一目了然已經有寫好什麼功能的VI、也無法快速的應用部屬VI,這時候若是使用Polymorphic VI,使用者只要切換Selector就能切換不同的VI,非常簡單操作。

 

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

 

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

在多人開發團隊中,版本控制(Version Control)一直是一個重要議題。這篇介紹如何在執行檔中建立版本號,後續如何讓這版本號碼顯示到人機介面中,提示使用者目前的升級狀況。

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

創立執行檔後,為了區分不同版本的執行檔(EXE),可以在Version-->Information中更改/新增版本號碼。

我的使用習慣是 Major是指重大修改、Minor指較小的修改、Fix是指人機面板上有所更改的修改、Build是版本的代表號(連號使用)

如果要查看執行檔版本時,可以直接在執行檔上看到版本號碼;按下右鍵-->詳細資訊-->檔案版本 

或是在LV的人機面板上加上版本的資訊,提示目前版本升級狀況。

 

程式碼可在這邊下載 如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

這篇探討在人機更新(GUI)時用Local Variable、Property的優缺點,讓使用者知道這些元件使用時的LabVIEW記憶體使用的區分。初學者在學習LabVIEW時都會被在三強調不要亂使用到Local Variable 、Global Variable 這種違反資料流的概念的變數。之前我也有篇文章在探討,不當使用變數時會造成的問題:LabVIEW_什麼是Race Condition(競爭危害)?,但是不使用變數,發現許多學生就使用"Property"來取代;不過這種方法我也不是很推薦,這篇並不是在提倡Propery優於Local Variable,在人機介面上更新的選擇時,需要依照使用的時機來選擇。

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

記憶體使用:

Local Variable 的記憶體是存在Transfer Buffer,當需要做讀寫更新時,需要複製一個記憶體到Operate Buffer,運算完成後在更新到Transfer Buffer,所以在記憶體使用上Local Variable比Propery更占用資。

電腦效能差異:

Propery Node更新被限制在UI Thread中,在現今多核電腦普及,Local Varable可在任何Thread中處理,想對的更新更為快速。

SubVI使用:

在SubVI時使用Property 更新會強制將此SubVI的Front Panel記憶體載入,增加電腦記憶體負荷。

Synchronous Display:

在LabVIEW 的defalut 中畫面並不會同步顯示(asynchronous Display),也就是說,假如一個While Loop在更新1~1000數值時,因為速度很快,在人機上並不會照順序1,2,3,4...依序顯示,會變成1,20,50...這種更新方式,如果要讓畫面呈現依序顯示就要將設定更改為Synchronous Display。可以參考這篇: Difference Between a Controls/Indicators, Local Variables, and Value Property Nodes

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

分享一個覺得不錯的NI Example中的程式,介紹如何使用Annotation和使用時機的方法;另外分享實際利用Annotation、Cursor加強人機介面美化作用的應用

程式碼可在這邊下載,

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

在XY Graph 中強調點位置時可以應用Annotation指標指出確切位置,強化人機介面;

例如下面的範例A,在人機畫面中數值最高點和最低點的位置,利用指標提示使用者位置,藉此達到強調的作用

範例A

但因為Annotation需要絕對的位置,在真實應用中比較不會使用到,因此介紹另外個應用範例;範例B,利用Cursor加上Annotation展示如何動態顯示強化XY Graph上的位置

範例B

先說單用Cursor的缺點,如果只用Cursor的話做出來的效果是如同下圖,並沒有箭頭強化

而如果又單只用Annotation的話,需要給Graph上的絕對位置;如果是與人機互動的應用,例如說使用者任意在畫面中做切換,並指到的位置標註數值;這樣單用Annotation的話就需要在經過換算-->先知道使用者點的位置在推算出離最近的點,才能換算出annotation的絕對位置;如果是使用Cursor的話可以將人機指標限制在有效數據上,這樣就不用經過換算了。

因為Cusrdor和Annotaion都有點小缺陷,因此將其有點做統整,有了Annotation+Cusor的應用,程式碼可以在文末下載。

但是不管使用Annotation或是Cursor都很容易有被遮掉的現象,如下圖,Annotation上面的文字沒有辦法正常的顯示。這樣的應用要很注意Annotation的Offset設定。

Bolck Diagram:

範例A

範例B

範例A為NI LabVIEW的Example

範例B為可在下面位置下載:

程式碼可在這邊下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

 

其他LabVIEW有關程式:

程式分享區

股票程式分享區

CLA考試分享區

LabVIEW CLD 進階認證 考試準備和心得分享

LabVIEW CLAD 進階認證考試準備和心得分享

LabVIEW_XY Graph美化強化_Cursor、Annotation List使用

LabVIEW_兩點間距離、斜率、徑度、角度

LabVIEW_程式螢幕擷取PrintScreen(Screenshot)

LabVIEW_鎖定Ctrl+Alt+Delete禁止使用者登入/登出/關機

LabVIEW_虛擬(模擬)鍵盤和真實鍵盤的整合(Keyboard)

NI LabVIEW-自製小鍵盤(數字鍵盤)keyboard程式分享

LabVIEW _個股日成交資訊擷取(YAHOO國際股市)

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

 

這是一個NI(National Instruments)國家儀器 LabVIEW程式分享,主要是程式作業上的指導,讓還不會寫LabVIEW的人可以學習一些較基礎的功能(Function)。這篇適合已經會基礎LabVIEW或是準備考取認證CLADCLD程度的程式學習者。 這篇討論不可重入(Non-reentrant execution)、共享重入執行選項(Shared clone reentrant execution)和預先分配重入執行選項(Preallocated clone reentrant execution) 的不同。

默認情況下,LabVIEWVI配置為不可重入(Non-reentrant execution)。當程式撰寫時想同時運行同一個VI在多個應用時,可以選擇使用重入VI (Reentrant VI)

Non-reentrant execution

A程式選擇不可重入(Non-reentrant execution)時,VI只會使用一個記憶體空間;因此,一次只能有一個呼叫者可以運行程式A,如果其他的程式想呼叫此程式必須“等待”上一個使用者程序處裡玩才能使用A。這也是LabVIEW的默認的選項。

 

Shared clone reentrant execution

如果A程式選擇共享重入執行選項(Shared clone reentrant execution) , LabVIEW會在Pools中創建兩個實體空間給A的使用者使用(無法選擇) A程式被重複呼叫20次,並不會產生20個實體空間,而是這20個需求共用初始創建的兩個實體空間(或是依需求在創建更多的實體空間),而且使用完後會釋放這多餘的實體空間
根據當前需要僅創建必要的空間數量,可以優化了記憶體和執行速度,建議使用此選項。
值得注意的化,因為空間是”共享”而且無法指定的,所以會發生"cross talk",也就是資料互相干擾的情況

 

Preallocated clone reentrant execution

 如果A程式選擇預先分配重入執行選項(Preallocated clone reentrant execution) LabVIEW會依據使用的量,創建相對數量的空間,也就是假設程式使用到20A程式,那LabVIEW在使用之初就會創建20個空間給使用者使用。相對應共享重入執行選項”(Shared clone reentrant execution),預先分配重入執行選項(Preallocated clone reentrant execution)並不會有資料互相干擾的現象,但是相對於記憶體的使用,就沒有這麼優化了。

 

下面有個整理表,比較三種選項的不同 :

使用考量

不可重入

Non-reentrant

共享重入

Shared Clone Reentrancy

預先分配重入

Preallocated Clone Reentrancy

維護面

一個記憶體空間,好掌握使用狀況。

使用時是隨機的選擇Clone,並非固定。

每個使用都是獨立的記憶體空間。

等待時間

必須等到上一個使用者釋放(結束)才能接著使用。

Pools中沒有足夠的clone給使用者使用,則須等待LabVIEWpools中創建新的clone

在程式運行前就已經創立好空間,完全不需等待。

記憶體使用量

最少

只有一個

中等

LabVIEW只為同時運行的最大數量創建clone

最高

LabVIEW為每一個使用創建clone

 

可以試著在VI的Example中看官方範例:

 

其他參考資料:

Differences Between Reentrant, Templates, and Dynamic VIs

Reentrancy: Allowing Simultaneous Calls to the Same SubVI

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

 

文章標籤

安伯伯 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼