摘 要:通過(guò)分析工控系統(tǒng)的特性,提出采用狀態(tài)機(jī)的思想進(jìn)行工控軟件設(shè)計(jì)。詳細(xì)論述了高速狀態(tài)機(jī)的錯(cuò)步問(wèn)題以及控制層中狀態(tài)機(jī)的狀態(tài)劃分問(wèn)題。結(jié)合具體的應(yīng)用實(shí)例,給出了基于狀態(tài)機(jī)的實(shí)現(xiàn)方法。實(shí)驗(yàn)表明,采用狀態(tài)機(jī)的設(shè)計(jì)方法有助于準(zhǔn)確描述受控對(duì)象的行為,軟件的健壯性和可靠性得到顯著提高。
關(guān)鍵詞:有限狀態(tài)機(jī) 工控軟件 控制環(huán) 狀態(tài)劃分
1. 引言
1.1 工控軟件的一般問(wèn)題
工控軟件設(shè)計(jì)可分為基于控制環(huán)和基于實(shí)時(shí)操作系統(tǒng)兩大類??刂骗h(huán)是把各個(gè)功能模塊連接成首尾相接的環(huán)狀結(jié)構(gòu)。其特點(diǎn)為任何一個(gè)功能模塊都不能出現(xiàn)死循環(huán),甚至循環(huán)次數(shù)太多的循環(huán)語(yǔ)句都應(yīng)避免出現(xiàn)。以保證能夠在實(shí)時(shí)意義上盡可能快地遍歷各功能模塊,從而滿足實(shí)時(shí)多任務(wù)的需求。在各功能模塊中一般用狀態(tài)機(jī)來(lái)描述模塊所處的狀態(tài)。而實(shí)時(shí)操作系統(tǒng)則可以通過(guò)一套底層機(jī)制根據(jù)優(yōu)先級(jí)和各任務(wù)狀態(tài)調(diào)度各功能模塊。此時(shí)各功能模塊就以“任務(wù)”作為表現(xiàn)形式。但是在每個(gè)任務(wù)內(nèi)部仍然為一個(gè)獨(dú)立的控制環(huán)結(jié)構(gòu),仍然需要用狀態(tài)機(jī)描述。本文將結(jié)合工程實(shí)踐論述狀態(tài)機(jī)在工控中的應(yīng)用,給出通用模型和注意要點(diǎn)。
1.2 有限狀態(tài)機(jī)
有限狀態(tài)機(jī)是一種重要的思想方法。從數(shù)學(xué)的角度看,它實(shí)際是一個(gè)五元組M = (I, O, S, δ, λ),其中I,O分別表示輸入輸出,S為狀態(tài)向量,δ為次態(tài)方程(δ: S×I ->S), 表示輸出方程(λ: S×I -> O)。有限狀態(tài)機(jī)從結(jié)構(gòu)體系上有層級(jí)狀態(tài)機(jī),并發(fā)狀態(tài)機(jī)等。層級(jí)狀態(tài)機(jī)類似于軟件中的子程序調(diào)度:更高層的一個(gè)狀態(tài)對(duì)應(yīng)于較低層的一個(gè)狀態(tài)機(jī)。這個(gè)高層的狀態(tài)處于底層狀態(tài)機(jī)的某個(gè)狀態(tài)中。這個(gè)低層狀態(tài)稱為子狀態(tài)。與子程序調(diào)用受到系統(tǒng)堆棧深度制約不一樣,層級(jí)狀態(tài)機(jī)可以由開(kāi)發(fā)者根據(jù)控制對(duì)象的層次性運(yùn)動(dòng)規(guī)律任意指定深度。與子程序的目的一樣,層級(jí)狀態(tài)機(jī)也是為了提高控制軟件的模塊化程度,降低狀態(tài)分析的復(fù)雜度。并發(fā)狀態(tài)機(jī)偏重于描述狀態(tài)機(jī)的調(diào)度。狀態(tài)機(jī)本身不能實(shí)現(xiàn)什么并發(fā)功能,并發(fā)的實(shí)現(xiàn)是通過(guò)軟件調(diào)度的。如果把狀態(tài)機(jī)理解成一個(gè)任務(wù),那么就能理解并發(fā)的實(shí)現(xiàn)。在控制環(huán)中,一個(gè)“任務(wù)”就是一個(gè)功能模塊,我們只需要把多個(gè)狀態(tài)機(jī)串聯(lián)在環(huán)中,也就是實(shí)現(xiàn)了多輸入多輸出的并發(fā)控制。此時(shí),多個(gè)狀態(tài)機(jī)在空間上是并存的,然而卻是分時(shí)調(diào)用的,調(diào)用的周期等同于控制環(huán)掃描一周的時(shí)間。不過(guò)如果CPU運(yùn)算速度足夠快,這個(gè)周期將會(huì)足夠的快,達(dá)到“實(shí)時(shí)”的程度,從而這多個(gè)狀態(tài)機(jī)也就實(shí)現(xiàn)了“并發(fā)”運(yùn)行。同理,在多任務(wù)操作系統(tǒng)中,“并發(fā)”的實(shí)現(xiàn)就更容易理解了,除了在單個(gè)任務(wù)內(nèi)存在控制環(huán)的并發(fā)控制外,在任務(wù)之間也同樣存在多狀態(tài)機(jī)的并發(fā)運(yùn)行。當(dāng)然,從CPU的角度而言,只要是單核的,也就從來(lái)不存在真正的“并發(fā)”,它在任何一個(gè)特定的時(shí)間點(diǎn)都只能處理某個(gè)特定狀態(tài)機(jī)。不過(guò)多任務(wù)操作系統(tǒng)卻提供了一套底層機(jī)制來(lái)調(diào)度原來(lái)僅靠控制環(huán)來(lái)調(diào)度的任務(wù)。
2.有限狀態(tài)機(jī)在前后臺(tái)信息交互中的作用
工控系統(tǒng)一般都具有人機(jī)對(duì)話界面。其通常的操作模式為用戶進(jìn)入某個(gè)頁(yè)面,選取某項(xiàng)操作并執(zhí)行。人機(jī)對(duì)話界面通常被設(shè)定為一個(gè)獨(dú)立模塊。該模塊軟件結(jié)構(gòu)為一個(gè)消息控制環(huán)。用戶在硬件接口的操作會(huì)通過(guò)接口的驅(qū)動(dòng)程序封裝成消息加入到專屬界面模塊的消息隊(duì)列中。消息控制環(huán)循環(huán)掃描該隊(duì)列,如有新消息則提取并解釋然后封裝成新消息發(fā)往后臺(tái)執(zhí)行。前后臺(tái)軟件的接口模塊負(fù)責(zé)分發(fā)界面消息到各個(gè)執(zhí)行模塊。消息應(yīng)包括目標(biāo)模塊的編碼,命令編碼以及命令參數(shù)。前后臺(tái)接口模塊的軟件結(jié)構(gòu)多采用以下兩種模式。
[align=center]
圖1 兩種消息分發(fā)結(jié)構(gòu)[/align]
模式一的輸出結(jié)構(gòu)根據(jù)消息數(shù)據(jù)的目標(biāo)模塊編碼直接分發(fā)消息到各模塊中。模式二則是根據(jù)當(dāng)前系統(tǒng)所處的狀態(tài)再分發(fā)消息到各模塊中。也就是說(shuō)模式二在模式一的基礎(chǔ)上增加了一個(gè)系統(tǒng)級(jí)的狀態(tài)機(jī)。下面我們看看兩種不同的輸出結(jié)構(gòu)會(huì)帶來(lái)何種影響。
工控軟件設(shè)計(jì)者通常會(huì)碰到兩種情況。一是在研發(fā)階段,界面任務(wù)與控制任務(wù)聯(lián)調(diào)時(shí),雙方均有可能出錯(cuò)。對(duì)于界面任務(wù)而言,有可能自身原因誤發(fā)消息;而對(duì)控制任務(wù),也有可能輸出時(shí)序出錯(cuò)。此時(shí)需要在聯(lián)調(diào)中快速定位故障,縮短研發(fā)周期。二是在產(chǎn)品運(yùn)行中由于惡劣工況的影響,導(dǎo)致緩沖區(qū)數(shù)據(jù)發(fā)生異常。比如消息頭的模塊編碼發(fā)生位翻轉(zhuǎn),則會(huì)直接導(dǎo)致控制任務(wù)接收到錯(cuò)誤的界面消息。對(duì)于模式一,如果界面消息出錯(cuò)則會(huì)出現(xiàn)全局的混亂。比如模塊1收到消息后開(kāi)始輸出一個(gè)控制時(shí)序,期間界面層又發(fā)來(lái)一個(gè)錯(cuò)誤的消息,使其分發(fā)到模塊2,于是模塊2馬上開(kāi)始輸出時(shí)序。這個(gè)不希望輸出的時(shí)序在工控中有可能會(huì)導(dǎo)致災(zāi)難。而在聯(lián)調(diào)時(shí)出現(xiàn)這種現(xiàn)象,則無(wú)法立刻判斷到底是模塊1還是界面層出的問(wèn)題。但如果采用模式二則可以屏蔽這種混亂。如下圖
[align=center]
圖2 不同分發(fā)結(jié)構(gòu)對(duì)錯(cuò)誤消息的處理示意圖[/align]
我們可以看到由于模式二采用全局狀態(tài)機(jī)標(biāo)定當(dāng)前軟件所處的狀態(tài),消息首先會(huì)到達(dá)相應(yīng)的狀態(tài)處理程序,然后才進(jìn)行分發(fā)。此時(shí)分發(fā)語(yǔ)句可以根據(jù)當(dāng)前的狀態(tài)屏蔽不應(yīng)該被調(diào)用的模塊。即使消息出現(xiàn)錯(cuò)誤,也會(huì)過(guò)濾掉,等待正確消息的到來(lái)。而且可進(jìn)一步優(yōu)化為當(dāng)收到錯(cuò)誤消息可以通知界面層??梢?jiàn)在控制軟件前后臺(tái)的接口層增加一個(gè)標(biāo)記后臺(tái)狀態(tài)的全局狀態(tài)機(jī)有助于增強(qiáng)軟件的健壯性。
3.狀態(tài)機(jī)的錯(cuò)步問(wèn)題
工控軟件本質(zhì)上是根據(jù)一定的邏輯條件給出有序的輸出。根據(jù)輸出的次序可以劃分不同的狀態(tài)。邏輯條件在嵌入式領(lǐng)域中就是用戶的輸入和傳感器的狀態(tài)。正是這些條件決定了狀態(tài)的躍遷。在這里我們探討的是根據(jù)傳感器輸入而建立的狀態(tài)機(jī)。很明顯,它的運(yùn)行速度比前述系統(tǒng)級(jí)狀態(tài)機(jī)高很多。這種狀態(tài)機(jī)分布在軟件的控制層中,正是它們使得受控對(duì)象能夠有序精確高速的運(yùn)行。對(duì)于這樣高速運(yùn)轉(zhuǎn)的狀態(tài)機(jī),如果考慮不周全,會(huì)使其產(chǎn)生失步或者跳步,即高速狀態(tài)機(jī)中的錯(cuò)步現(xiàn)象。由于控制層的狀態(tài)機(jī)的躍遷條件來(lái)源于傳感器信號(hào),如果不能完全跟蹤到傳感器信號(hào)的變化,則躍遷條件將被遺漏,導(dǎo)致?tīng)顟B(tài)機(jī)不能躍遷到新的狀態(tài)。這就會(huì)導(dǎo)致失步。有兩種情況會(huì)導(dǎo)致傳感器信號(hào)的檢測(cè)遺漏:一是采樣頻率不夠高,漏掉了一些保持時(shí)間較短的信號(hào)。這可以通過(guò)硬件上提高采樣頻率得到解決。二是狀態(tài)機(jī)設(shè)計(jì)的缺陷,詳見(jiàn)以下例子。
[align=center]
圖3 出現(xiàn)失步的狀態(tài)機(jī)[/align]
由圖3可以看出,狀態(tài)1根據(jù)傳感器a信號(hào)躍遷到狀態(tài)2,狀態(tài)2根據(jù)傳感器b信號(hào)躍遷到狀態(tài)3。如果b信號(hào)在a信號(hào)前發(fā)出了一個(gè)完整的脈沖,由于根據(jù)狀態(tài)圖在狀態(tài)1時(shí)并不需要檢測(cè)b信號(hào),因此當(dāng)躍遷到狀態(tài)2以后,狀態(tài)機(jī)就出現(xiàn)失步了。解決這個(gè)問(wèn)題需要預(yù)先分析好a,b信號(hào)的關(guān)系。如果是b信號(hào)一定出現(xiàn)在a信號(hào)前,那不妨把狀態(tài)1和2的條件判斷對(duì)調(diào),如果兩個(gè)信號(hào)是并發(fā)關(guān)系的,那就要合并狀態(tài)機(jī)1,2,把a(bǔ),b信號(hào)作為躍遷到3的綜合條件。因此解決失步問(wèn)題的要點(diǎn)在于仔細(xì)考察受控對(duì)象處于此狀態(tài)時(shí)所可能出現(xiàn)的傳感器信號(hào)變化及其變化關(guān)系。
在處理“輸入-輸出對(duì)”時(shí)要注意防止?fàn)顟B(tài)機(jī)跳步。“輸入-輸出對(duì)”是嵌入式領(lǐng)域中經(jīng)常遇到的控制模式,類似于應(yīng)答機(jī)制??刂茖咏o出一個(gè)輸出,使得傳感器信號(hào)產(chǎn)生變化并反饋,過(guò)一段時(shí)間后,控制對(duì)象運(yùn)動(dòng)完成,傳感器信號(hào)恢復(fù)初態(tài),此時(shí)控制層可以撤消原輸出并給出相關(guān)處理。設(shè)計(jì)者會(huì)有意無(wú)意的把注意力放在“什么時(shí)候撤消輸出”,因此設(shè)計(jì)出如圖4(a)所示的有潛在問(wèn)題的狀態(tài)機(jī)。
[align=center]
圖4 出現(xiàn)跳步的狀態(tài)圖[/align]
可是控制對(duì)象在收到控制層輸出的驅(qū)動(dòng)產(chǎn)生運(yùn)動(dòng),傳感器感知運(yùn)動(dòng)并給出信號(hào)變化是需要時(shí)間的。根據(jù)圖4(a)的狀態(tài)機(jī),很可能跳過(guò)傳感器信號(hào)變化的狀態(tài),而直接到達(dá)“撤消輸出”的狀態(tài)。結(jié)果導(dǎo)致控制層的輸出僅僅是一瞬而過(guò)甚至是無(wú)法輸出,這就是跳步。為解決跳步問(wèn)題,就需要設(shè)計(jì)者仔細(xì)分析所有的“輸入-輸出對(duì)”,把狀態(tài)細(xì)分。如圖4(b)所示,增加一個(gè)等待對(duì)象運(yùn)動(dòng)的新?tīng)顟B(tài),確保上一狀態(tài)的輸出驅(qū)使對(duì)象真正運(yùn)動(dòng)以后才判斷對(duì)象運(yùn)動(dòng)停止。然而在細(xì)分狀態(tài)的同時(shí)也要注意防止失步。狀態(tài)分得越細(xì),越要注意分析此狀態(tài)中所有可能出現(xiàn)的信號(hào)變化。
4.狀態(tài)機(jī)在工控軟件中的狀態(tài)劃分問(wèn)題
把一個(gè)狀態(tài)機(jī)看作是一個(gè)動(dòng)作模塊,并把這些模塊串聯(lián)起來(lái),就可以實(shí)現(xiàn)這幾個(gè)動(dòng)作的并發(fā)輸出。如果是基于操作系統(tǒng)的,狀態(tài)機(jī)還可以放在不同的任務(wù)中,也可以實(shí)現(xiàn)并發(fā)輸出。每個(gè)狀態(tài)機(jī)設(shè)定一個(gè)空閑狀態(tài),當(dāng)不需要其運(yùn)轉(zhuǎn)時(shí)讓其進(jìn)入該狀態(tài)。同一個(gè)控制環(huán)的狀態(tài)機(jī)之間的通信可以用標(biāo)志位或者狀態(tài)變量,不同任務(wù)的狀態(tài)機(jī)可以通過(guò)一個(gè)全局的結(jié)構(gòu)體交互信息,實(shí)現(xiàn)同步。
狀態(tài)機(jī)的調(diào)度并不困難,關(guān)鍵在于如何根據(jù)受控對(duì)象的運(yùn)動(dòng)規(guī)律來(lái)劃分狀態(tài)機(jī)動(dòng)作模塊。在實(shí)際應(yīng)用中,“周期性”是解決問(wèn)題的關(guān)鍵。從復(fù)雜的運(yùn)動(dòng)時(shí)序中歸納出帶有“往復(fù)運(yùn)動(dòng)”性質(zhì)的輸出,連同與其同步的其他輸入輸出歸入一個(gè)狀態(tài)機(jī)中。這樣每個(gè)具有“往復(fù)運(yùn)動(dòng)”性質(zhì)的運(yùn)動(dòng)模態(tài)都建立一個(gè)狀態(tài)機(jī)。同時(shí),可以運(yùn)用上文介紹的方法實(shí)現(xiàn)這幾個(gè)運(yùn)動(dòng)模態(tài)的并發(fā)和同步控制。
下面通過(guò)某型進(jìn)油系統(tǒng)來(lái)說(shuō)明如何劃分狀態(tài)機(jī)。某型進(jìn)油系統(tǒng)分左右兩路。每路由一油鏈,擺臂,撥動(dòng)滑板組成。油鏈上裝載多個(gè)裝油模塊。擺臂把模塊提升到滑板,并由滑板推進(jìn)到燃燒艙中,然后油鏈步進(jìn)一次。全過(guò)程雙路交替供油。供油分為低速供油和高速供油。時(shí)序如下圖,黑色橫線代表動(dòng)作持續(xù)時(shí)間。
[align=center]
圖5供油系統(tǒng)低速供油時(shí)序圖[/align]
[align=center]
圖6 供油系統(tǒng)高速供油時(shí)序圖[/align]
先分析低速供油的情況??梢钥闯鲇筒巯陆?油門(mén)關(guān)-油槽上升-油門(mén)開(kāi)-滑板(左或右)這幾個(gè)動(dòng)作是交替出現(xiàn),在滑板動(dòng)作完成以后,油槽又開(kāi)始新一輪的動(dòng)作。由于這種周期性,可以把這幾個(gè)動(dòng)作歸入狀態(tài)機(jī)A中。而油鏈動(dòng)作是由滑板動(dòng)作觸發(fā)的,當(dāng)滑板運(yùn)動(dòng)到一定位置時(shí)候油鏈會(huì)啟動(dòng),油鏈的運(yùn)動(dòng)會(huì)持續(xù)到下一次同側(cè)運(yùn)動(dòng)開(kāi)始后。如果把油鏈運(yùn)動(dòng)也歸入狀態(tài)機(jī)A中,就打破了A的周期性,從而增加了A的狀態(tài)確定復(fù)雜化。另外從運(yùn)動(dòng)的本質(zhì)上來(lái)說(shuō),油鏈運(yùn)動(dòng)被狀態(tài)機(jī)A中的滑板運(yùn)動(dòng)所激發(fā),因而把油鏈運(yùn)動(dòng)定義在另一個(gè)狀態(tài)機(jī)B更為合理。B是在A運(yùn)動(dòng)到某個(gè)狀態(tài)時(shí)所觸發(fā)的,觸發(fā)后,B和A就是并發(fā)運(yùn)行的狀態(tài)機(jī)。
高速供油與低速時(shí)序的區(qū)別在于在左路狀態(tài)機(jī)A的周期沒(méi)有完成的情況下,右路的狀態(tài)機(jī)A已經(jīng)開(kāi)始了。但是盡管如此,對(duì)于單路而言,油槽下降-油門(mén)關(guān)-油槽上升-油門(mén)開(kāi)-滑板(左或右)仍然呈現(xiàn)周期性。所以應(yīng)該為左右兩路各建立一個(gè)狀態(tài)機(jī)A,也就是A1和A2。A1和A2的狀態(tài)機(jī)代碼是一樣的,當(dāng)判斷油槽重新上升后馬上觸發(fā)相對(duì)一側(cè)的狀態(tài)機(jī)。同理對(duì)于油鏈運(yùn)動(dòng),也應(yīng)該建立B1和B2狀態(tài)機(jī)。在多任務(wù)系統(tǒng)中,左右兩路可以分別建立一個(gè)任務(wù)。把Ax和Bx歸入其中一個(gè)任務(wù)中。
綜上所述,根據(jù)周期劃分受控對(duì)象的運(yùn)動(dòng),并建立相應(yīng)的狀態(tài)機(jī),就可以描述各種復(fù)雜并行的時(shí)序輸出。
5.結(jié)論
本文結(jié)合嵌入式工控軟件設(shè)計(jì)的工程實(shí)踐,分析了狀態(tài)機(jī)思想在軟件設(shè)計(jì)中的應(yīng)用。給出了狀態(tài)機(jī)在嵌入式軟件中前后臺(tái)信息交互的通用模型;分析了高速狀態(tài)機(jī)容易出現(xiàn)的錯(cuò)步問(wèn)題;最后結(jié)合某型供油系統(tǒng),給出了劃分狀態(tài)機(jī)的周期性準(zhǔn)則,該準(zhǔn)則對(duì)于分析受控對(duì)象運(yùn)動(dòng)具有一定的參考價(jià)值。
參考文獻(xiàn)
[1].周懷得,肖傳,偉郝志航.基于DSP和CPLD的智能相機(jī)系統(tǒng)設(shè)計(jì)與研制[ J ].微計(jì)算機(jī)信息,2006,Vol.22,No.17
[2].王劍,趙海燕. 基于CPLD的控制器冗余設(shè)計(jì)[ J ].微計(jì)算機(jī)信息.2005 Vol.12, No.23
[3].James R. Armstrong F. Gail Gray: VHDL Design Representation and Synthesis. China Machine Press.
[4].趙世霞,楊豐,劉揭生.VHDL與微機(jī)接口設(shè)計(jì)。 北京,清華大學(xué)出版社,2004。
[5].王誠(chéng),薛小剛,鐘信潮.Xilinx ISE 使用詳解。北京:人民郵電出版社,2004。
[6].楊慶. 有限狀態(tài)機(jī)的設(shè)計(jì)與優(yōu)化.湖北民族學(xué)院學(xué)報(bào)(自然科學(xué)版),Vol.24,No.1,Mar 2006.
[7].鄔楊波,王曙光,胡建平.有限狀態(tài)機(jī)的VHDL設(shè)計(jì)與優(yōu)化.信息技術(shù).VOL.28,NO.1,Jan.2004.
[8].李霞,王永章,梁宏斌,鐘力. 有限狀態(tài)機(jī)在開(kāi)放式數(shù)控系統(tǒng)中的應(yīng)用[J]. 計(jì)算機(jī)集成制造系統(tǒng),2005,03:429-432.
[9].Alain Girault,Bilung Lee,and Edward A.Lee,”Hierarchical Finite State Machines with Multiple Concurrency Models”,IEEE Trans.Computer-Aided Design Of Integrated Circuits And Systems,Vol 18,No.6,pp. 742-760,June,1999.