田 龍, 何勇靈
( 北京航空航天大學 交通科學與工程學院,北京 100191)
基于有限狀態機的自動門控系統軟件設計
田 龍, 何勇靈
( 北京航空航天大學 交通科學與工程學院,北京 100191)
采用有限狀態機的方法設計了一種自動門控制系統軟件,可實現自動門的可靠開閉和精確檢測。本文介紹了自動門控系統控制及檢測要求,給出了有限狀態機的基本原理,建立了基于有限狀態機的程序設計模型,給出軟件設計的部分關鍵代碼。單步調試及裝車實測證明:有限狀態機模型有助于規范化解決控制系統軟件設計問題。
有限狀態機;信號檢測;自動門控制
在某自動門控系統中,根據門控裝置配置的光電傳感器、接近開關、微動開關和控制按鈕的狀態,執行開門、關門、鎖門及開關門二級緩沖動作。劃分門控系統運行狀態,確定不同輸入條件下門控系統狀態轉移過程,是設計自動門控系統軟件的關鍵。本文根據自動門控系統配置傳感器的信號特征,合理劃分門控系統運行狀態,采用有限狀態機原理,設計了門控系統控制和監測軟件,極大地提高了軟件設計可靠性。
自動門控系統輸入信號包括:鎖門狀態信號、關門位置信號、關門檢測信號、開門檢測與位置信號、開門關門控制信號,分別以紅外傳感器、微動開關、接近傳感器和門按鈕實現物理動作與電信號轉換,嵌入式微控制器根據輸入信號的變化,按設計的控制邏輯,控制直流電機拖動自動門動作。自動門控系統原理框圖如圖1所示。

圖1 自動門控系統原理框圖
自動門控系統輸入信號特征如下:
(1) 鎖門狀態信號,電平電壓24 V、0 V有效,在紅外傳感器被鎖舌遮擋時,信號能夠保持低電平;
(2) 關門位置信號,電平電壓24 V、24 V有效,當自動門門板上的金屬擋板觸碰微動開關使其閉合時,信號持續保持高電平;
(3) 關門檢測信號,電平電壓24 V、0 V有效,金屬擋板遮擋接近傳感器時,信號保持低電平;
(4) 開門檢測與位置信號,電平電壓24 V、0 V有效,金屬擋板遮擋接近傳感器時,信號保持低電平,金屬擋板通過接近傳感器后,信號恢復高電平;
(5) 開關門控制信號,由門按鈕按下時給出電平電壓為24 V的控制信號,有效時間<0.5 s,根據當前門狀態控制直流電機的正轉或者反轉。
2.1 檢測方式
在嵌入式系統設計中,檢測一個數字量,只需要檢測數字量端口的高低電平。為了提高檢測到的數字量的可靠性,一般采用濾波、多次檢測的方式[1]。但是對于自動門控系統,系統需要實時、快速、穩定地檢測到輸入信號,因此要充分利用輸入信號特征,系統狀態對輸入信號的屏蔽要求進行信號檢測[2]。本文采用如下方法:
(1) 輸入信號中斷處理,沿觸發;
(2) 按鈕設備采用防抖處理;
(3) 針對不同門狀態,屏蔽無關輸入信號;
(4) 同時監測各個門狀態下的設備信號。
通過上述幾種對輸入信號處理的方法,能夠實時獲取輸入信號,及時處理。在這些信號處理的過程中,實際上是在自動門的多個狀態下分別獲取的,每一個狀態不僅與輸入信號相關,也與前一狀態相關[3]。
2.2 劃分門狀態
在自動門工作過程中,通過接收輸入信號,根據當前門狀態進行開門動作、關門動作、鎖門指示以及開關門二級緩沖等動作。自動門在同一時刻只能處于一種門狀態,同時為了提高自動門的可靠性,在一個門狀態下,程序能夠屏蔽其他無關設備信號的變化。
本文針對自動門控制系統,定義了6個門狀態:
(1) 開門狀態,表征自動門在完全開門后的停止狀態;
(2) 正在開門狀態,表征自動門從完全關門位向開門位移動的狀態;
(3) 關門狀態,表征自動門在完全關門后的停止狀態;
(4) 正在關門狀態,表征自動門從完全開門位向關門位移動的狀態;
(5) 鎖門狀態,表征自動門機械鎖死,衛生間有人占用的狀態;
(6) 故障狀態,表征自動門輸入設備或自動門軌跡上有障礙物,無法正常開關門的狀態。
2.3 關于有限狀態機
通過對信號處理的分析,采用有限狀態機的方式建模將使信號處理更加方便可靠。有限狀態機(Finite State Machine, FSM)常見于數字時序電路設計,是概念上、理論上的一種機器。有限狀態機包括:一組有限的狀態集,是描述系統中不同狀態的集合;一個起始狀態,指示系統開始時的狀態;一組輸入符號集,是系統接收的不同輸入信息的集合;一個狀態轉移函數,將輸入符號和當前狀態映射到下一狀態[4]。
當輸入符號串時,有限狀態機隨即進入起始狀態,在任意特定時刻,只能處于其中一種狀態。狀態的轉換依賴于當前狀態、輸入符號(觸發條件)和轉換函數,轉換時間理論上為0[5]。
根據已定義的門狀態,各狀態機對應的輸入符號集及狀態轉換函數如下:
(1)S1,開門(STATE_OPENED):門外開門按鈕觸發時保持,門內開關門按鈕觸發或延時40 s后轉入正在關門狀態。在正在開門狀態下,當開門接近開關由高電平轉為低電平時轉入。
(2)S2,關門(STATE_CLOSED):無外部觸發時保持,門內開關門按鈕、門外開門按鈕觸發時轉入正在開門狀態。在正在關門狀態下,當微動開關由低電平轉為高電平時轉入;在鎖門狀態下,當光電開關由低電平轉為高電平時轉入。
(3)S3,正在開門(STATE_OPENING):在此狀態下,門按鈕觸發時保持,當開門接近開關由高電平轉為低電平時轉入開門狀態。在關門狀態下,當門按鈕觸發時轉入;在正在關門狀態下,當異物或人阻擋門關閉時轉入。
(4)S4,正在關門(STATE_CLOSING):在此狀態下,門按鈕觸發時保持,當異物或人阻擋門關閉時轉入正在開門狀態。在開門狀態下,門內開關門按鈕觸發時轉入;在故障狀態下,門內開關門按鈕觸發時轉入。
(5)S5,鎖門(STATE_LOCKED):在此狀態下,門按鈕觸發時保持,當光電開關由低電平轉為高電平轉入關門狀態。在關門狀態下,光電開關由高電平轉為低電平時轉入。
(6)S6,故障(STATE_FAULT):在此狀態下,門外開門按鈕觸發時保持,當門內開關門按鈕觸發時轉入正在關門狀態。在連續關門失敗兩次之后,門打開并轉入。基于有限狀態機的門控制過程如圖2。

