如何使用stateflow
一.打開simulink,新建一個model(保存為time.mdl),在simulink的左邊找到stateflow并選中他,將右邊的chart拖入新建的model中,雙擊這個chart,就出現了stateflow的編輯器,先介紹一下這里面能畫的東東(在左邊的工具欄上)
1.左邊工具欄上第一個圖標是方框似的東東,將它拖入編輯器中,就表示一個狀態(state),雙擊它就可以在其中寫一些命令,格式如下(%后面的是我自加的,方便解釋):
name/ %此狀態的名稱
entry:entry action %剛轉換到此狀態時執行entry action
during:during action %在此狀態之中時執行during action
exit:exit action %退出此狀態時執行exit action
on event_namen event_name action %當某事件發生時執行on event_name action
2.左邊工具欄上第二個圖標是一個圓中有個H的東東,它的名字叫做歷史節點(History Junction) ,可將他拖入一個狀態框中(就是上面說的那個),一旦一個狀態框中有這個歷史節點,在退出這個狀態時會將這個狀態的一些信息保存下來,當下次再進入此狀態時,此狀態的初始狀態就會是前面保存過的那些信息。
3.左邊工具欄上第三個圖標是一個一根線指向一個方框的東東,叫默認轉換(default transition),把他拖到一個狀態的旁邊,它就會指向一個狀態,表示系統啟動后將首先進入這個狀態。
4.左邊工具欄上第四個圖標(他的樣子太復雜了,不描述了,反正是最后一個,呵呵)代表的東東,叫節點(Junction),它是方便畫狀態圖的,當各個狀態之間的轉換很復雜時,可以設立中間節點,將一些相同的轉換指向它,然后再由它指向各個狀態(或另一個中間節點)
5.還得介紹一下畫轉換線(transition),將鼠標放在一個狀態的旁邊,當它變成+形狀的時候,按下左鍵不動,就會拉出一條線來,當拉到另一個狀態旁邊時松開左鍵,這樣就畫出了一條由一個狀態指向另一個狀態的轉換線,選中這條線,將鼠標停留在上面,鼠標會變成一個I的樣子,這時按下鼠標,就可以在上面寫語句,例:switch(switch事件使狀態轉換)或[output>maxtime](當此條件滿足時進行狀態的轉變)。
二.再介紹一下stateflow是怎樣跟simulink通訊的,在stateflow編輯器中點tool菜單下的explore,在左邊支開time,選中chart,我們將在此添加一個事件和兩個數據(計數器所需要的)。
1.點Add菜單下event,在右邊就新產生了一行,將它的名字(name)改成switch,范圍(scope)改成input from simulink,觸發器形式(Trigger)改成Rising(其實這兒無所謂),此時你看看time.mdl,是不是chart模塊上方多了一個上升的標志,此時在time.mdl添加一個pul generator(在simulink\sources里面),將他的輸出接到chart的上方,就表示每當pul generator產生的信號上升時,switch事件發生。
2.再添加兩個data,點Add菜單下data,在右邊將他的名字改成output,scope改成output to simulink,此時time.mdl中chart就多出來一個輸出端口,它就是要給simulink用的,在這里output就是計數器的輸出(我們的目標),可以接上一個scope或display看輸出結果(simulink/sinks下,怎么添加及連線就介紹了),再點add--data,將他的名字改成maxtime,scope改成constant,表示他是一個常量,將在matlab的workspace里設定,這里的含義就是計數器的最大值,當計數器的輸出達到這個最大值時,輸出將自動清零,表示重新開始計數。添加完成后,就可關閉explore了。
三.有了上述的準備,就可以在stateflow中畫狀態流圖了,還是在stateflow編輯器里,從左邊的工具欄上拉出一個狀態來(上面介紹過方法了),雙擊它,在其中寫上 ret/ %此狀態的名稱為ret
entryutput=0; %當進入此狀態時,將output賦值為0,表示將計數器輸出清零
再拉入一個默認轉換(History transition,左邊工具欄上第三個),拖到ret狀態的旁邊,使它指向ret狀態,這樣就表示ret狀態將是系統啟動后第一個進入的狀態。再拉入一個狀態,在其中寫上 count/ %此狀態的名稱為count
entryutput++; %當進入此狀態時,output加1,表明計數器記一次數此時再拖入一個節點(Junction,左邊工具欄上第四個,其實可以不用,這兒是介紹一下他的用法),然后畫兩條轉換線(transition,上面介紹怎么畫了),一條由ret狀態指向這個節點,一條由count狀態指向這個節點,在這兩條線都寫上switch,表示一旦switch事件發生,不管當前是哪個狀態,都將轉換到此節點上來(跟simulink聯系來講,就是當time.mdl里的pul generator的信號上升時,就將產生狀態的轉變)。然后再畫兩條轉換線,一條由這個節點指向ret狀態,在線上寫上[output>=maxtime],表示一旦output超過最大值時,將進入到ret狀態(將計數器清零),另一條線由這個節點指向count狀態,在線上寫上[output
stateflow怎么刪除輸入口接口
看了下上面的答案,呵呵了
不多吐槽,點開model explorer 位置在這里
點開后如下圖所示
選擇你想改名或者刪除的變量,鍵盤上按下Delete即可
如何使用stateflow的event觸發
event觸發有三種方式,分別local 狀態圖內部發揮作用,Input from simulink,從simulink框圖輸入到statflow中,也就是stateflow外部觸發事件,最后一種是Output to simulink。是從stateflow框圖輸出到simulink中的,即利用stateflow定義的時間驅動或觸發其他stateflow框圖或子系統動作
stateflow調用c仿真不對
需求分析
在Simulink仿真開發中,我們經常會遇到需要調用已有的c代碼或是出現仿真模型不易實現的c代碼情形。此時,如果使用模塊或是m語言開發,將會降低開發效率。
2 解決方案現狀
基于以上情況,在的maltab2018b后版本中,推出的C Caller模塊可以支持用戶快捷實現外部c代碼的調用。而在老的版本中,常用的有legacy code tool、s-function和stateflow等調用方法。
相比于legacy code tool、s-function的方式,stateflow的調用方法簡單直觀且不用編寫m文件,底層的實現方式和C Caller是相似的,因此本文對stateflow調用C代碼的方法進行闡述。
3 仿真案例
3.1 模型文件的路徑結構
在simulink環境中以SVPWM調制信號的實現方式為例。首先在模型的文件夾路徑下新建文件夾Custom_Code,將需要調用的c代碼放在該文件夾下。
模型及c文件路徑
3.2 文件內容示例
在頂層頭文件中聲明各個功能模塊頭文件,并在各功能模塊頭文件中聲明應用層函數。
頂層頭文件
功能模塊頭文件
3.3 模型參數配置
同時打開模型的設置界面,在simulation target選項卡下進行設置。對于Inrt custom C code in generated選項卡,該處的語句會在運行時添加進stateflow生成的代碼中,最終嵌入到編譯生成的動態鏈接庫里面。對于Additional build information選項卡,需要填寫頭文件路徑、.c文件、庫文件和宏定義,表示除了自動生成的文件外還需要編譯的文件和文件所在的路徑。
將模塊化c文件中頂層的頭文件的聲明添加在Inrt custom C code in generated->Header Flie中,若需要在模型初始化階段和終止階段執行相關指令可在Initialize function和Terminate function中進行添加。同時在Additional build information->Include directories中添加頭文件的路徑。將模塊化c文件中的源文件添加在Additional build information->Source file中。
此處需要說明的是,在Code Generation的選項卡中,也存在類似的custom code選項卡,該處填寫相關文件信息只會在代碼生成的文件中體現,不會在仿真運行中調用。
頭文件添加
源文件添加
3.4 stateflow相關設置
在stateflow中,將運行語言設置為c語言,采樣時間和代碼執行周期保持一致,在代碼中有位運算時可以使能位運算。
stateflow配置
在stateflow的狀態流中調用應用函數。
stateflow調用應用函數
3.5 仿真結果
運行仿真后,可以看到stateflow已經成功調用了c代碼。
仿真結果
4 結論
本文展示了一種stateflow調用用戶自定義c代碼的方法,通過配置模型、代碼文件的相關設置,實現了c代碼在simulink仿真中的快速集成。該方法可以實現c文件的模塊化調用,快速構建清晰的c文件及仿真模型架構,提升代碼開發和算法調試的效率。
注:(1) 在代碼修改后,有時會遇到stateflow不會重新編譯的問題,需要刪除上一次運行產生的動態鏈接庫文件,或者通過對stateflow狀態流進行修改,觸發stateflow重新編譯生成新的動態鏈接庫。
(2) 該方法可以直接將c代碼中常用的結構體、宏定義、聯合體和枚舉量嵌入,無需任何修改即可進行仿真。
(3) 該方法可以在simulink模型中,使用不同的chart對應用層函數同時調用,實現了代碼模型的模塊化開發。
怎樣設置Stateflow編輯窗口的顏色
3、步驟:
①打開VisualStudio2010,單擊”工具“,在下拉菜單中單擊”選項“:
②在彈出的窗口,”環境“下找到”字體和顏色“單擊,然后修改項背景色,然后確定即可完成代碼窗口顏色的修改:
4、注意:修改方式并通用于所有的VisualStudio,例如vs6修改方式有所不同。