<source : greatway9999>

一、需求說明

  • 販賣機上要有10種口罩商品的名稱與價格。
  • 可投入的零錢為50元、10元、5元、1元,並能在操作畫面上顯示投入金額。
  • 有退幣的功能選項。
  • 購買完後,視窗可顯示出貨商品與發票內容。
  • 有停止程式的按鈕。


二、設計規劃

  • 確認所需商品名稱與價格。
  • 金額輸入之功能,未達到商品之金額,無法購買。
  • 選擇商品之功能。
  • 找零錢之功能。
  • 退費之功能。
  • 顯示購買商品與發票內容之功能。


三、程式撰寫步驟

步驟0.將所有的功能按鈕與資訊擺放在人機介面上


價格資訊使用的是 "Numeric Control",其餘的資訊顯示框為 "Numeric Indicator"。

為了讓所有的價格不會因為程式關閉而消失,請到人機介面上的選單 Edit >> Make Current Values Default。

另外,為了不讓價格被開發者以外的人修改,請依序到這10種商品的價格(Numeric Control),點選右鍵,選擇 "Properties"。進入設定視窗後,選擇"Disabled"。


步驟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紅點即可。



步驟4. Enable Buy(解鎖購買)

程式撰寫如下:


此部分重點在於庫存與投幣金額的判斷,如果金額大於商品金額,且庫存大於0,則購買按鈕會被觸發。


步驟5. 找零錢的狀態撰寫


一樣使用 投幣金額和找零的"Local Variable"方法,更新數值。下個狀態要接上 "開發票" 的狀態。

步驟6. 開發票的狀態撰寫


此部分重點在於使用 Format into String 的程式方塊。內容格式化的寫法為 "您花費了 %d 元,購買 %s",再將價錢和出貨商品資訊的線接進來。完成後會鎖住其他商品的購買按鈕,所以Enum狀態要改成 "Disable Buy"。 

步驟7. 程式打包後,釋放記憶體資源的設定

程式執行完後,希望不要占用記憶體,影響效能,因此會在 Structures >> Conditional Disable >>
將 Quit LabVIEW程式方塊加入。



完成程式如下:



---

#販賣機

0 留言