Copyright: ISaGRAF V3.4


 SFC語言

循序式功能圖 (Sequential Function Chart，SFC) 是一種用來描述循序操作的繪圖式語言。在流程圖中，流程是用一連串定義明確的步驟 (steps) 來表示，步驟間以轉移條件 (transition) 連結起來。每一個轉移條件都有一個布林判斷條件 (boolean condition)。步驟中的行為可以用其它語言 (ST、IL、LD和FDB) 來詳述。

SFC圖表的主要格式

SFC基本元件

發散和收斂

巨集步驟 (Macro steps)

步驟中的行為

轉移條件的判斷條件

SFC動態規則

SFC程式的組織


SFC圖表的主要格式

SFC程式是以一連串的步驟和轉移條件圖形來表示，而步驟與轉移條件之間是用有方向性的線 (oriented links) 連結在一起。多連結線可以用來表示發散和收斂。完整程式的某些部份可以被分隔出來，然後用一個所謂巨集步驟 (macro steps) 的單一符號表示在主要圖形裡。SFC的基本繪圖規則如下：

-	步驟之後不能緊接著另外一個步驟

-	轉移條件之後不能緊接著另外一個轉移條件


SFC基本元件

SFC語言的基本元件 (圖形符號) 是：步驟 (steps) 和初始步驟 (initial steps)、轉移條件 (transitions)、有方向性的線 (oriented links) 及跳躍至步驟 (jumps to a step)。

步驟和初始步驟

轉移條件

有方向性的連結

跳躍至步驟


步驟和初始步驟

步驟是用一個單一方格來表示。每一個步驟的方格符號中會有一個參考號碼。步驟的註解會撰寫在連結於步驟符號的一個長方形中。註解的寫法沒有固定的格式 (不是程式設計語言的部份)。以上這些信息稱為步驟的第一層  (Level 1)，圖示如下：

程式執行時，假如步驟中有一個權杖記號 (token)，就表示這個步驟是正在動作 (active) 中，圖示如下：

SFC程式的初始情形是用初始步驟來表示。初始步驟是一個雙重邊框的圖形符號。當程式開始執行的時候，權杖符號會自動地出現在每一個初始步驟中。初始步驟的圖示如下：

一個SFC程式至少必須包含一個初始步驟。

步驟具有一些屬性。這種屬性可以在任何其他語言中使用：

GSnnn.x	步驟動作的情形 (布林值)

GSnnn.t	步驟動作的持續時間 (時間值)

(其中，nnn是步驟的參考號碼)


轉移條件

轉移條件是用交叉於連結線的一個小水平棒來表示。每一個轉移條件有一個參考號碼，其被寫在轉移條件符號的右下角。轉移條件的註解會寫在轉移條件符號的右邊。註解的寫法沒有固定格式 (不是程式設計的部份)。以上這些信息稱為轉移條件的第一層 (Level 1)，圖示如下：


有方向性的連結

步驟和轉移條件之間是用單一線連結起來，而這些線就是有方向性的線。當線的方向性沒有明確給定的時候，其是由上到下。


跳躍至步驟

跳躍符號可以用來表示從一個轉移條件到一個步驟的連接線，這樣就不一定要畫連接線了。跳躍符號必須指向目的步驟的參考號碼，圖示如下：

跳躍符號不能用來表示從一個步驟到一個轉移條件的連結線。下面是跳躍的範例  兩個圖形是相等的：


發散和收斂

發散是指從一個SFC符號 (步驟或轉移條件) 到很多其他SFC符號的多連接線 (multiple connection links)。收斂是指從不止一個的SFC符號到一個其他符號的多連接線。發散和收斂有單或雙的不同情形。

單發散 (single divergences)

雙發散 (Double divergences)


單發散 (single divergences)

單發散是指從一個步驟到很多轉移條件的多連結線，它允許正在行動的權杖符號進入許多分支的其中一支。單收斂 (single convergence) 是指從很多的轉移條件到同一個步驟的多連結線，它通常用來將開始於一個單發散的SFC分支聚集在一起。單發散和單收斂是以單一的水平線來表示，如下圖所示：

