由于售貨機(jī)的功能不斷增多,售貨機(jī)控制系統(tǒng)也相應(yīng)得不斷變得龐大,這就使原來(lái)的面向過(guò)程的開(kāi)發(fā)方法變得越來(lái)難以擴(kuò)展和維護(hù),根據(jù)自動(dòng)狀態(tài)機(jī)的理論,提出一種在售貨機(jī)上的狀態(tài)機(jī)模型,該模型對(duì)系統(tǒng)狀態(tài)進(jìn)行抽象和分離,建立了系統(tǒng)狀態(tài)表和狀態(tài)轉(zhuǎn)換表,是一種網(wǎng)狀的狀態(tài)機(jī)模型。根據(jù)系統(tǒng)事件和當(dāng)前狀態(tài)來(lái)查找系統(tǒng)狀態(tài)轉(zhuǎn)換表,如果有匹配項(xiàng),則進(jìn)行狀態(tài)轉(zhuǎn)換。經(jīng)過(guò)實(shí)驗(yàn)表明,該模型能解決系統(tǒng)的代碼龐大問(wèn)題,并且使系統(tǒng)開(kāi)發(fā)變得易于維護(hù)。
1 概述
自動(dòng)售貨機(jī)是一種全新的商業(yè)零售形式,20世紀(jì)70 年代自日本和歐美發(fā)展起來(lái)?,F(xiàn)在,自動(dòng)售貨機(jī)產(chǎn)業(yè)正在走向信息化并進(jìn)一步實(shí)現(xiàn)合理化。例如實(shí)行聯(lián)機(jī)方式,通過(guò)GPRS 將自動(dòng)售貨機(jī)內(nèi)的庫(kù)存信息及時(shí)地傳送各營(yíng)業(yè)點(diǎn)的電腦中,從而確保 了商品的發(fā)送、補(bǔ)充以及商品選定的順利進(jìn)行。并且,為防止地球暖化,自動(dòng)售貨機(jī)的開(kāi)發(fā)致力于能源的節(jié)省,節(jié)能型清涼飲料自動(dòng)售貨機(jī)成為該行業(yè)的主流。在夏季電力消費(fèi)高峰時(shí),這種機(jī)型的自動(dòng)售貨機(jī)即使在關(guān)掉冷卻器的狀況下也能保持低溫,與以往的自動(dòng)售貨機(jī)相比,它能夠節(jié)約10-15%的電力。進(jìn)入21 世紀(jì) 時(shí),自動(dòng)售貨機(jī)也將進(jìn)一步向節(jié)省資源和能源以及高功能化的方向發(fā)展。這就導(dǎo)致了售貨機(jī)的控制系統(tǒng)(VenclingMachine Controller,VMC)的復(fù)雜度大大增加。先前的基于匯編程序的VMC控制系統(tǒng)雖然效率高,但是存在著可擴(kuò)展性差,程序結(jié)構(gòu)性差,不易維護(hù)等缺點(diǎn)。因此本文提出了一種基于ARM7的新型VMC主板的有限狀態(tài)機(jī)的結(jié)構(gòu),對(duì)VMC 進(jìn)行改進(jìn)。本文所用的硬件環(huán)境為使能LPC2134 的ARM7 主板,有一個(gè)RS232 串口接GPRS 模塊,一個(gè)MDB 總線模塊,一個(gè)電機(jī)驅(qū)動(dòng)模塊,外接一個(gè)顯示和按鍵模塊。
軟件方面采用的操作系統(tǒng)是ucosII操作系統(tǒng),這是一種開(kāi)源的實(shí)時(shí)多任務(wù)操作系統(tǒng),在數(shù)據(jù)同步和互斥上提供了信號(hào)量,消息隊(duì)列,消息郵箱等功能,本文主要采用的是信號(hào)量和消息隊(duì)列。
總的來(lái)說(shuō),有限狀態(tài)機(jī)系統(tǒng),是指在不同階段會(huì)呈現(xiàn)出不同的運(yùn)行狀態(tài)的系統(tǒng),這些狀態(tài)是有限的、不重疊的。這樣的系統(tǒng)在某一時(shí)刻一定會(huì)處于其所有狀態(tài)中的一個(gè)狀態(tài),此時(shí)它接收一部分允許的輸入,產(chǎn)生一部分可能的響應(yīng),并且遷移到一部分可能的狀態(tài)。 一個(gè)有限狀態(tài)機(jī)(FSM)是一個(gè)五元組,M=(S,G,E,A,T)。
State(狀態(tài)),就是一個(gè)系統(tǒng)在其生命周期中某一時(shí)刻的運(yùn)行情況,此時(shí),系統(tǒng)會(huì)執(zhí)行一些動(dòng)作,或者等待一些外部輸入。
Guard(條件),狀態(tài)機(jī)對(duì)外部消息進(jìn)行響應(yīng)的時(shí)候,除了需要判斷當(dāng)前的狀態(tài),還要判斷跟這個(gè)狀態(tài)相關(guān)的一些條件是否成立。這種判斷稱為guard("條件")。guard 通過(guò)允許或者禁止某些操作來(lái)影響狀態(tài)機(jī)的行為。
Event(事件),就是在一定的時(shí)間和空間上發(fā)生的對(duì)系統(tǒng)有意義的事情。
Action(動(dòng)作), 當(dāng)一個(gè)Event 被狀態(tài)機(jī)系統(tǒng)分發(fā)的時(shí)候,狀態(tài)機(jī)用Action("動(dòng)作")來(lái)進(jìn)行響應(yīng),比如修改一下變量的值、進(jìn)行輸入輸出、產(chǎn)生另外一個(gè)Event或者遷移到另外一個(gè)狀態(tài)等等。
Transition(遷移), 從一個(gè)狀態(tài)切換到另一個(gè)狀態(tài)被稱為Transition("遷移")。引起狀態(tài)遷移的事件被稱為triggering event ("觸發(fā)事件"),或者被簡(jiǎn)稱為trigger(觸發(fā))。
有限狀態(tài)機(jī)一般有2 種表示方式:狀態(tài)轉(zhuǎn)移表和狀態(tài)轉(zhuǎn)移圖。通常用有向圖來(lái)表示有限狀態(tài)機(jī),其節(jié)點(diǎn)代表狀態(tài)。如圖1 所示,售貨機(jī)售貨流程一共分5 個(gè)狀態(tài),每個(gè)狀態(tài)都是根據(jù)消息的不同來(lái)進(jìn)行轉(zhuǎn)換。

