状态机知识
- 状态A所做的事情
- 状态B所做的事情
- A到B转换的条件
- B到A转换的条件
- 结束的条件
- 在各个转换的过程中所执行的转换动作
示例程序在此处
D:\Program Files (x86)\National Instruments\LabVIEW 2014\ProjectTemplates\Source\Actor Framework
学习文档
- Process State.lvclass (inherits from State Actor.lvclass)
- 是 context actor ,是组成所有状态的操作者的共同的祖先
- 继承自该类的状态有:Idle.lvclass, Running.lvclass
- Context actor 特点
- 所有状态共享的属性
- 重写Substitute Actor.vi,将属性从一个状态(操作者)转移到另一个状态(操作者)
- 重写Actor Core.vi
- 改变状态的方法(method)
- 父操作者能调用的方法,这个方法可以改变状态(?)
- 调用这些方法的消息类
- Change State.vi(是 State Actor 的成员)
- 改变状态的方法(method)会调用Change State.vi
- Process States.lvlib(状态类,继承自 context actor 即 Process State.lvclass)
- 重写Entry.vi和Exit.vi,这两个函数可以进出状态
- 随着状态的改变,一些行为会发生变化,重写这些方法
- 新建这个状态特有的一些行为
- 调用这些行为的消息类
- Context actor's state transition methods(定义转换动作)
- 包括进入转换动作和退出转换动作
- 创建方法重写 Substitute Actor.vi
- 创建消息类
- 当操作者在某一状态,接收到不合适的消息数据类型时会产生错误
- 可以选择自动丢弃这一数据,且不抛出异常
- 更改 Do.vi Method
- 如果你想要更复杂的行为,可以把这个行为函数放置在父类中,这样子类就可以不同地重写这一函数
- 运行过程
- 启动系统:将一个初始状态传给Launch Actor.vi
- 系统的调用者(Caller)发送公共状态转换消息给一个State,间接调用状态转换函数(方法);或者一个State自己直接调用转换函数
- State Pattern UI.lvclass
- 这是用户接口,这个操作者启动一个State Pattern Actor, Process States, as a nested actor
思考
- 操作者们需要哪些状态?状态图怎么画?
- 在一个状态中可不可以实现触发执行动作(已证明可以)和周期执行动作?
- 怎样实现?
测试
- 对父类的Go to Idle.vi和子类的 Go to Idle.vi进行断点测试,发现这两个函数并无关系,谁先执行谁后执行,取决于发消息的对象到底发送给了谁。
- 你会发现父类和子类都有相应函数,但是消息类只有一个(?)
- 认为可以在响应函数中加入循环,使用通知器等线程同步方法对循环进行控制
- 每一个拥有状态机模型的对象都可以有这样一个类结构,包括:State UI 类,Process父类,若干个State类
- UI类包括界面和核心函数
- Process父类包括核心函数(此核心函数没有循环,请注意其程序框图),和状态切换函数,此函数用于切换状态
- State类,包括近出入状态的函数和状态停留执行函数(当前项目中这个函数为触发型),此函数应该可以改造为周期执行,不过周期执行函数也可以看做为周期触发,即在上一层(调用)函数中设置周期触发逻辑。
看教科书
- 在软件模型设计的过程中,画出状态图,就可以依照状态图设计出操作者框架的状态模型。
边设计边编程
- 根据当前项目的要求,画出状态图,根据状态图进行设计