当下游设备满足以下条件时,可以进入L1状态。如果下游设备是一个Switch,这个Switch的所有下游端口处于L1或者更高一级的节电状态。而上游设备需要经过协商才能进入L1状态。在PCIe总线中,L1状态由L1.Entry和L1.Idle两个子状态组成,如图8-14所示。图8-14 L1状态机PCIe设备从L0状态首先进入L1.Entry状态。......
2023-10-20
状态机是一种最为经典的程序设计模式,最基本的状态机结构如图5-1所示。状态是状态机运行的经脉,在开始使用状态机模式编写程序时需要将应用分为若干个状态。
由图5-4可知,LabVIEW标准状态机主要由一个While循环(①)和一个条件结构(③)构成,并利用移位寄存器(②)来实现状态的跳转。为了方便编程,可采用自定义类型来实现状态枚举值,这样当需要修改程序状态时,只需要改变自定义类型就可以改变所有的枚举变量。
图5-4 标准状态机程序框图
【例5-2】 基本状态机应用
前面板具有3个按钮控件和1个波形显示控件,功能分别是:
1)“开始采集”按钮:Label是Start,单击后开始进行模拟数据采集程序(这里使用随机数代替)。
2)“关于”按钮:Label是About,单击后弹出对话框以说明这个程序的版权、帮助等信息。
3)“停止”按钮:Label是Stop,单击后停止程序的运行。
4)波形显示控件:用于显示获取的随机数。
这是一个非常简单的应用,但是具有一定的代表性。根据要求,该应用至少包含以下5种状态结构:
1)Initial:初始化状态。
2)Idle:空闲状态,用于响应各种用户界面操作。
3)Acquire:采集状态,用于持续模拟采集数据。
4)About:用于弹出关于和帮助对话框。
5)Stop:停止状态,退出循环并中止程序。
数据采集应用基本状态机的程序前面板如图5-5所示。
数据采集应用基本状态机各个状态的程序框图如图5-6所示。
图5-5 基本状态机的程序前面板
图5-6 数据采集应用基本状态机程序框图
a)Initial状态 b)Idle状态
图5-6 数据采集应用基本状态机程序框图(续)
c)Start状态 d)Acquire状态假分支 e)Acquire状态真分支
图5-6 数据采集应用基本状态机程序框图(续)
f)Stop状态 g)About状态
分析图5-6中的基本状态机,可以看出状态始终贯穿整个应用程序,并由移位寄存器进行值的寄存和传递。当前状态分支的结果将决定下一个状态,如图5-6b中的Idle状态。在这个状态中,程序将自动检测前面板的三个按钮是否被按下。如果“Start”按钮被按下,则进入Acquire状态;如果“About“按钮被按下,则进入About状态;如果“Stop”按钮被按下,则进入Stop状态;如果没有任何按钮被按下,则仍然进入当前的Idle状态继续检测。在Acquire状态中,为了保证程序的重复采集使得下一个状态仍然为Acquire,但是这样会导致程序无法停止(中断采集),于是需要在Acquire状态分支中加入Stop的探测,如果“Stop”按钮被按下,则不再进入Acquire状态而直接进入Stop状态。
例5-2中使用的是“枚举(enum)”型结构来标记状态,事实上也可以使用其他的数据类型替换,如下拉列表(ring)、数值(numeric)或字符串(string)。从严格意义而言,ring并不属于一种数据类型,它只是一种特殊的numeric,其性质与numeric基本上一样。尽管ring与enum控件从外观上看去类似,如图5-7所示,但是它们实质上是不同的。主要体现为以下7点:
图5-7 枚举类型和下拉列表外观
1)enum型代表的值只能够为U8、U16和U32型,而ring型代表的值允许为I8、I16、I32、I64、U8、U16、U32、U64、EXT、SGL、DBL和FXP型。
2)ring型实质上是一种numeric型,而enum型是一种独立于numeric之外的数据类型。
3)当把ring或enum型控件分别连接到条件结构时,对ring型而言,条件结构的选择端子只能够显示数值;而对enum型而言,条件结构的选择端子能够显示具体的枚举值。
4)ring的strings[]属性可以在程序运行时被修改,而enum的strings[]属性在程序运行时却无法被修改。
5)当把ring型和enum型控件分别制作成自定义类型控件(TypeDef.)时,ring的控件实例可以任意设置其strings[]属性的值,而enum的控件实例却无法设置strings[]属性的值。
6)当把ring型和enum型控件分别制作成自定义类型控件(TypeDef.)时,改变ring的Type Def中控件strings[]属性的值,其对应实例的strings[]属性却不会改变;而改变enum的TypeDef中控件的strings[]属性的值,其对应的实例的strings[]属性会随之发生变化。
7)ring型控件对应的各个状态可以表示任何值(在控件的“属性”→“编辑项”对话框中),而enum控件对应的各个状态只能够从0开始顺序表示(在控件的“属性”→“编辑项”对话框中)。
由于应用程序的各个状态在设计时就是相对固定的,不会在应用程序中进行修改。对比以上ring型和enum型的区别,可以看出在基本状态机中,enum更适合来标记状态。首先当把enum直接与条件结构相连时,条件结构的选择端会立刻显示enum的各个状态值,有利于程序的理解和维护;其次,当把enum制作成一个TypeDef型自定义控件时,如果之后要增加新的状态则只需要修改TypeDef型的strings[]属性,此时其各个实例的strings[]属性会随之改变。
基本状态机模式大体上能够满足主程序结构的需要。该模式能够很好地使得应用程序的各个功能以状态的方式有顺序地执行,并且保证了程序的可读性(以状态图的方式显示清晰明了)和扩展性(日后只需要扩展状态即可扩展相应的功能)。
但基本状态机也有局限性:
1)状态的分类不清晰。试想,如果有几十个状态,那么条件结构的选择端会显得没有条理。事实上,我们是可以对状态进行分类的,如数据采集、数据分析均属于对数据的操作。其实并没有统一规定如何对状态进行分类,其目的在于使程序能够清晰明了。
2)缺乏数据共享和错误处理机制。例如在数据采集之后还需要增加一个数据分析的状态,那么如何将采集得到的数据提供给数据分析模块呢(使用局域变量、全局变量、共享变量或其他)?这一点并不能称为基本状态机的缺点,只是在上面的例程中没有实现,所以单独列出。
3)每一个状态分支只能够决定后面的一个状态,而无法决定一个状态序列(多个状态)。假如状态机有三个状态A、B、C,前面板上有三个按钮依次为B1、B2和B3。如果单击B1时需要使得三个状态按照A→B→C的顺序执行,当单击B2时需要使得三个状态按照B→A→C的顺序执行,当单击B3时需要使得三个状态按照C→A→B的顺序执行。这种情况是无法使用基本状态机模式解决的。
4)程序一直在占用CPU资源。即使在Idle状态下,仍然需要对前面板的控件值进行监控以确定对哪一个状态进行响应。
5)无法响应更多的前面板事件。如当单击窗口右上角的“×”时,弹出一个确认退出的对话框;当鼠标在前面板拖曳时,捕获这个事件。这种情况是无法使用基本状态机模式解决的。
6)任何时刻只能有一个状态在运行。如果用户需要在数据采集过程(Acquire状态)中查看“关于&帮助”对话框(About状态),那么基本状态机模式只能暂停数据采集而显示对话框,无法实现在查看“关于&帮助”对话框的同时仍然进行数据采集。
有关虚拟仪器与数据采集的文章
当下游设备满足以下条件时,可以进入L1状态。如果下游设备是一个Switch,这个Switch的所有下游端口处于L1或者更高一级的节电状态。而上游设备需要经过协商才能进入L1状态。在PCIe总线中,L1状态由L1.Entry和L1.Idle两个子状态组成,如图8-14所示。图8-14 L1状态机PCIe设备从L0状态首先进入L1.Entry状态。......
2023-10-20
BACnet MS/TP定义了3个有限状态机:第一个是BACnet接收数据帧状态机;第二个是BACnet Master节点状态机;第三个是BACnet Slave节点状态机。在BACnet MS/TP主程序中,当主程序处理完接收数据帧状态机,就会进入BACnet MS/TP的BACnet Master节点状态机中,在BACnet接收数据帧状态机中会反馈接收状态,该状态会在BACnet Master节点状态机作为函数执行的一个判断条件。......
2023-08-29
答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。状态机模式的基本构成元素是while循环和条件结构,而事件结构模式的基本构成元素是while循环和事件结构,因此新的模式应该由while循环、条件结构和事件结构组成。图5-26中的第二种结构综合了状态机和事件结构的优点,有效地克服了基本状态机的第1~5个问题。图5-28 二维数组排序应用前面板系统使用状态机和事件结构相结合的模式,如图5-29所示。......
2023-07-02
PCIe总线在进行链路训练时,将使用LTSSM状态机。LTSSM状态机由“Detect”、“Pol-ling”、“Configuration”、“Disabled”、“Hot Reset”、“Loopback”、“L0”、“L0s”、“L1”、“L2”和“Recovery”共11个状态组成。LTSSM状态机的转换逻辑如图8-5所示,而各个状态的含义如下所示。图8-5 LTSSM示意图●Detect状态。当PCIe链路被复位或者数据链路层通过填写某些寄存器后,LTSSM将进入该状态。该状态也是LTSSM的初始状态。该状态是LTSSM状态机的重要状态。......
2023-10-20
所有的BACnet设备都应能工作在响应方BACnet用户状态,从而能够接收请求方BACnet用户发来的APDU。事务处理状态机请求方和响应方BACnet用户为每一个事务处理都要创建并且维护一个TSM。为了简化状态机的描述,这里仅给出应用实体所进行分段的情况,应用程序所进行的分段也是存在的。当更新的状态机接收到分段确认PDU,就向应用程序传递一个分段确认指示原语。......
2023-08-29
PROFIBUS-DP从站的状态机制很好地说明了DP从站是如何工作的。图5-3所示为经简化了的状态机制,用椭圆表示状态机制的状态,从一个状态转换为另一个状态称为事件,垂直箭头表示转换。图5-3 PROFIBUS-DP从站的状态机制1.Power_On(通电)仅在Power_On状态,从站接收二类主站的Set_Slave_Add报文以改变从站地址,从站应具有非易失性存储器从站存储地址。如果总线拥挤而未能触发看门狗,状态机制进入故障安全状态等待参数化。......
2023-11-20
根据5.2.2节中基本状态机的局限性1)~3),需要对模式进行改进。本节将分析这些问题对应的解决方案,并最终形成一种新的状态机模式——消息队列型状态机模式。在LabVIEW程序设计模式中将这种具备处理状态序列的状态机称为“消息队列型状态机”,它是在基本状态机基础上的改进,这种模式通常被用于需要特定处理顺序的场合。......
2023-07-02
图5-2 顺序状态机结构与顺序结构在状态之间的数据传递中,顺序状态机与顺序结构的实现方式是不同的。顺序型状态机模式的整个顺序状态序列的顺序是固定的,在程序运行时无法改变。也正是这一点制约了顺序型状态机的应用,因为它妨碍了作为LabVIEW优点之一的程序并行运行机制。为了能够在程序运行中改变状态序列的执行顺序,可以对其加以改进,采用移位寄存器代替循环索引控制状态机的执行。......
2023-07-02
相关推荐