About虛擬&實際

@分享虛擬與實際的世界中所遊玩的心得紀錄,從物理化學到生命科學、從人文藝術到現代科技、從虛擬介面到實際生命體。享受的只是一種學習與體驗。若文章內容有誤,歡迎提出以供修改,對文章的回饋,歡迎寄信給我!一起分享,互相學習成長的環境。
@個人簡介在『關於韃靼』
@我是韃靼~我的信箱:chenyuquan at gmail dot com

2013年8月19日 星期一

BOOK_I and LabVIEW_我和LabVIEW_阮奇楨_CH_01/02/03

前言:
最近購入了一本蠻多人也推薦的書,這個文章主要記錄裡面我所不知道的新技巧、或者不熟悉的舊知識,以及一些作者的建議。然後未免同個紀錄太長,最後還是決定分幾篇記錄好了。

觀念:
有個重要的觀念是目前看了幾本書都有提到的就是:
“不要再重複別人已經完成的工作”
意思是說,盡量去搜尋已經可以使用的程式來使用,自己重新編寫雖然可以有很多學習收獲,但對專案或者整體而言是花了太多時間的。

第一章:

連續運轉(Run continuously)按鈕,程式內的所有Code會反覆運行,沒辦法將程式中只需要運行一次的Code和需要重複運行的Code區分開來。

在Projects中,若需要加入先前的VI到項目中,在"My compute"右鍵"Add"添加"File"。


VIEW/ Navigation Window:導航畫面,對於程式佈局不得以還是很大的時候很方便。


LabVIEW程式中的大多數SubVI的存在並不是為了Code重用,而是為了提高Code的可讀性&可維護性。一個理想的VI層次結構是金字塔型。(VIEW/ Hierarchy)


Code相對比較獨立(與程式其他的部分連線較少),可以建立成SubVI


可以將常用的program放到Favorite內(在Block diagram),若有設定,則將favorite拉到Function選單的最上方(第二也可),可以右鍵彈出選單時就看得到。


工具面板(Tools)有兩個快捷鍵:Tab & Space根據在Block diagram/ Front Panel/ Running mode時候有不同的切換。(P34)


第二章:

Numeric元件在Properties/ Display Format中可以在(左下)advanced editing mode直接設定為日期模式。(不一定要用字串)

公式節點(Formula Node):類似C語言,在較為複雜的數學運算可以使用以達到較好的程式可讀性與可維護性。


腳本節點(MathScript):內嵌MATLAB的語法,可以計算更複雜的科學運算,“但是”執行效率遜色於公式節點。


使用帶單位的數值元件,可預防不一致結果,但其VI就不能再被其他不同單位的場合使用,所以也可以使用單位轉換(Convert Unit)&基本單位轉換(Case Unit Bases)來將純量與轉換成具單位的數值或者直接將某一單位直接轉換成另一單位。(P44)


Enum(中文翻譯成枚舉型,好有趣),& Ring的比較:Ring可以更改每個項目的數值,在Edit Items中選取"Sequential Values"就可以更改數值了。而Enum適合特定、有限的狀況下使用,可以增加可維護性。


Radio Buttons(單選按鈕),類似Enum,不過可以直接全部看到不需要下拉。要重新排序可以選擇右鍵選項中的Reorder controls in Cluster,所以可以知道Radio Buttons也是Cluster的一種。


Boolean:有六種機械模式,一直以來總是無法“熟記”在心。借這個機會用自己的話寫下來:(連接個LED,亮燈即數值為"True")。另外,第二列的三種類型,是不能夠使用於局部變量和“數值”屬性節點。

第一列(Row)
    Switch when Press:
        按了就亮燈,再按一下就熄燈
    Switch when Released:
        一直按著,當放開的時候亮燈,此時按鈕還是顯示按著。
    Switch Until Released:
        一直按著就會亮燈,一放開就熄滅,且放開的時候,按鈕本身也被釋放了。
第二列(Row)
    Launch when Press:
        按了就亮,但會自動釋放按鈕,燈也熄滅了,沒辦法一直壓着。
    Launch when Released:
        一直按著,放開的瞬間會亮燈,但按鈕也同時被釋放,所以燈馬上就熄滅了。
    Launch Until Released:
        按著的同時會亮燈,但一放開按鈕就會被釋放,同時燈也熄滅了。