警告：在一個單發散開始的不同轉移條件中的判斷條件並不是絕對互斥的 (not implicitly exclusive)。而轉移條件的判斷條件中必須明確地詳述這種互斥情形，以便確保程式執行時，發散的一個分支中只有一個權杖符號經過。單發散和單收斂的範例如下：


雙發散 (Double divergences)

雙發散是指從一個轉移條件到很多步驟的多連結線，它相當於程序的平行操作。雙收斂 (double convergence) 是指從很多步驟到相同轉移條件的多連結線，它通常用來將開始於一個雙發散的SFC分支聚集在一起。雙發散和雙收斂是以雙重水平線來表示，如下圖所示：

雙發散和雙收斂的範例如下：

(* SFC program with double divergence and convergence *)


巨集步驟 (Macro steps)

巨集步驟是另一些單獨造出的步驟及轉移條件的獨特表示方式。巨集步驟的主體會被另外地描述在相同SFC程式的其他地方。它會以一個單一符號出現在SFC的主流程中。巨集步驟的符號如下所示：

巨集步驟符號中的參考號碼是巨集步驟程式主體的第一個步驟的參考號碼。巨集步驟的程式主體必須開始於開始步驟 (beginning step)，並且終結於結束步驟 (ending step)。其圖形必須是獨立自足的 (self-contained)，也就是說，開始步驟沒有上連結線 (沒有之前的轉移條件)，結束步驟沒有下連結線 (沒有之後的轉移條件)。巨集步驟的程式主體中可以使用另一個巨集步驟符號。

警告：因為巨集步驟是另一些單獨造出的步驟及轉移條件，所以在一個SFC程式中，同樣的巨集步驟只能用一次。

巨集步驟的範例如下：


步驟中的行為

步驟活動期間所執行的行為 (actions) 必須詳述在SFC步驟的第二層 (level 2) 中。此描述是用SFC的文字敘述特徵和其他語言 (例如ST敘述式語言) 所撰寫的。行為的基本形態如下：

布林行為 (Boolean actions)

以ST語言撰寫的脈衝行為 (Pulse actions)

以ST語言撰寫的非儲存行為 (Non-stored actions)

SFC行為 (SFC actions)

同一個的步驟中可以描述很多行為 (具有相同或不同的形態) 。步驟還具有使用任何其他語言的特殊特徵：

呼叫副程式

使用IL (Instruction List) 語言


布林行為

布林行為會隨著步驟的動作而指定布林變數。此布林變數可以是輸出變數或是內部變數，而且只有當步驟開始或停止活動時才會被指定。基本布林行為的語法如下：

<布林變數> (N) ;	將步驟動作的狀態指派給變數

<布林變數> ;	與上一個語法具有相同的效果 (因為N可以不必表示出來)

/ <布林變數> ;	將步驟動作狀態的反相指派給變數

當步驟正在動作的時候，還可以將布林變數設定 (set) 或重置 (reset) 成其他狀態。設定及重置布林行為的語法如下：

<布林變數> (S) ;	當步驟動作的狀態變成真 (TRUE) 的時候，將變數設定成真 (TRUE)

<布林變數> (R) ;	當步驟動作的狀態變成真 (TRUE) 的時候，將變數重置成假 (FALSE)

此布林變數必須是輸出變數或是內部變數。左下方的SFC程式設計會引導出右下方的布林行為：

布林行為的範例如下：


脈衝行為

脈衝行為是用ST或IL指令撰寫的，它在步驟活動時只會執行一次。其指令是根據下面的SFC語法撰寫的：

ACTION (P) :

(* ST敘述 *)

END_ACTION ;

下面是一個脈衝行為的結果：

脈衝行為的範例如下：


非儲存行為

非儲存 (標準) 行為是用ST或IL指令撰寫的。在步驟整個活動期間的每一個週期 (each cycle)，非儲存行為都會執行一次。其指令是根據下面的SFC語法撰寫的：

