C/Arduino 和图中人员在房间计数器的 FSM
FSM for a people in room counter in C/Arduino and diagram
首先,如果这不是 post 这个问题的正确站点,请原谅我,但我不知道在哪里问这个问题。
我需要实现一个 FSM 来表示一个房间里的人数,有两种可能性,人们可以进入房间或离开房间。一开始保证空房间,一次只能进一个人
为了知道一个人是进入还是离开,有 2 个传感器 A 和 B,它们根据激活的顺序指示一个人是进入还是离开。 A then B表示有人进房间,B then 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,所以我在弄清楚它时遇到了问题,比如你怎么能保证如果房间是空的,一个人不会离开?我可以在代码中检查该条件,但我不知道如何表示它。
Are the states I defined correct for the problem? I mean, defining a state for whenever a sensor is activated is right or should the states be Entering and Leaving?
我觉得你的状态很好。不要将他们的 名称 与他们 所代表的 混淆。您需要一种状态,表示传感器组合起来已被激活偶数次的情况(这也是初始状态),一种表示先前激活的奇数次,最后一次激活是 A,另一种表示奇数次先前激活的次数,最后一次激活是 B.
How can I diagram the states?
你有三种状态。为它们写下名称或标签,在它们周围画圈,并为不同传感器激活时发生的转换绘制带标签的箭头。 (另见下文。)
I'm just learning about FSM so I have problems figuring it out, like how can you guarantee that if the room is empty a person doesn't leave? I can check for that condition in code but I don't know how to represent it.
你不能用 有限 状态机表示该条件,除非你对房间设置了入住限制。 (上面的评论假设你不这样做,因此房间占用人数不是 FSM 状态的一部分。)如果你想走那条路,那么你需要一种不同的方法,每个占用人数都有不同的状态.由于这是一个介绍性练习,我倾向于认为这不是您想要做的。
另请注意,无论您是否对占用限制进行建模,有些转换您既没有明确禁止也没有指定行为。具体来说,如果从初始状态开始,两个传感器中的一个连续被触发两次,会发生什么情况?例如,想象一下,它们相距足够远,可以容纳一个人触发一个,然后在门口转身再次触发它。如果它们被允许(即使不允许),那么它们应该在您的图表中表示出来。无论是否允许,您的代码都应该考虑到它们。
首先,如果这不是 post 这个问题的正确站点,请原谅我,但我不知道在哪里问这个问题。
我需要实现一个 FSM 来表示一个房间里的人数,有两种可能性,人们可以进入房间或离开房间。一开始保证空房间,一次只能进一个人
为了知道一个人是进入还是离开,有 2 个传感器 A 和 B,它们根据激活的顺序指示一个人是进入还是离开。 A then B表示有人进房间,B then 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,所以我在弄清楚它时遇到了问题,比如你怎么能保证如果房间是空的,一个人不会离开?我可以在代码中检查该条件,但我不知道如何表示它。
Are the states I defined correct for the problem? I mean, defining a state for whenever a sensor is activated is right or should the states be Entering and Leaving?
我觉得你的状态很好。不要将他们的 名称 与他们 所代表的 混淆。您需要一种状态,表示传感器组合起来已被激活偶数次的情况(这也是初始状态),一种表示先前激活的奇数次,最后一次激活是 A,另一种表示奇数次先前激活的次数,最后一次激活是 B.
How can I diagram the states?
你有三种状态。为它们写下名称或标签,在它们周围画圈,并为不同传感器激活时发生的转换绘制带标签的箭头。 (另见下文。)
I'm just learning about FSM so I have problems figuring it out, like how can you guarantee that if the room is empty a person doesn't leave? I can check for that condition in code but I don't know how to represent it.
你不能用 有限 状态机表示该条件,除非你对房间设置了入住限制。 (上面的评论假设你不这样做,因此房间占用人数不是 FSM 状态的一部分。)如果你想走那条路,那么你需要一种不同的方法,每个占用人数都有不同的状态.由于这是一个介绍性练习,我倾向于认为这不是您想要做的。
另请注意,无论您是否对占用限制进行建模,有些转换您既没有明确禁止也没有指定行为。具体来说,如果从初始状态开始,两个传感器中的一个连续被触发两次,会发生什么情况?例如,想象一下,它们相距足够远,可以容纳一个人触发一个,然后在门口转身再次触发它。如果它们被允许(即使不允许),那么它们应该在您的图表中表示出来。无论是否允许,您的代码都应该考虑到它们。