數組數據(p47)提到了個我從來不知道的組合方式:使用Array中放著array(這跟我最近在學Python的List/ Tuple很像),用說明的有點饒舌,整理成圖如下:(雖然暫時還不知道有什麼適合的用途)

Cluster:bundle & bundle by name,筆者建議使用bundle by name等,因為可讀性較好,也可以避免前後cluster的元素順序不一致導致錯誤。

在字串符中(p53),特殊含義,比如“回車”。這個還真的不知道是什麼意思?在查了google後,才知道就是enter/ (return, "mac OS").實在是太有趣了...(大驚小怪)


路徑(path):提到了若有相關文件,SubVI等等,可以放在跟主VI相同的資料夾內,然後使用Current VI's Path讀取路徑後,就可以加上相對路徑(前提文件,SubVI的名稱等等,應該只要在path const內打上檔名,不同系統會自動加上前綴分隔符號),這樣就可以快速地在不同平台下一樣的讀取到檔案。(因為WIndow, MAC, Linux所使用的路徑分隔符號都不一樣。)


數值&字串之間的轉換:提到可以使用功能更齊全的兩種-Formal into String & Scan from String。可以一次處理多個數據,不過要先瞭解其格式語法(我自己本身並不常用, 作者也提到類似C語言中的sprintf() & sscanf()。另外可以使用string to byte array將string轉換成ASCII碼。


p57有提到可以使用Refnum to path(簡中稱
Refnum為“句柄”),在使用開啓文件等等之類的VI時候,會有refnum out的輸出,搭配Refnum to path就可以將檔案路徑給顯示出來。(ex:Macintosh HD:Users:apple:Documents:FB好句子.docx)

p58提到了Variant是我一直沒什麼機會用到(好像也不知道用在哪),提到可以將cluster轉換成variant然後使用GetTypeInfo/ GetClusterInfo ,範例
如下圖(屬於不開放的VI,作者不建議使用再給客戶的程式碼內,避免LabVIEW升級後沒有支援)

接著提到了Dictionary(容器)就挺有趣的了,有點類似資料庫的感覺。
使用到的元件是在Cluster, Class & Variant/ Variant內的:Get Variant Attribute, Set Variant Aattribute and Delete Variant Attribute三個元件。

Flatten to String一文說明不同數據是以不同格式保存在“內存”中(就是我們所講的記憶體Ram)若需要將其儲存到硬碟中或者傳輸到其它硬體設備,則必須把原本的數據規劃成一連串的數據再進行儲存&傳遞。flatten到字串後的資料不易閱讀,若要在進行中可以即時觀察,則可以使用flatten to XML (File I/O_XML_LabVIEW Schema),不過效率相對前述的會較低。

p61提到使用變體(Variant)的屬性建立表格,藉由輸入字串來得到相對應的數據。書中提到遍體的屬性是以“哈希表格式”儲存的,這個就沒聽過了。

p64提到了之前一直很好奇,但之前沒有深入瞭解的Type Cast,原理是:將數據強制轉換成另一種類型,但是內存的二進制數據並不作改變。若用的是數據類型轉換(Conversion),雖然表面看起來差不多,但是事實上已經對於內存的二進制編碼已經不一樣了~(與flatten to string的比較可以參考p65)

p65提到boolean & string在內存數據的方式都是與U8相同,所以可以相互轉換之。而string已經有內建的轉換函數,所以並不一定需要使用強制轉換的方式了。(String to Byte Array & Byte Array to String)

p67分析了不知道的Label & Caption的分別,寫LV到前一陣子,還沒很認真地去分析為什麼他們有這兩種差異,一直以為只是表示而已!?(不求甚解應該再深入反省自己),Label 是元件的唯一標識,Caption 則是“介面”上顯示出來的名稱,亦即是可以在運行中改變。這樣的解釋大略地分隔了兩種區別,不過還是要去實際使用跟分析才能更瞭解了。

p68提到了默認值(預設值),有提到為了方便測試使用,“SubVI”可以設定最常使用的數值作為預設值,還可以把control的預設值寫在Label or Caption上以便查看。

p70提到String可以右鍵選取Update value while typing。這個是方便在程式執行時,keyin數據時,即時更新輸出資料,不用等到都輸入完才將資料傳輸。對於需要即時顯示與輸出的狀況是很方便。

p72提到property node的"Value"相當於local variable但是執行程式時,效率大大低於local variable。

2.4.6節提到的調用節點(Invoke Node)與屬性節點相似,區別在於調用節點用於“選擇方法”已完成“控制元件”的“某些行為”。

2.5.3 & 2.5.4有兩個實例是在運行中改變控制元標題(Caption, 不是Lable)跟禁止Enum中的某些項目,這兩個在人機界面上有很好的應用,例如根據需求的輸入單位顯示跟選取某個特定條件時,某些項目不能使用。(Enum輸入的都是預設值,可是某些可能在某些特定情形下是不能使用的,為了使用者的誤用,可以禁止使用之)

第三章:
p88, 討論到將case structure輸入number, Enum, String,可以產生無窮的設定,範例中有提到可以對case輸入多於一個的條件,例如同時滿足2, 4, 6的話,就會執行同個case。或者是一個區段的數值,使用'x..y'兩點就可以表示從x到y的連續數直接包含(大於的話就用z..,表示z以後皆是,小於的話就反過來用..k,表示k以下皆是)。(以前好像有讀過,但沒實際的使用,也忘記了還有這樣的功能!!用'..'的方式很像現在開始在學的Python與之前Arduino有用到的一些寫法)

p91提到了程序框圖禁用結構(Diagram Disable Structure),這個對我是個很有趣且沒用過的,曾經是在其他範例程式內有看過。可以將程式的某個部分給“暫停使用”且也不會被編譯成執行代碼(不影響整體程式效能),然後要使用的話在“啟用”就可以了,適合尋找並定位錯誤代碼。

p92提到了條件禁用結構(Condition Disable Structure),這個結構類似Diagram Disable Structure,但是目前的感想是使用在跨平台的時候,可以先設定不同平台能執行哪些程式碼,在VI匯入時候會自動檢查作業系統,另外,也可以設定不同的部分給不同使用層級的人(例如發佈給不同用戶的軟體,基本功能相同,但是個別的地方會使用不同的代碼,可能就類似微軟的專業版,家庭版等等之類的含義)。

p93同樣在condition disable structure項目內,提到可以自定條件,使用的方法如下(內文的含意看了很久才知道涵義):
=>Project (Project Explorer)--->My Computer--->Properties--->Condition Disable Structure可以設定自定義的符號。

p97 Shift Register, 如fig3.38, 即使N=0,輸出也是33,因為初始值進到channel(左邊)後,就已經將數值“內存”到loop了,所以即使沒有運轉for loop,右邊的channel輸出也是初始值。

p99 Feedback Node, 在循環結構內,feedback node是針對於包含它的每一層循環結構的,相當於在每層都建立了一對的移位暫存器,然後再將其串連起來。所以若當作subVI使用的時候,要注意可能輸出值可能會考量主要VI的循環結構次數,因為會影響到feedback node的計算次數。

P101使用Feedback在SubVI必須設定"可重入運行方式"才能避免多個相同SubVI使用同一個移位暫存器。

p103使用For loop可以使用Conditional Terminal來設定一個中斷條件,類似C語言中的"break"。

p104[While loop]使用索引隧道(index channel),for loop比while loop的效能還要好,因為for loop在進行前就可以先替輸出的array大小分配一個暫存空間。

p105[Event Structure]窗格(panes)的呼叫:Modern/ Containers/ Horizontal/ Vertical Splitter Bar,而事件結構主要有六種事件:Application, This VI, Dynamic, Panes, Splitters, Controls等等。

p108 LabVIE事件可分為:通知型/ 過濾型兩種事件。

p109 每一個"VI"只需要一個事件結構就可以處理所有的事情囉。

p112-120動態事件、定時結構可重複回來複習;此外,定時方法使用的函數最小分辨的等待或延時時間皆為2 ms。而以精確度來說,最高到最低精確排序:
定時結構(Timed Structures) > Wait until next ms Multiple > Wait = Time delay