使用 Latex 的有限狀態機 (Finite State Machine)狀態圖

狀態圖 (State Diagram) 是表示狀態機的常用方法。不幸的是,它們可能很難開發。製作一幅具有視覺吸引力的草圖,通常需要花費大量時間。

其中一個解決方案是使用 Latex 排版程式。在某些方面,\LaTeX 就像您最喜歡的文字處理器。不同之處在於格式是使用文字描述控制的。此外,所有原始文件均以 .txt 或 .tex 檔案完成。當它們完成後,將使用 tex「編譯器」來產生最終產品,通常採用 .pdf 文件的形式。在某些方面,這就像使用 html 開發網頁一樣。

\LaTeX 的優點在於它能夠利用程式設計師可用的所有腳本和技巧,將複雜的文件拼接在一起。另外,關於基礎純文字文件的實用性和開放性也值得一提。

tikz 這樣的 \LaTeX 套件將繪製狀態表的程序變得十分簡單,具有代表性的結果如圖 1 和 2 所示。這些圖像是使用 TeXworks 繪製的。

小貼士:這個論壇對 \LaTeX 的支援暫時有限。這對於顯示數學方程式特別有用。例如,歐姆定律寫成 R = \dfrac{E}{I},然後將其放置在兩個 $ 符號之間,得出:

R = \dfrac{E}{I}

可惜,\LaTeX 的學習需要付出很大努力,我們不會嘗試在這篇短文中描述這個過程,反而,用於生成圖 1 和圖 2 的程式碼附加到本註釋中,不加任何註釋,希望它有用。

附:如果您對 \LaTeX 感興趣,請尋找線上教學。另外,請務必尋找可讓您搜尋繪製文字的線上資源。

image
圖 1:具有重設功能的簡單 CAM 操作狀態機的狀態圖。

image

圖 2:具有複雜狀態轉換的機器的狀態圖。


\documentclass{article}
 
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
 
	\usepackage{geometry}
 
	\geometry{
		letterpaper,
		% total={170mm,257mm},
		 left=0.5in,
		 right =0.5in,
		top=0.5in,
		bottom=0.75in
	 }
 
 
\begin{document}
 
 
\begin{tikzpicture} [state/.style=state with output, ->,>=stealth',shorten >=1pt,auto,node distance=5.0cm, semithick]
 
\tikzstyle{every state}=[fill=blue!20,draw=black,text=black]
 
	\node[initial,state]	(1) 						{$Idle$ \nodepart{lower} 	$0000001$};
	\node[state]			(2) [above right of = 1]	{$Alarm$ \nodepart{lower} 	$0010010$};
	\node[state]			(3) [right of = 2]			{$Forward$ \nodepart{lower} $1000110$};
	\node[state]			(4) [below right of = 3]	{$Delay$ \nodepart{lower} 	$0001010$};
	\node[state]			(5) [below left of = 4]		{$Alarm$ \nodepart{lower} 	$0010010$};
	\node[state]			(6) [left of = 5]			{$Reverse$ \nodepart{lower} $0100110$};
 
	\path	(1)	edge	[sloped, anchor=center, above, in=205, out= 65]			node {Cycle PB}		(2)
 
			(2) edge	[sloped, anchor=center, above, in=160, out= 20]			node {Done}			(3)
				edge	[sloped, anchor=center, below, in=20, out=-110]			node {$Reset$}		(1)
 
			(3) edge	[sloped, anchor=center, above, in=110, out=-20]			node {5 seconds}	(4)
				edge	[sloped, anchor=center, below, in=10, out=-135]			node {$Reset$}		(1)
 
			(4) edge	[sloped, anchor=center, below , in=20, out=-110]		node {$3 seconds$}	(5)
				edge	[sloped, anchor=center, below, in=-10, out=200]			node {$Reset$}		(1)
 
			(5) edge 	[sloped, anchor=center, below, in=-20, out=200]			node {Done}			(6)
				edge	[sloped, anchor=center, below, in=-20, out=160]			node {$Reset$}		(1)
 
			(6) edge 	[sloped, anchor=center, below, in=-70, out=155]			node {5 seconds}	(1)
				edge	[sloped, anchor=center, below, in=-30, out=110]			node {$Reset$}		(1)
 
		; % Don't forget this semicolon
 
\end{tikzpicture}
 
 
\newpage
 
 
\begin{tikzpicture} [state/.style=state with output, ->,>=stealth',shorten >=1pt,auto,node distance=5.0cm, semithick]
 
\tikzstyle{every state}=[fill=blue!20,draw=black,text=black]
 
	\node[initial,state]	(1) 						{$1$ \nodepart{lower} $Retracting$};
	\node[state]			(2) [above right of=1]		{$2$ \nodepart{lower} $Retracted$};
	\node[state]			(3) [below right of=2]		{$3$ \nodepart{lower} $Extending$};
	\node[state]			(4) [below left of=3]		{$4$ \nodepart{lower} $Extended$};
	\node[state]			(5) [below of=4]			{$5$ \nodepart{lower} $Fault$};
 
	\path	(1)	edge	[sloped, anchor=center, above]										node {xSenRet}				(2)
				edge	[sloped, anchor=center, below, in=200, out=-20]						node {$xEN$}				(3)
				edge	[sloped, anchor=center, below, bend right]							node {t $>$ timeMove}		(5)
 
			(2) edge	[sloped, anchor=center, above]										node {xEn}					(3)
				edge	[sloped, anchor=center, below, min distance=7cm, in=10, out=-10]	node {$\overline{xSenRet}$}	(5)
 
			(3) edge	[sloped, anchor=center, above]										node {xSenExt}				(4)
				edge	[sloped, anchor=center, above, in=20, out=160]						node {$\overline{xEN}$}		(1)
				edge	[sloped, anchor=center, below, bend left]							node {t $>$ timeMove}		(5)
 
			(4) edge	[sloped, anchor=center, above]										node {$\overline{xEN}$}		(1)
				edge	[sloped, anchor=center, below]										node {$\overline{xSenExt}$}	(5)
 
			(5) edge    [sloped, anchor=center, below, min distance=2.5cm, in=230, out=170]	node {xReset}				(1)
 
	; % Don't forget this semicolon
 
\end{tikzpicture}
 
 
\end{document}