2016-10-10 22 views
0

首先,請原諒,如果這不是正確的網站發佈這個問題,但我不知道在哪裏問這個問題。FSM在C/Arduino房間櫃檯的人和圖

我需要實現一個FSM來代表一個房間裏的人的櫃檯,有兩種可能性,人們可以進入房間或​​離開房間。一開始就保證空房間,一次只能有一個人通過門。

要知道一個人是否進入或離開,有兩個傳感器A和B,這取決於激活的順序,表示一個人是否正在進入或離開。 A表示一個人進入房間,B表示一個人退出房間。現在

,我要實現這個上的Arduino,使FSM圖,但我有搞清楚圖表,即使我想我已經得到了C程序權的問題(沒有測試過)

所以,基本上這裏是我的C/Arduino的程序

int currentPeople = 0; 
PeopleState currentState = None; 
enum PeopleState { 
A, 
B, 
None 
}; 

的一部分,現在這兩個函數被調用爲各自的傳感器

//Gets called every time sensor A is activated 
void countPeopleA(){ 
    if (currentState == None){ 
     currentState = A; 
    } else if (currentState == B){ 
     if(currentPeople > 0){ 
      currentPeople--; 
     } 
     currentState = None; 
    } 
} 
//Gets called every time sensor B is activated 
void countPeopleB(){ 
    if (currentState == None){ 
     currentState = B; 
    } else if (currentState == A){ 
     currentPeople++; 
     currentState = None; 
    } 
} 

我的擔心是次ese:

  • 我定義的狀態是否正確?我的意思是,每當傳感器被激活時定義一個狀態是正確的,或者應該是狀態是進入還是離開?
  • 我如何繪製狀態圖?我只是在瞭解FSM,所以我在解決它時遇到了問題,比如如何保證如果房間是空的,一個人不會離開?我可以用代碼檢查這種情況,但我不知道如何表示它。
+1

什麼是[FSM](https://en.wikipedia.org/wiki/Flying_Spaghetti_Monster)? –

+0

我不認爲在C中實現一個飛行意大利麪怪物會是明智的 –

回答

2

我定義的狀態是否正確?我的意思是,每當傳感器被激活時定義一個狀態是正確的,或者應該是狀態是進入還是離開?

我覺得你的狀態很好。不要將他們的名稱與他們的表示混淆。您需要一個狀態來表示組合的傳感器已被激活偶數次(這也是初始狀態)的情況,其中一個用於先前激活的奇數次,其中最後一次是A,而另一個用於奇數前一次激活次數爲B的次數。

如何繪製狀態圖?

你有三種狀態。爲它們寫名稱或標籤,圍繞這些繪製圓圈,並繪製帶標籤的箭頭用於使用不同傳感器激活時發生的轉換。 (另見下面)

我剛剛瞭解FSM,所以我有問題解決它,比如你如何保證如果房間是空的,一個人不會離開?我可以用代碼檢查這種情況,但我不知道如何表示它。

,除非你把佔用限制在房間無法表示與有限狀態機的狀態。 (上面的評論假設你不這樣做,因此房客的人數不是FSM狀態的一部分。)如果你想要走這條路線,那麼你需要一個不同的方法,每個人的計數都有不同的狀態。由於這是一個介紹性練習,我傾向於認爲這不是你打算做的。

還要注意,無論您是否對佔用限制建模,都有一些您既沒有明確禁止也沒有分配行爲的過渡。具體而言,如果從初始狀態開始,兩個傳感器中的一個連續觸發兩次,會發生什麼情況?例如,想象一下,他們分開的距離足以容納一個觸發人的人,然後再回到門口再觸發一次。如果他們被允許(甚至可能不是),那麼他們應該在你的圖表上代表。無論允許與否,您的代碼都應該對它們進行解釋。

+0

是的,我認爲我現在得到它,但我忘了指定兩個傳感器不能同時觸發,一個去追逐另一個。另外,如果一個人持續觸發一個而不激活另一個,例如A不斷激活,那麼根據我的代碼,狀態將爲A,直到有人激活B,然後它將對某人進行計數並將狀態更改爲無。 – HardCodeStuds