圖1 自動(dòng)售貨機(jī)中的狀態(tài)轉(zhuǎn)換圖:
2 實(shí)現(xiàn)方式
2.1 嵌套Switch方式
即先定義一個(gè)狀態(tài)和消息的枚舉,再通過(guò)嵌套的2層switch-case結(jié)構(gòu)實(shí)現(xiàn),外層switch-case結(jié)構(gòu)判斷狀態(tài),雖然這種方法結(jié)構(gòu)簡(jiǎn)單,便于理解,但是代碼冗長(zhǎng),不便維護(hù),因此不建議在復(fù)雜雜的狀態(tài)機(jī)下運(yùn)行。
2.2 狀態(tài)表方式
這種實(shí)現(xiàn)方法對(duì)第一種方法進(jìn)行了改良,根據(jù)State,Event 做成二維表格,表格中的項(xiàng)表示Action和Transmission,狀態(tài)采用枚舉量。這種方法結(jié)構(gòu)簡(jiǎn)單,便于理解,代碼比較簡(jiǎn)練,效率最高,但是代碼結(jié)構(gòu)不是太好。
2.3 用函數(shù)指針作為狀態(tài)
這種方法用函數(shù)地址代替state 值,比較直觀,可以方便地增加entry/exit 操作,并且效率較高。
3 具體實(shí)現(xiàn)
綜合以上幾種方式,本文提出一種結(jié)合第二種和第三種方式的狀態(tài)機(jī)實(shí)現(xiàn)方式,即創(chuàng)立一個(gè)狀態(tài)表和一個(gè)狀態(tài)轉(zhuǎn)換表,其中狀態(tài)表中有exit,entry,default處理方法,當(dāng)進(jìn)入該狀態(tài)時(shí),先執(zhí)行entry方法,然后在狀態(tài)運(yùn)行時(shí)執(zhí)行default方法,退出狀態(tài)時(shí)執(zhí)行exit方法,狀態(tài)之間的切換是通過(guò)狀態(tài)轉(zhuǎn)換表實(shí)現(xiàn)的,即首先狀態(tài)等待一個(gè)系統(tǒng)消息,如果在狀態(tài)轉(zhuǎn)換表中對(duì)應(yīng)當(dāng)前狀態(tài)和當(dāng)前消息的項(xiàng),則進(jìn)行消息轉(zhuǎn)換,具體實(shí)現(xiàn)如下3.1 數(shù)據(jù)結(jié)構(gòu)。
首先定義一個(gè)大小為10 的系統(tǒng)消息隊(duì)列用來(lái)接收外設(shè)和系統(tǒng)消息:


