1 功能確定
首先來看一下科學計算器的樣子。這是市面上CASIO計算器,可謂功能十分強大,我們要用labview實現這樣的功能,就跟現實中的計算器功能一樣,就不贅述了。
2 程序設計分析
在Labview程序開發時,無論功能簡單還是復雜,在明確后一定要進行程序設計過程,而不要一上來就堆程序疊加功能。程序設計分析更多的考察個人的編程思想,與采用什么編程語言不是太相關,即使是開發java、C#等其他語言也是如此。
首先看輸入與輸出。輸入是數字鍵+運算符鍵+功能鍵;輸出即結果顯示。將這些內容細化為如圖:
其次,是程序結構框圖。我們來分析一下:輸入是以“按鍵”的方式進行輸入,輸出是以“數值”+“字符”的形式顯示,先考慮Labview中如何實現這樣的功能,然后再考慮程序邏輯問題。
A.功能實現
首先來看控件的類型,在前面板空白處右鍵,彈出控件工具箱,可以看到有數值、布爾、字符串、數組等,可以自行點進去看看每種控件下包含的子控件及功能。
接着來看,輸入端都是按鍵,我們選用“布爾”控件。仔細分析一下布爾控件:在控件中選擇布爾——隨便選擇一個拉出來,然后右鍵該控件,選擇屬性——操作選項卡,如下圖。
布爾控件雖然類型眾多,但除外觀不同外,其最大的區別在於觸發和響應方式不同,如上“按鈕動作”中所列,分別對應不同方式下觸發;“動作解釋”是響應的文字和圖形說明。
另外,布爾型數據只有兩個值:“真”或“假”。該控件是沒有局部變量或者具體的“值”,只能作為控制控件,類似開關控制一樣模擬不同種類開關的行為。
這里選擇方塊形狀的按鈕,以“釋放時觸發”,先按照計算器的布局將按鍵都排布好。
打開軟件——新建項目——保存為“Calculator”——新建VI(Ctrl+N)——保存為“Panel”。
先為計算器界面放一個背景圖,背景圖我用Ai繪制了一個,感興趣的朋友可以參考教程自行繪制https://zhuanlan.zhihu.com/p/157327602
在前面板上右鍵,添加下拉控件——圖片下拉列表
選擇編輯——導入圖片至剪切板,選中圖片
在控件右鍵,選擇剪貼板導入圖片
最后形成的效果如圖所示
在該圖片上添加控件——布爾——確定按鈕,然后右鍵控件修改大小、標簽、文本顯示等
按照計算器的顯示樣式依次設置,最終效果如圖所示
對於輸出,選擇字符串——顯示控件,右鍵修改標簽不可見,名稱為“顯示面板”
至此,我們僅僅完成了主界面或者說面板的界面設計,但這只是個空架子,背后每個控件如何實現功能,我們在程序邏輯中講述。
B.程序邏輯
在敘述之前,先了解子VI,通俗來說,子VI相當於一個子函數或者程序包,可以供主函數或者主程序調用。
主界面要實現的功能是輸入數字+運算符,在顯示面板響應鍵盤輸入內容。其次,各個按鍵的功能是實現運算,可以把運算功能全部封裝為子VI,主界面只要直接調用即可。最后,功能鍵合報錯機制需要進行補充考慮。
按照上述邏輯做一個程序框圖如下:
容我喘口氣,未完待續....
過了大半年,我又回來了。這段時間斷斷續續有朋友催我更新,因為貪玩很抱歉沒有及時推文,今天把這塊兒補上。
(續上)
3.子功能實現
3.1 乘除的實現
(1)理論基礎
首先學習一下“字符串/數值轉換函數”,實現的功能是 從偏移量位置開始,使字符串中的下列字符:0-9、加號、減號、e、E、小數點(通常是句點)解析為工程、科學或分數格式的浮點數,通過數字返回。
然后是“創建數組”, 連接多個數組或向N維數組添加元素
再然后是刪除數組元素,在n維數組的索引位置開始刪除一個元素或指定長度的子數組。 返回已刪除元素的數組子集,刪除的元素或數組子集在已刪除的部分中顯示。 連線數組至該函數時,函數可自動調整大小以顯示數組各個維度的索引。
字符串數值轉換函數:使數字轉換為小數(分數)格式的浮點型字符串,至少為寬度個字符,還可依據需要適當加寬。
(2)程序思路
以“乘除”為例,輸入條件為“數值+運算符”,先判斷運算符,然后執行
(3)功能實現
首先在前面板放置數組(右鍵——數組——第一個;然后再右鍵——數值——數值輸入控件),這樣就形成了數組
依次放入兩個數組,1個字符串輸入,1個數值輸出控件,1個字符串輸出控件。
然后進入程序設計部分,字符串輸入控件用於輸入計算式,如:“10*12”,輸入的字符串進入循環檢索程序,先識別字符串中的運算符是“*”還是“/”,用匹配模式(使用方式見3.6)進行識別。
例如“10*12”輸入后,匹配模式檢索到“*”,第一個匹配模式輸出“10”、“*12”、“3”;第二個匹配模式檢索不到“/”,因此輸出“10*12”、“ ”、“-1”;匹配模式的偏移量進入第二個條件結構,3 & -1 輸出為“假”,3直接輸出;而-1 & -1 輸出為“真”,輸出“5”。因為3<5,故進入乘法條件結構中;具體的程序說明文字表達有點費勁且難以理解,可以私信小編進行講解。
3.2 其他運算
其他運算中包括三角函數、開方乘方等
具體的其他運算私戳小編。
3.3 括號運算
程序實現如下:
3.4 加減運算
程序如下:
3.5弧度角度轉換
(1)控件
前面板上一個輸入一個輸出,以及能夠判斷弧度角度轉換的控件。
(2)程序實現
使用條件結構,雙擊選擇框中的內容可以修改條件。將弧度/角度選擇控件作為條件判斷,弧度轉角度,則進入角度計算部分,即輸入×π/180,然后輸出。
如果是弧度,可以直接輸出(默認為弧度輸入)
(3)改進
其中,弧度/角度輸入輸出用的是單選按鈕,我們換成開關切換兩者的轉換,如下:
3.6 去除結果中多余的0
(1)理論基礎
首先學習下“匹配模式”,在程序視圖中右鍵——字符串——匹配模式,下圖給了每一個連線端代表的含義
接下來看看這個匹配模式能實現什么功能:我們在前面板上放這幾個控件:1個字符串輸入,3個字符串顯示出,1個數值顯示
在程序框圖中,添加一個字符串常量,寫入“[0-9]+”再按照匹配模式的說明圖進行連線。
萬事具備后,來說明一下它的功能:輸入字符串中我們隨便輸入一串字符,比如“a-b1252a%+d”很隨便的一串亂碼,匹配模式用來匹配正則表達式規定的字符,我們正則表達式中寫入的是“[0-9]+”,查詢下面正則表達式含義,第4行可以看到,是指“一位或多位數序列”。偏移量沒有連接,默認為“0”,那么從剛才那串字符串里從左到右依次檢索,檢索到多位數開始,到不是多位數時結束,也就是識別到“1252”這部分。所以,在輸出的字符串2中會顯示“a-b”,是匹配到的字符前的字符串;字符串3中會顯示“1252”,是匹配到的字符,字符串4中會顯示“a%+d”,而匹配后偏移量是“7”,因為最后一位“2”是在“a-b1252”這串字符的第7位。
運行后的結果如圖,這樣就很清楚地了解了這個匹配模式每一個輸入輸出的含義了。
需要注意的是,如果匹配不到,則匹配后偏移量返回“-1”。這是后面作為條件判斷的關鍵。
(2)編程分析
去除多余的0要實現的功能是諸如“12.0000”,“12.43000”這樣的數字,去除其后的0.由於這是對結果去0,結果一般是數值或者錯誤字符提醒,因此考慮的情況比較單一,思路如下:
(3)具體實現方式
在前面板上,放置兩個控件,一個是字符串輸入,一個是字符串顯示
在程序框圖中首先判斷輸入的字符串是否為一位或多位數字,若不是,直接輸出;
如果輸入的字符串是一位或多位數字,則開始提取字符,將“.”前、“.”和“.”后的數字提取出來,即途中紅色框的部分;
“.”后的數字若存在,則進入“去0”功能,用一個While循環執行,從字符串的最后一位起每次判斷是否是“0”(通過偏移字符串長度實現),若是0,則只輸出0前面的數字;若不是,則繼續循環,直到檢測不到“0”停止,具體細節如下圖紅色框部分所示:
“.”后的數字經過去0之后輸出的是“.”后沒有0的數字,然后需要和“.”前面的數字連接起來共同輸出,這時可以進行“空字符”的判斷,如果經過去0處理后為空,則直接輸出“.”前的數字;
如果不為空,則將“.”、“.”前和處理后的數字全部疊加起來再輸出,整體實現如下:
(4)VI封裝
進行到上面就結束了嗎?不,良好的編程習慣還需要對VI圖標和接線端進行設計加工,以方便整個項目的管理。雙擊前面板的圖標,如下圖右上角,是我已經改動過的。
(5)運行驗證
點擊實時運行,在輸入框輸入各種數值進行驗證,看輸出是否為理想狀態。
4 主功能實現
(1)控件
主功能需要在計算器的面板上集成各個子功能,其中,控件面板在前述已經繪制完畢,示意圖如下:
(2)程序實現
整體采用事件結構,當檢測到按鍵時實現按鍵代表的子功能:
需要說明幾個結構——
a. 屬性節點
獲取(讀取)和/或設置(寫入)引用的屬性。 通過屬性節點對本地或遠程應用程序實例、VI或對象獲取或設置屬性和方法 也可通過屬性節點訪問LabVIEW類的私有數據。
屬性節點可自動調整為用戶所引用的對象的類。 LabVIEW的屬性節點可訪問XML屬性、VISA屬性、.NET屬性和ActiveX屬性。
b. 事件結構
等待事件發生,並執行相應條件分支,處理該事件。 事件結構包括一個或多個子程序框圖或事件分支,結構處理時間時,僅有一個子程序框圖或分支在執行。 等待事件通知時,該結構可超時。 連線事件結構邊框左上角的“超時”接線端,指定事件結構等待事件發生的時間,以毫秒為單位。 默認值為-1,表示永不超時。
c.控件引用——局部變量
(3)功能驗證
打開“Panel”文件,點擊運行
——————
文末說明:
(1)使用的軟件是Labview 2018
(2)采用的程序框架學習自Labview論壇
(3)理論學習圖片來自軟件的“幫助”文檔
(4)程序代碼去公眾號“挽風筆談”,回復“計算器”自行獲取。
(5)代碼講解的交流可以加SonnyID_2020