ACTION (N) :

(* ST敘述 *)

END_ACTION ;

下面是一個非儲存行為的結果：

非儲存行為的範例如下：


SFC行為

SFC行為是一個SFC子程序，它會根據步驟動作狀態的改變而開始或終止。SFC行為有N (非儲存，Non stored) ，S (設定，Set) ，或R (重置，Reset) 三種限定語法。基本SFC行為的語法如下：

<子程式> (N);	當步驟一開始動作，就啟始子程序，而且當步驟一停止動作，就終止子程序。

<子程式> ;	與上一個語法有相同的效果 (因為N可以不表示出來)

<子程式> (S);	當步驟一開始動作，就啟始子程序。但是當步驟停止動作時，不會有任何影響。

<子程式> (R);	當步驟一開始動作，就終止子程序。但是當步驟停止動作時，不會有任何影響。

指定行為的SFC程序必須是目前正在編輯的程式的SFC子程式。可以注意到的是，在SFC行為中使用S或R語法的效果，絕對會跟在ST脈衝行為程式中使用GSTART和GKILL敘述所產生的效果一樣。

下面是一個SFC行為的範例。其中，SFC主程式的名稱是Father，它有兩個SFC子程式，名稱分別是SeqMlx和SeqPump。SFC父程式的程式設計部分如下圖所示：


在行為中呼叫函數和功能方塊

假如想在SFC行為方塊中直接呼叫副程式，函數或功能方塊 (以ST、IL、LD或FBD語言撰寫的) 或 "C" 函數和 "C" 功能方塊，必須遵循下面的語法：

呼叫副程式、函數和 "C" 函數時：

ACTION (P) :

result := sub_program ( ) ;

END_ACTION;

或

ACTION (N) :

result := sub_program ( ) ;

END_ACTION;

呼叫用 "C" 或用ST、IL、LD、FBD語言所寫的功能方塊時：

ACTION (P) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

或

ACTION (N) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

若想知道更詳細的語法，請參考ST語言的章節。

在行為方塊中呼叫一個副程式的範例如下：


使用IL語言

假如想在SFC行為方塊中直接用IL語言撰寫程式，必須遵循下面的基本語法：

ACTION (P) :	(* 或用N *)

#info=IL

     <指令>

     <指令>

     ....

#endinfo

END_ACTION;

"#info=IL" 和 "#endinfo" 這兩個特別的關鍵字必須依照上面的方式撰寫，而且只能寫成小寫。另外，關鍵字的中間、後面或前面不能插入空白或跳位字元。在行為方塊中撰寫IL程式的範例如下：


轉移條件的判斷條件

每一個轉移條件的判斷條件都會附上一個布林型態。判斷條件通常是用ST語言或LD語言 (LD快速編輯器) 撰寫的。判斷條件的撰寫是屬於轉移條件的第二層 (Level 2) 。然而，還有其他結構可以使用：

ST語言規則

LD語言規則

IL語言規則

在轉移條件中呼叫函數

警告：	當轉移條件沒有附上任何運算式時，它的判斷條件為真 (TRUE) 。


ST語言規則

轉移條件的判斷條件可以用ST結構化文字語言來撰寫。而判斷條件的完整運算式必須具有布林型態，而且必須終結於分號 (；)，語法如下：

< 布林運算式 > ;

此運算式可以是真 (TRUE) 或假 (FALSE) 的常數形態、單一輸入或內部布林變數、或結果為布林值的變數運算。在轉移條件中用ST語言撰寫程式的範例如下：


LD語言規則

轉移條件的判斷條件可以用LD階梯圖語言來撰寫。其LD圖形僅能由一個線圈和一個導軌組成的。線圈值就是轉移條件的值。

在轉移條件中用LD語言撰寫程式的範例如下：


IL語言規則

SFC轉移條件可以直接用IL指令集語言來撰寫，語法如下：

#info=IL

<指令>