3.2 狀態(tài)轉(zhuǎn)換算法
先建立一個(gè)狀態(tài)轉(zhuǎn)換表, 建立一個(gè)FSM_STATE_TRAN 指針數(shù)組。即FSM_STATE_TRAN*fsm_tran[7];將每個(gè)狀態(tài)下的轉(zhuǎn)換項(xiàng)都存在該狀態(tài)下的鏈表中。
在有限狀態(tài)機(jī)中,狀態(tài)是通過(guò)系統(tǒng)消息和當(dāng)前狀態(tài)來(lái)查找狀態(tài)轉(zhuǎn)換表,如果有對(duì)應(yīng)的項(xiàng)則進(jìn)行轉(zhuǎn)換,沒(méi)有則繼續(xù)當(dāng)前狀態(tài):算法如下:


4 模型分析
4.1 擴(kuò)展性
為狀態(tài)機(jī)添加新?tīng)顟B(tài),只需在狀態(tài)表中添加新?tīng)顟B(tài)及其處理方法,以及在狀態(tài)轉(zhuǎn)換表中添加該狀態(tài)的轉(zhuǎn)換方式。
4.2 查找算法分析
設(shè)總共有n個(gè)狀態(tài),m個(gè)事件,每個(gè)狀態(tài)平均響應(yīng)的事件為k.
由于在這里每個(gè)狀態(tài)都是互斥的,因此狀態(tài)轉(zhuǎn)換時(shí)的時(shí)間開(kāi)銷主要是花費(fèi)在查找狀態(tài)表上面,這里采用了基數(shù)排序查找的思想。因此主要查找開(kāi)銷是每個(gè)狀態(tài)的狀態(tài)轉(zhuǎn)換個(gè)數(shù)。由于在售貨機(jī)中,每個(gè)狀態(tài)大概都只有3-4 個(gè)狀態(tài)轉(zhuǎn)換表。因此查找的時(shí)間復(fù)雜度比O(m)小。
5 結(jié)語(yǔ)
通過(guò)建立有限狀態(tài)機(jī)模型,并應(yīng)用改進(jìn)的數(shù)據(jù)結(jié)構(gòu)與狀態(tài)轉(zhuǎn)換算法,自動(dòng)售貨機(jī)控制器的程序結(jié)構(gòu)更為清晰。原來(lái)存在于程序中的諸多標(biāo)志變量,由狀態(tài)機(jī)的各個(gè)狀態(tài)所取代,使系統(tǒng)具有更好的擴(kuò)展性;并且模型很好地利用了狀態(tài)的相關(guān)性,縮短了查找所花費(fèi)的時(shí)間。應(yīng)用于別的嵌入式系統(tǒng)也有較高的意義。
-
LPC2134
+關(guān)注
關(guān)注
0文章
6瀏覽量
9867 -
UCOSIII
+關(guān)注
關(guān)注
2文章
26瀏覽量
7057
發(fā)布評(píng)論請(qǐng)先 登錄
如何用威佛RS232-MDB適配器在售貨機(jī)上實(shí)現(xiàn)”REMOTE VEND”
睿遠(yuǎn)研究院丨IO-Link規(guī)范解讀(十一):ISDU狀態(tài)機(jī)與EVENT事件
什么是狀態(tài)機(jī)?
嵌入式開(kāi)發(fā)為何經(jīng)常用到狀態(tài)機(jī)架構(gòu)
睿遠(yuǎn)研究院丨IO-Link規(guī)范解讀(八):M-Sequence Type 與消息處理狀態(tài)機(jī)
睿遠(yuǎn)研究院丨IO-Link規(guī)范解讀(六):主從站狀態(tài)機(jī)解析
東芝TB5128HG步進(jìn)驅(qū)動(dòng)芯片,在商用售貨機(jī)上的體驗(yàn)
法拉電容有哪些型號(hào)和規(guī)格
請(qǐng)問(wèn)如何在FX10上使用GPIF III狀態(tài)機(jī) *.h 文件?
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)之八:PCIe初始化狀態(tài)機(jī)設(shè)計(jì)
嵌入式系統(tǒng)安全面臨的挑戰(zhàn)和解決方案
有可能在 FX3 GPIF2 中創(chuàng)建兩個(gè)獨(dú)立的狀態(tài)機(jī)嗎?
cypress3014視頻格式改變的話,GPIF狀態(tài)機(jī)需不需要重新配置?
求助,關(guān)于srammaster.cydsn中狀態(tài)機(jī)的問(wèn)題求解
自助售貨機(jī)內(nèi)嵌掃描器應(yīng)該要如何選用?
基于LPC2134和UCOSII的自動(dòng)售貨機(jī)狀態(tài)機(jī)模型
評(píng)論