FSM为C / Arduino房间柜台的人和图表

时间:2016-10-10 19:51:14

标签: c arduino state-machine fsm

首先,如果这不是发布此问题的正确网站,请原谅我,但我不知道在哪里提出这个问题。

我需要实施一个FSM来代表一个房间里的人的柜台,有两种可能性,人们可以进入房间或​​离开房间。一开始就保证空房间,一次只能有一个人通过门。

要知道一个人进入或离开,有两个传感器A和B,根据激活的顺序表明一个人是进入还是离开。 A然后B表示一个人进入房间,B然后A表示一个人离开房间。

现在,我必须在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;
     }
 }

我担心的是:

  • 我定义的状态是否正确?我的意思是,为传感器被激活时定义状态是正确的还是状态应该是进入和离开?
  • 我如何绘制状态图?我刚刚学习FSM,所以我有问题搞清楚,比如你怎么能保证如果房间空了,一个人不会离开?我可以在代码中检查这个条件,但我不知道如何表示它。

1 个答案:

答案 0 :(得分:2)

  

我定义的状态是否正确?我的意思是,为传感器被激活时定义一个状态是正确的还是状态应该是进入和离开?

我认为你的州很好。不要将名称与他们代表的内容混淆。您需要一个状态来表示组合的传感器被激活偶数次(这也是初始状态),一个用于奇数个先前激活,最后一个激活为A,一个用于奇数先前激活的次数,最后一次是B。

  

我如何绘制状态图?

你有三种状态。为它们写下名称或标签,在它们周围绘制圆圈,并为不同传感器激活时发生的过渡绘制带标签的箭头。 (另见下文。)

  

我刚刚学习FSM,所以我有问题搞清楚,比如你怎么能保证如果房间空了,一个人不会离开?我可以在代码中检查这个条件,但我不知道如何表示它。

除非您在房间内设置占用限制,否则无法使用有限状态机表示该条件。 (上述评论假设您没有这样做,因此房间占用者的数量不属于FSM状态。)如果您想要走这条路线,那么您需要采用不同的方法,每个占用者的数量都有不同的状态。由于这是一个介绍性练习,我倾向于认为这不是你想要做的。

另请注意,无论您是否为占用限制建模,都有一些转换既没有明确禁止也没有分配行为。具体来说,如果从初始状态开始,连续两次触发两个传感器中的一个,会发生什么?例如,想象一下,它们相距足够远以容纳触发一个人的人,然后再回到门口并再次触发它。如果他们被允许(也许即使不是),那么他们应该在你的图表上表示。无论是否允许,您的代码都应该考虑到它们。