圖2 基于有限狀態機的門控制過程狀態圖
在自動門控制系統中,通過中斷檢測信號上升沿或下降沿變化,實時獲取相應傳感器狀態信息并使系統當前狀態跳轉到另一狀態,使用switch…case語句在每次循環中檢測系統狀態,并執行相應動作[6]。軟件程序使用C語言實現,包括程序定義狀態機、信號實時檢測、狀態執行任務等[7]。
3.1 狀態機
狀態機的定義為:
typedef enum STATE
{
STATE_OPENED, //S1:開門狀態
STATE_CLOSED, //S2:關門狀態
STATE_OPENING, //S3:正在開門狀態
STATE_CLOSING, //S4:正在關門狀態
STATE_LOCKED, //S5:鎖門狀態
STATE_FAULT //S6:故障狀態
} STATE
3.2 信號實時檢測
外部傳感器有一個關門微動開關,一個關門接近開關,一個開門接近開關,一個鎖門光電開關,另有兩個門按鈕——開門按鈕與開關門按鈕,分別連接至控制板的POS1,POS2,POS3,LOCK,SW1,SW2六個信號端口。由于各個傳感器的設計不同,微動開關采用24 V供電,高電平有效,兩個接近開關和一個光電開關采用24 V供電,低電平有效。在程序內部,初始化四個信號端口對應的I/O口,初始化中斷,其中微動開關、兩個門按鈕配置為上升沿觸發,關門接近開關、鎖門光電開關配置為下升沿觸發,開門接近開關上升-下降沿觸發。信號檢測代碼位于中斷服務函數中[8]。
相關的中斷控制包括:
(1)微動開關信號上升沿進入中斷,系統狀態設置為關門狀態;
(2)關門接近開關信號下降沿進入中斷,給出自動門關門減速控制信號;
(3)開門接近開關信號下降沿進入中斷,給出自動門開門減速控制信號,上升沿進入中斷,系統狀態設置為開門狀態;
(4)鎖門光電開關信號下降沿進入中斷,系統狀態設置為鎖門狀態,上升沿進入中斷,系統狀態設置為關門狀態;
(5)門按鈕信號上升沿進入中斷,控制自動門開門或關門,同時設置系統狀態為正在開門狀態或正在關門狀態。
3.3 狀態執行任務
在進行狀態循環檢測之前,需要對系統上電之后的門狀態進行一次判斷,使門關閉。狀態循環檢測由while循環實現,采用switch語句在每個分支case對應的狀態執行相應的動作。
while(1)
{
switch(STATE)
{
case STATE_OPENED:
ID1 = ID2 = 0;
DRV1 = DRV3 = 0;
TIM_SetCompare1(TIM3,DRV1);
TIM_SetCompare3(TIM3,DRV3);
……
break;
case STATE_CLOSED:
ID1 = ID2 = OCUP = 0;
DRV1 = 0, DRV3 = stopspeed;
TIM_SetCompare1(TIM3,DRV1);
TIM_SetCompare3(TIM3,DRV3);
……
break;
case STATE_OPENING:
if(BUFF_OPEN==0) OpenDoor_Control();
while(!BUFF_OPEN)
{
…… //電機過流檢測
}
CloseToOpen();
……
break;
case STATE_CLOSING:
if(BUFF_CLOSE==0) CloseDoor_Control();
while(!BUFF_CLOSE)
{
…… //電機過流檢測
}
OpenToClose ();
……
break;
case STATE_LOCKED:
ID1 = ID2 = OCUP = 1;
break;
case STATE_FAULT:
FAULT = 1;
break;
default:
delay_ms(5);
break;
}
}
4.1 軟件仿真、在線仿真測試
采用KEIL自帶的軟件仿真工具進行測試。首先進行信號檢測任務的測試,通過軟件模擬給出外部設備信號,分步調試觀察外部設備信號的變化,能夠使程序跳入中斷服務函數內,并在執行完控制量設置之后能夠跳出中斷服務函數,回到主循環。其次進行有限狀態機功能測試,對于在不同狀態下接收到的每一個外部設備信號,確認是否能將其他無關信號屏蔽,能否在當前狀態下產生相對應的控制量,能否實時監測相關信號是否正常,能否接收有效的外部設備信號并跳轉到下一狀態。
采用在線仿真測試,測試內容與軟件仿真相似,不同之處是將JLINK在線調試器連接到控制板,外部設備信號由真實的外部設備給出,顯示輸出信號占用的指示燈和故障指示燈也連接到控制板上,在線調試的優點在于既能做接近于真實情況的實驗,又能在線調試控制板,觀察各個信號的變化。
4.2 裝車測試
此測試采用CRH380高速動車組列車的殘疾人衛生間門控裝置以及傳感器,替換原有控制器。在裝車測試中,針對自動門關門、開門、緩沖、防夾功能以及故障、占用指示功能進行逐一測試。
采用有限狀態機實現自動門狀態控制與檢測的方法,能夠可靠檢測外部設備信號,在相應狀態下能夠屏蔽無關設備信號,提高了自動門實時控制的可靠性。
[1] 施先旺, 劉婷婷, 李國良. 采用有限狀態機實現控制指令的可靠檢測[J]. 火箭推進, 2011, 37(5): 63-68.
[2] 何劍宇, 劉兢兢. 有限狀態機建模在嵌入式按鍵設計中的應用[J]. 沈陽師范大學學報: 自然科學版, 2012, 30(2): 168-171.
[3] 徐智穹, 劉健, 邱浩. 有限狀態機在嵌入式軟件設計中的應用[J]. 低壓電器, 2008(13):20-22.
[4] 馮競楠. 利用有限狀態機的交通燈控制系統設計與仿真[J]. 電子設計工程, 2011, 19(12): 156-159.
[5] Miro Samek.嵌入式系統的微模塊化程序設計——實用狀態圖C/C++實現[M]. 敬石鈞,陳麗蓉,譯.北京:北京航空航天大學出版社, 2004.
[6] 李曉鋒, 宋銳, 曾小寶. 有限狀態機在嵌入式系統中的實現及應用[J]. 廣西輕工業, 2008, 24(4): 38-39.
[7] 范晶,胡愛蘭.基于狀態機的PEX8311的DMA實現[J].微型機與應用,2014,33(22):30-33.
[8] 宰文姣.基于步進電機的自動門系統設計[J].微型機與應用,2015,34(5):30-31,34.
Software design for automatic control system based on FSM
Tian Long, He Yongling
(School of Transportation Science and Engineering, Beihang University ,Beijing 100191, China)
The finite state machine is adopted to design the software of an automatic door control system, which can realize control of the automatic door opening and closing, and guarantee the accurate detection . This article describes the control of automatic door control system and testing requirements, gives the basic principle of finite state machine and sets up a software design model which is based on finite state machine, lists some of the key code of this software design. Single-step debugging and loading test prove that finite state machine model contributes to the standardization of solving the problems of control system software.
finite state machine; signal detection; automatic door control
TP24
A
1674- 7720(2016)03- 0011- 04
田龍,何勇靈. 基于有限狀態機的自動門控系統軟件設計[J].微型機與應用,2016,35(3):11- 14.
2015-10-09)
田龍(1989-),男,在讀研究生,主要研究方向:嵌入式控制軟硬件設計。
何勇靈(1963-),男,教授,主要研究方向:汽車電子軟硬件控制技術、工業機器人技術。