<source : greatway9999>

一、需求說明


二、解題想法

ATM的需求可化作不同的狀態來實現所需功能,因此用State Machine(狀態機)的架構來進行程式撰寫。



三、撰寫步驟

Step1. 初始化狀態撰寫

依照我們的想法,先拉出State Machine(狀態機)的架構,也就是 While Loop + Case 架構。

接著依據題意,設定 Enum Constant的內容,分別有:

  • 初始化
  • 調整按鈕狀態
  • 等待事件
  • 插入卡片
  • 登入成功
  • 密碼錯誤
  • 密碼連續錯誤
  • 提款檢查
  • 提款成功
  • 提款失敗
  • 存款
  • 查詢帳戶餘額
  • 取消交易
  • 更新訊息
  • 停止程式

在初始化狀態中,我們希望整支VI都能被初始化,可透過Invoke Node來實現。而執行VI時,人機介面的左上角始終位於(0, 0)位置。

最後把預設的餘額30,000元的線接上即可。

綜合上述想法,程式撰寫如下:


Step2. 調整按鈕狀態

依照題意,除了Stop 和 Card按鈕可以操作之外,其他按鈕不能操作。我們可以透過 Property Node的Disable屬性來實現。




Step3. 等待事件狀態撰寫


1.Card(插入卡片)

以按鈕模擬插入卡片的動作,當Card按鈕事件被觸發,就會進到 "插入卡片" 的狀態。



2.Log in (登入)

當 "Log in" 按鈕事件被觸發,就會比對密碼,若密碼正確,則進入 "登入成功" 的狀態。若密碼錯誤,則進入 "密碼錯誤" 的狀態。

3.Get (提款)

當 "Get" 按鈕事件被觸發,就會進入 "提款檢查" 的狀態。

4.Save (存款)

當 "Save" 按鈕事件被觸發,就會進入 "存款" 的狀態。



5.Account (查詢餘額)

當 "Account" 按鈕事件被觸發,就會進入 "查詢帳戶餘額" 的狀態。


5.Cancel (取消交易)

當 "Cancel" 按鈕事件被觸發,就會進入 "取消交易" 的狀態。


6.Stop(停止程式)

當 "Stop" 按鈕事件被觸發,就會進入 "停止程式" 的狀態。

Step4. 插入卡片狀態撰寫

這部份的重點在於插入卡片後,"Log in"、"Password"、"Cancel"的功能解鎖。



Step5. 登入成功狀態撰寫

登入成功後,將 "Money"、"Save"、"Get"、"Account"的按鈕解鎖。在提示視窗中顯示 "請進行提款與存款動作" 提示使用者後續動作。


Step6. 密碼錯誤狀態撰寫


這部份重點在於"Select" 程式方塊與移位暫存器儲存錯誤次數的使用。設定密碼錯誤的上限次數為3。當密碼輸入仍錯誤達3次,則跳到 "密碼連續錯誤" 的狀態。


Step7. 密碼連續錯誤狀態撰寫

此部份的重點在於密碼連續錯誤的功能處理。當密碼連續錯誤,要把 "Log in"、"Password"、"Cancel"按鈕功能鎖住,並在提醒視窗顯示提示訊息。



Step8. 提款檢查狀態撰寫

當提款時,要進行提款檢查,也就是檢查提款的金額是否小於等於存款金額。以"Select"程式方塊進行條件判斷,當條件成立,則跳到"提款成功"的狀態。


Step9. 提款成功狀態撰寫

在"提款成功"的狀態中,要將存款扣掉提款金額,再利用 "Format Into String" 這個程式方塊,將餘額訊息顯示在提示視窗中。


Step10. 提款失敗狀態撰寫

這部份比較簡單,當提款失敗時,在顯示視窗中顯示  "餘額不足,請重新輸入"的字串。


Step11. 存款狀態撰寫

存款狀態的撰寫,重點在於要將存入金額加上原本的帳戶餘額,同時,僅解鎖 "Card" 的功能,其餘按鈕則鎖住。

在提示視窗中,同樣以 "Format into string" 的程式方塊,將存款資訊輸出。


Step12. 查詢帳戶餘額之狀態撰寫

查詢帳戶餘額的部份和 "存款失敗"的狀態內容相似,利用 "Format into string" 的程式方塊,將資訊輸出即可。


Step13. 取消交易之狀態撰寫

取消交易的操作重點在於按鈕的控制。除了 "Card" 解鎖外,其餘按鈕皆鎖住。


Step14. 更新訊息之狀態撰寫

技巧在於用Shift Register取代Local Variable,減少變數與拉線數量,提升程式的可讀性。

Step14. 停止程式之狀態撰寫

和初始化的撰寫方式相似,當程式停止時,讓所有功能回到初始化的狀態。


至此,再檢查一下是否所有的線都接上了。執行後,即可看到你的心血結晶了。

---

#LabVIEW #ATM #State_Machine

0 留言