状态图可以帮助编写功能强大的系统

计算的状态图模型可以说是系统行为最具功能描述性的模型。状态图通过层次结构、并发性和事件等编程概念为程序员提供了具有强大可伸缩性的高级设计工具。状态图编程模型在设计必须响应各种事件的复杂系统时特别有用,例如……

Gerardo Garcia,国家仪器公司 二零零七年八月一日

计算的状态图模型可以说是系统行为最具功能描述性的模型。状态图通过层次结构、并发性和事件等编程概念为程序员提供了具有强大可伸缩性的高级设计工具。状态图编程模型对于设计必须响应各种事件的复杂系统(如嵌入式控制系统和通信系统)特别有用。状态图最常与其他计算模型一起用于编写功能强大的系统。

这个状态图(图1)显示了五种状态和七个转换,说明了自动售货机是如何运作的。

状态图的历史

状态图是由魏茨曼科学研究所的大卫·哈雷尔在20世纪80年代发明的,它的名字来源于经典的状态图。根据Harel的说法,状态图的目的是“用层次、并发性和通信的概念扩展传统的状态转换图”。

在状态图引入之后的几年里,市场上出现了一些设计这些图的软件工具,包括I-Logix Statemate、the MathWorks, Inc.。Stateflow软件,Esterel SCADE,以及最近的National Instruments LabView Statechart模块。更重要的是,状态图被采用为统一建模语言(UML)规范中的行为图,该规范广泛用于嵌入式系统建模。

状态图在处理系统行为的方法上与顺序功能图(sfc)非常相似。SFC语言是IEC 1131-3系列语言的一部分,用于可编程逻辑控制器(plc)。另一方面,状态图通常不用于PLC编程;相反,它们被用来模拟在基于微处理器的系统和单板计算机上的嵌入式实时操作系统上运行的软件。

状态图和sfc在状态、转换和并行执行方面有共同的概念,但命名稍有不同。例如,转换条件在sfc中被称为警卫在状态图。状态图和sfc的语义也有很大的不同。状态图的可视化表示基于状态图,而sfc采用自顶向下的方法,更类似于流程图。

要开始理解状态图,最好从经典的状态图开始,然后添加层次结构、并发性和事件的概念。经典的状态图由两个主要构造组成:状态和转换。在图1中,状态图描述了一个简单的汽水自动售货机,它有五个状态和七个转换,以说明机器是如何运行的。图2显示了描述同一台机器行为的状态图。层次结构和事件的概念减少了状态和转换的数量。

在状态图中,可以在超状态中嵌套“count coins”和“dispense”状态。您只需要定义从这两种状态中的任何一种到“返回更改”状态的一个转换(T3)。您可以配置T3转换以响应三个事件:汽水分发、请求的更改或硬币被拒绝。此外,您可以通过向转换T2引入“保护”条件来消除“等待选择”状态。保护条件必须求值为“true”,才能发生转换。如果保护条件的结果为“false”,则该事件将被忽略,并且转换将不会发生。

现在展开状态图,通过向自动售货机中的软件添加温度控制元素来演示并发性的概念。图3显示了如何将点胶逻辑和温度控制封装到一个状态的。-状态类似于sfc中的同步序列-它们描述了一个系统同时处于两个相互独立的状态。T7转换显示了状态图如何定义一个适用于两个子状态图的出口。

除了层次结构和并发性之外,状态图还有其他特性使其对复杂系统很有价值。它们有一个历史概念,允许一个超级国家“记住”它内部的哪个次级国家以前是活跃的。例如,考虑一个超状态,它描述了一台机器,它将物质倒入,然后加热。一个halt事件可能会在浇注过程中暂停机器的执行。当发生恢复事件时,机器会记得恢复浇注。

使用状态图时出现的一个明显问题是如何定义状态的执行?例如,与C语言或阶梯相比,状态图并不代表完整的编程解决方案。虽然可以用C语言编写完整的应用程序,但状态图通常需要使用另一种语言来定义状态执行。这类似于在sfc中定义操作。

Statechart用户通常使用C或其他基于文本的语言来定义状态中的操作。一些状态图工具(如I-Logix Statemate)允许您生成可以部署到嵌入式目标的C代码。您可以将NI LabVIEW Statechart模块(使用图形数据流来定义状态图的动作)直接部署到桌面系统、人机界面(hmi)、可编程自动化控制器(PAC)(如NI CompactRIO和PXI)以及PAC硬件中的现场可编程门阵列(fpga)。

的优势

完整的系统表示。状态图描述了系统的完整功能和每种可能的状态。使用状态图有助于消除软件“挂起”的可能性,因为您被迫考虑软件需要响应的替代方案。

自我解释。状态图类似于图形数据流,因为它们是自文档化的。设计团队的新成员可以查看状态图并快速掌握系统的元素。

事件响应。状态图编程模型对于“响应式”系统特别有用,这种系统的特征在于它们如何响应输入。您可以根据事件的任何组合来定义状态反应和转换。

弱点

不完备。状态图并不完整。您必须将它们与定义状态行为的不同计算模型配对。然而,这并不是一个真正的弱点,因为状态图并不是对状态行为进行编程的正确模型。

数据通信。状态图不能很好地表示状态之间的数据流动。虽然转换显示执行流,但它们并不表示数据。在大多数情况下,数据是通过全局变量传递的,这些全局变量在图表示中是不可见的。

计算的状态图模型为嵌入式设计人员提供了一种处理复杂应用程序开发的复杂方法。Statecharts对于编程事件响应应用程序特别有用,例如复杂的用户界面和用于实现动态系统控制器、机器控制逻辑和数字通信协议的高级状态机。状态图也常用于动态系统仿真。

作者信息
Gerardo Garcia是美国国家仪器公司的工业和嵌入式软件经理。

编程方法系列

Statecharts是本系列探讨不同软件编程方法的第三部分。本系列的目标是帮助程序员根据系统需求和体系结构选择最佳的计算方法。该系列在3月份介绍了阶梯逻辑,5月份介绍了文本语言,7月份介绍了功能块。9月份的最后一期将介绍仿真/建模方法。