[LabVIEW程式技巧] 整合練習 : 口罩販賣機軟體設計
<source : greatway9999>
一、需求說明
- 販賣機上要有10種口罩商品的名稱與價格。
- 可投入的零錢為50元、10元、5元、1元,並能在操作畫面上顯示投入金額。
- 有退幣的功能選項。
- 購買完後,視窗可顯示出貨商品與發票內容。
- 有停止程式的按鈕。
二、設計規劃
- 確認所需商品名稱與價格。
- 金額輸入之功能,未達到商品之金額,無法購買。
- 選擇商品之功能。
- 找零錢之功能。
- 退費之功能。
- 顯示購買商品與發票內容之功能。
三、程式撰寫步驟
步驟0.將所有的功能按鈕與資訊擺放在人機介面上
步驟1.創建商品按鈕的 Reference (參考)
方法很簡單,用滑鼠選取人機介面上所有商品購買按鈕,按滑鼠右鍵選擇 >> Create >> Reference。接著把創建出的10個按鈕 Reference 擺放到程式撰寫的畫面,如下圖。
接著使用 Build Array 程式方塊,將10個商品購買按鈕和10個商品價格分別串接,如下圖。接著使用狀態機的方式,撰寫後續程式的各個功能。
狀態機的架構為 Enum + While Loop Structure + Case Structure。Enum其實就是販賣機的各個狀態,分別有
- Init (初始化)
- Disable Buy(鎖住購買)
- Wait Event(等待投幣與購買按鈕的事件)
- Enable Buy(解鎖購買)
- 找零錢
- 開發票
請於程式編輯畫面中的拉出Enum Constant ( Numeric >> Enum Constant ),再按右鍵選擇 "Edit Items",將以上的狀態輸入。
接著再對 Enum Constant 按右鍵,選擇 Make Type Def >> Open Type Def >> 修改標籤名稱為 "State" >> 存檔 (存在 Control or Type Def 資料夾中),檔名為 "State.ctl"
再把While Loop Structure 和 Case Structure的架構拉出來。即可開始撰寫下一步驟初始化的程式。
步驟2.init(初始化)條件設定
撰寫方式如上。此部分的重點在於初始化人機介面與VI。
關於初始化人機介面,我們希望程式運行的時候,定位點固定在 (0,0) 的位置。方法如下:
Front Panel >> Scroll Bar按右鍵 >> Create Property Node >> Origin >> 設定 (0,0)
關於初始化VI。方法如下:
在程式編輯畫面中,選擇 Application Control >> Invoke Node >> 切換小手,按右鍵 >> Select Class >> VI Server >> VI >> VI
初始化的下個狀態為 "Disable Buy(鎖住購買)",因此把剛才存檔的"State.ctl" Enum Constant拉出來,選擇 "Disable Buy(鎖住購買)"。
接著設定庫存的 "Stock.ctl",方法為先拉一個空的Cluster,再將10個 Numeric Constant放進Cluster中。按右鍵,選擇 Make Type Def >> Open Type Def >> 依序修改Numeric Constant標籤名稱,必須對應商品順序 >> 存檔 (存在 Control or Type Def 資料夾中),檔名為 "Stock.ctl"。如下圖。
接著完成相關接線即可。
步驟2.Disable Buy(鎖住購買)條件設定
撰寫方式如上。此部分的重點在於鎖定商品按鈕的SubVI撰寫。
在SubVI資料夾中,新增一個VI,檔名為"Disabled"
由於我們的按鈕是布林資料型態,因此要到人機介面中,Refnum >> ctl Refum >> 點選該物件,按滑鼠右鍵 >> Select VI Server Class >> Generic >> GObject >> Control >> Boolean。如下圖。
再完成此SubVI接線、接點設定、icon設定,存檔。完成畫面如下圖。
步驟3.Wait Event (等待投幣與購買按鈕的事件)條件設定
這部分可分成4個部分來看:投幣按鈕事件、商品按鈕事件、退幣、Stop。
關於投幣按鈕的事件(1元、5元、10元、50元)撰寫,依序如下
這裡要注意的是使用 "Local Variable"來更新投幣金額。同時要注意到此事件結束後的下個事件為 "Enable Buy"。
接著下個部分為撰寫商品按鈕事件,依照10個商品順序,撰寫如下:
此部分的重點在使用 "Unbundle By Name"取出指定的商品,當按鈕按下後,該商品庫存-1,再利用 "Bundle by Name" 接回原來的庫存Array。
而 "Index Array"的功能是取該商品價格。舉例來說,序號0表示第1個商品(白色口罩)。序號9表示第10個商品(鄉村黃口罩)。
接著撰寫退幣功能,程式如下:
此部分重點在於使用投幣金額的 "Local Variable",將數值輸入到 找零的Indicator。退幣完成後,要鎖住其他購買按鈕,因此要將 "State.ctl"選擇 "Disable Buy"狀態。
最後撰寫Stop功能,只要將 "True" 接到,While Loop的Stop紅點即可。
0 留言