本文基于FSM ,采用以下方法来模型化机床的行为:
(1) 考察对象的运行周期,识别相应的、较固定的、具有某些相同特点的时间段,将其抽象为状态。
(2) 考察对象能否从一个状态变为另一个状态,如果能变,探究状态变化的原因(抽象为事件) ,确定是否伴随发生一些反应(抽象为动作) ,从而定义转移,转移=〈事件,动作,目标状态〉。另外,还存在一种自身转移,它是源状态等于目标状态的转移,触发自身转移的事件可能是对象内部自生成的,如刷新事件(up date) ,可参见下文的例子。
(3) 考察每个状态,看其是否应该分解。通过对状态的层次结构分解,将一个大的状态分解为若干子状态,分解层数的多少取决于系统的复杂程度;再逐步细化,直到所有的状态都是原子的(不再分解的) ,确定原子状态之间的转移形成状态机。通过上述方法完成系统的有限状态机规划。
3 基于有限状态机的行为重构机理
机床FSM 的内容实际上由状态集合、事件集合、转移集合和动作集合组成,称之为状态表。在实际应用中,由于系统的配置发生变化(增删设备、引入新功能或新的控制算法等) 而改变系统的行为时,对数控软件系统而言,则需重新规划FSM ,创建新的状态表。
状态表可以采用链表的结构,链表中的每个单元都包含一个状态标志,还有一个指向转移集合的指针。每个转移又包含一个触发它的事件标志和动作集,以及指向下一个状态的指针,其中动作集是状态转移时被调用函数的完整集合。状态表的组织结构如图3 所示。每个状态具有一系列转移(转移集) , 其中, 状态state7 为组合状态, 对应状态state7. 1 和state7. 2 构成的下一层FSM。当系统需求改变而导致行为发生变化时,对应状态表内容的添加、删除和替换,如图3 中阴影表格所示,可以进行动作的替换(采用modifiedAction ()替换action3 () ) ,添加新的状态( newState) 、新的转移( &t ran7) 和新的事件(newEvent1) 。通过对状态表的修改来完成基于FSM 的系统行为重构。由于FSM 采用层级式管理,行为改变通常仅对特定子系统产生影响,只需要修改相应模块的状态表即可。一般情况下,将一个新的状态表以文件的形式保存,在系统启动时加载,就可以实现执行代码级别的行为重构。为此,对于每个模块,设计了多个状态表来规定它在不同系统模式下的不同行为,系统启动时只加载其中一个状态表,使同一模块可以满足于不同的应用。当系统行为变化涉及到修改动作集时,就需要编写源代码,因为动作是在状态转化时被调用的函数。
为了便于创建和修改状态表,还设计了FSM基础类库。它不仅提供了定义、查询和修改状态表的接口,而且是FSM 机制运行的驱动中心,其作用与硬件设备驱动程序类似。系统运行时,FSM 基础类库负责接收事件,在状态表中根据当前状态查找对应的转移,触发规定的动作,进而实现了系统的特定功能。FSM 基础类库是实现系统行为重构的关键。
因此,在行为重构过程中, 设计者不必关心FSM 机制的实施细节,只需负责FSM 的重新规划和动作集合的编程(如果需要) ,可大大减少重构的时间和成本。
4 重构实例验证
现以一个实例,即向已有三轴铣床数控软件中添加监控刀具破损功能,来演示系统行为重构的能力。
4.1 三轴铣床软件系统的原始构成
三轴铣床数控系统采用模块化思想建造,软件系统的组成如图4 所示。其中:
(1) 任务协调器 进行任务分配,并协调各个模块的运行。
(2) 译码模块 完成语法检查、译码和刀具补偿功能。
(3) 轴组模块 完成加减速处理和插补功能,向各轴发送相应的设定点协调它们的运动。
(4) 轴模块 接收来自轴组的设定点,进行单轴控制,向外部设备发送信号。
按照前述的行为建模规则,任务协调模块、轴组模块、轴模块的简化FSM 如图5所示,它们按照图3 的结构层次集成起来组成系统。其中,任务协调器是控制软件的调度中心,FSM 位于系统的顶层,其他模块FSM 在其管理下并行运行,状态的自动(auto) 或手动(manual) 方式对应于系统的加工模式。