我们今天简要介绍RS指令在状态机中怎么处理的。有些设备按下停止按钮后,没有马上停止,而是到原点后才停止,那么这种情况在状态机中如何表示呢?我们以案例说明之,下面是我们的控制描述。
控制描述
小车从左位开始,从左向右行使,到达右位后停5秒,然后从右向左运行,到达左位后停3s,继续向右运行。当按下停止按钮后,小车不是马上停止,而是到达左位后才停止。我们假设左边的到位信号位isOnLeftPos,右边的到位信号为isOnRightPos,向左的运行动作为GoLeftPos,向右的运行动作为GoRightPos,启动停止按钮分别为start和stop。
对于这样的控制任务,我们该怎么作呢?难点在于处理stop按钮信号,小车运行中,按下stop按钮,不是马上停止,而是要到达左位后才停止。这里我们用了状态机的并行结构。Signals状态处理stop信号,Logic状态处理逻辑动作。
这一张图是程序的总体,图右侧的OnRightPos和OnLeftPos是方便我们观察左右位的状态,实际使用中可以不用输出。
这张图是实际的控制。左边处理stop信号,右边处理小车控制逻辑。另外这里我们要说明一下命名规则:大写开头的是指各状态,比如OnLeftPos,Signals等等,小写开头的是条件,比如isOnRightPos, stop. 假设小车的当前状态处于GoRightPos,按下stop按钮,Stop的子状态Set就激活,那么〔in(Signals.Stop.Set)]条件满足,但当前状态不在OnLeftPos,没有发生转移,此时小车继续运行,等小车到达OnLeftPos状态时,OnLeftPos状态才开始转移到Idle状态,此时〔in(Logic.Idle)]条件满足,Stop的子状态从Set转移到Reset。
控制程序
这次的控制程序和以前稍有不同,用个并行状态处理stop信号,在第一篇博客中,我们也用一个并行状态处理上升沿问题。整个程序多了一段case,一段描述Signals,一段描述Logic,方法和以前一样,也是比较简单的,等下次我们在此状态机的基础上,介绍完历史状态后,一并写出程序。另外,为了方便,我们以后就用ST语言写了。