<指令>

....

#endinfo

當IL程式執行完畢後，存在IL登錄器 (IL register) 中的目前結果就是轉移條件判斷條件的值：

目前結果等於0	 	判斷條件是假 (FALSE)

目前結果不等於0	判斷條件是真 (TRUE)

"#info=IL" 和 "#endinfo" 這兩個特別的關鍵字必須依照上面的方式撰寫，而且只能寫成小寫。兩個關鍵字的中間，後面或前面不能插入空白或跳位字元。在轉移條件中撰寫IL程式的範例如下：


在轉移條件中呼叫函數

在轉移條件中可以呼叫任何副程式或函數 (以FBD、LD、ST或IL語言撰寫的) ，或 "C" 函數來決定判斷條件的結果，語法如下：

< 副程式 > ( ) ;

副程式或函式的回傳值必須是布林型態，而且就是轉移條件判斷條件的值：

回傳值等於FALSE	判斷條件是FALSE

回傳值等於TRUE	判斷條件是TRUE

在轉移條件中呼叫副程式的範例如下：


SFC動態規則

SFC語言的五項動態規則為：

 初始情形

初始情形就是開始操作時處於動作狀態的初始步驟。每一個SFC程式至少要有一個初始步驟。

 清除轉移條件

轉移條件是有效的 (enabled) 或無效的 (disabled) 。也就是說，當緊接轉移條件的上一層步驟是正在動作時，它就是有效的，否則是無效的。轉移條件有以下的情形時，才可以被清除：

-	轉移條件是有效的時候，而且

-	轉移條件的判斷條件是真 (true) 的時候

 改變動作中步驟的狀態

清除轉移條件的同時會讓緊接轉移條件的下一個步驟開始動作，並且使緊接轉移條件的上一個步驟停止動作。

 同時清除轉移條件

雙重線可以用來顯示必須被同時清除的轉移條件。假如這種轉移條件被分開顯示時，轉移條件上一個的步驟的動作情形 (GSnnn.x) 就可以用來當成是這些轉移條件的判斷條件。

 同時讓步驟變成動作和無動作

在操作期間，假如同時讓一個步驟變成動作中和無動作的狀態，那麼最後的結果是讓此步驟變成動作。


SFC程式的組織

ISaGRAF系統可以撰寫垂直架構的SFC程式。SFC程式的架構是一棵組織樹 (hierarchy tree) 。每一個SFC程式可以控制 (開始、刪除 _) 其他的SFC程式。受SFC程式控制的這種程式稱為此SFC程式的子程式 (children) 。所有的SFC程式會以 "父程式與子程式" (father - child) 的關係連結成一棵主要的組織樹：

組織的架構暗示了幾項基本規則：

- 沒有父程式的SFC程式稱為SFC主程式 (main SFC programs)

- 當應用程式開始時，ISaGRAF系統會將SFC的主要程式執行起來

- 一個程式可以有一些子程式

- 一個子程式只能有一個父程式

- 子程式只能由其父程式控制

- 程式不能控制其子程式的子程式

SFC父程式對其子程式可以採取的基本控制行為：

開始 (Start)	(GSTART) 啟始子程式：讓子程式的初始步驟執行起來。此時，子程式的子程式並沒有自動的啟始。

刪除 (Kill)	(GKILL) 將子程式目前執行的所有步驟皆終止掉。而子程式的所有子程式也會被終止掉。

冰凍 (Freeze)	(GFREEZE) 冰凍程式的執行 (讓所有正在動作的步驟皆暫停下來，並且暫停轉換條件執行)，而且將這些步驟的狀態紀錄下來，以便將來再重新執行。子程式的所有子程式也會被暫停下來。

重置 (Restart)	(GRST) 將暫停的SFC程式重新啟始起來，而且是從暫停的步驟開始執行。程式的子程式並不會自動的啟始起來。

讀取狀態 (Get status)	(GSTATUS) 取得子程式的目前狀態 (正在動作，停止動作或暫停動作) 。