1.打開stateflow的五種方式方式:
(1)在maltab命令行裏面輸入:sf
(2)命令行輸入:sflib
(3)命令行輸入:sfnew -matlab
(4)命令行輸入:sfnew -c 這是打開stateflow c語言編寫的
(5)直接在simulink library 中直接打開stateflow
如上圖,隨便哪一種方式都可以。
2.在matlab/simulink中建立stateflow後
雙擊進入stateflow中,在空白處右鍵點擊Properties進入進行相關設置,如Action Language是matlab語言可設置爲C語言,更新方法等。
3.現在介紹stateflow建模
看下面兩個模塊,這個是虛線,是個並行關係,怎麼設置呢?即在 空白處右鍵選擇Decompostion中Parallel就出現虛線(注意:這裏有1,2表示執行順序,1表示優先執行)。選擇Exclusive即爲互相排斥關係,爲實線,如下圖:
想改變並行執行順序怎麼做呢?只需要在上面案例中state1上選中Execution order選擇爲2,另一個就會變成1,如下圖:
動作類型(entry(en),during(du),exit(ex)
用於基於事件的時序邏輯的運算符
對於基於事件的時序邏輯,請使用下表所述的運算符。
基於事件的時序邏輯示例
以下示例說明了基於事件的時序邏輯在狀態動作和轉移中的使用。
運算符 | 用法 | 示例 | 說明 |
---|---|---|---|
|
狀態動作 (on after) |
|
從狀態激活後開始 5 個時鐘週期,每個 |
|
轉移 |
|
僅在廣播 |
|
狀態動作 (on before) |
|
|
|
轉移 |
|
僅在廣播 |
|
狀態動作 (on at) |
|
狀態消息會在狀態激活後的正好 10 個 |
|
轉移 |
|
僅在廣播 |
|
狀態動作 (on every) |
|
狀態激活後,每 5 個 |
|
狀態動作 (during) |
|
此動作會對狀態激活後的時鐘時間進行計數並返回整數值。然後,該動作會爲變量 |
基於事件的時序邏輯的表示法
可以使用以下兩種表示法之一來表示基於事件的時序邏輯。
事件表示法
使用事件表示法定義僅依賴基礎事件的狀態動作或轉移條件。
事件表示法採用以下語法:
tlo(n, E)[C]
其中
-
tlo
是一個布爾時序邏輯運算符(after
、before
、at
或every
) -
n
是運算符的出現次數 -
E
是運算符的基礎事件 -
C
是一個可選條件表達式
條件表示法
使用條件表示法定義依賴基礎事件和非基礎事件的轉移條件。
條件表示法遵循以下語法:
E1[tlo(n, E2) && C]
其中
-
E1
是任意非基礎事件 -
tlo
是一個布爾時序邏輯運算符(after
、before
、at
或every
) -
n
是運算符的出現次數 -
E2
是運算符的基礎事件 -
C
是一個可選條件表達式
事件表示法和條件表示法示例
表示法 | 用法 | 示例 | 說明 |
---|---|---|---|
事件 |
狀態動作 (on after) |
|
|
事件 |
轉移 |
|
狀態激活 10 個 |
條件 |
轉移 |
|
僅在廣播 |
注意
在狀態動作中必須使用事件表示法,因爲狀態動作的語法不支持使用條件表示法。
用於絕對時間時序邏輯的運算符
對於絕對時間時序邏輯,請使用下表中所述的運算符。
絕對時間時序邏輯示例
下面的示例說明了絕對時間時序邏輯在狀態動作和轉移中的運用。
運算符 | 用法 | 示例 | 說明 |
---|---|---|---|
|
狀態動作 (on after) |
|
自狀態激活並執行 12.3 秒的仿真後, |
|
轉移 |
|
自狀態激活並執行 8 毫秒的仿真後,會發生轉出關聯狀態的轉移。 |
|
轉移 |
|
自狀態激活並執行 5 微秒的仿真後,會發生轉出關聯狀態的轉移。 |
|
轉移 |
|
如果變量 |
|
狀態動作 (exit) |
|
此動作對狀態激活和反激活之間所經過的仿真時間進行計數並返回秒數。 |
4.怎樣定義stateflow輸入輸出接口?這裏給出三種方法
(1)通過窗口chart/Add Input & output,如下圖:
(2)第二種方法通過工具欄中的Model Explorer
(3)直接點擊編譯,會報錯彈出窗口,在彈出的窗口裏面選擇輸入,輸出,再次編譯就不會報錯。這裏不給出圖片,自己試一下即可知道。(這裏別忘了加默認的初始狀態)
4.講了這麼多,教大家一個實例
其實這個x==1條件可以看作家裏總開關有電,switch_on表示控制燈的開關爲開,light=1 表示燈亮。燈的變量設置如下:light爲輸出,switch_off爲輸入端口2,爲下降沿,switch_on輸入端口1,上升沿,x爲輸入,端口爲1,event是爲默認轉移條件設置的,設置爲輸入3,設置爲Either。是爲了剛初始化時,狀態爲默認的off。
整體完成如上:當初始開始時,爲off狀態,爲當x=1,觸發從0到1,燈亮,輸出爲1,1到0燈滅,輸出爲0。
程序的下載地址:https://download.csdn.net/download/caokaifa/11437934
5.連接節點的應用
這個相當於if ..elseif ..else...這個沒什麼難的,直接搭建即可
6.stateflow回調函數調用
首先,隨便搭建一個stateflow模塊或用我上面搭建的stateflow例子都可以:我就搭建了一個如下圖
然後右擊stateflow模塊,點擊Properties如下圖:
然後出現如下圖:
然後點擊Callbacks,然後點擊ClipboardFcn,添加disp("ClipboardFcn")
這樣,點擊OK,保存就好了,現在看調用函數的效果。回到工程,右擊點擊剪切stateflow模塊,如下圖:
這時,matlab輸入命令窗口出現開始設置的disp顯示內容。
其他的調用函數按照上面操作即可。
注意:這裏可能有的回調函數沒有顯示你的內容,可能是因爲函數對disp有點bug,你可以隨便定義i=9,運行看工作空間有沒有就知道有沒有執行。