循環邏輯
要得到:
y1 = 0;
for(inx = 0; inx <10; inx++)
{
y1 = u1[inx] + y1;
}
或者
while(flag && (num_iter <= 100)
{
flag = func ();
num_iter ++;
}
怎么做:
Stateflow 有相應的流程圖向導可以直接使用,自動生成對應的流程圖結構。
For循環
1. 模型
在 Stateflow 里有各種控制流的構造向導,如下圖。如果對 Stateflow 的流程圖構建不熟悉的話,可以使用它來自動生成,再在它的基礎上進行修改:
從而得到所需要的框圖:
2. 數據
定義 Stateflow 模塊的端口和本地變量,輸入端口 u1,輸出端口 yy1,以及本地變量 inx 如下:
在 Base Workspace 里定義輸入輸出信號 u1,yy1 的 Data Object:
3. 關聯
在信號線上右鍵,設置信號屬性,勾選 “Signal name must resolve to Simulink signal object”,將信號與 Base Workspace 的數據對象關聯在一起。關聯輸入輸出信號后,會看到如圖的藍色小叉子:
4. 代碼
Ctrl+B,它所自動生成的代碼:
While循環
1. 模型
下圖就通過向導構造的,得到跟 for 循環類似的流程圖:
這里的func作為一個 事件Event ,觸發外面的 function call 子系統 func 計算flag:
2. 數據
Stateflow 內的數據定義如下圖,輸入端口名稱 u1,輸出端口名稱 yy2,本地變量 num_iter。flag 由外部函數 func 來更新而作為輸入。另外, func 事件觸發調用外部的 func 函數。( inx 這里沒有用)
在 Base Workspace 里定義相應的數據對象。因為這個 Simulink 模型的信號線上已經命名為 u2,所以定義的數據對象名稱要跟信號線的名字一致: u2,yy2,flag。
并設置 flag 的初始值為 true。將數據對象與 Simulink 信號線關聯。
3. 生成代碼
Ctrl+B,生成的代碼如下圖所示。設置了 func()子系統的屬性,把它變成一個子函數來調用。沒有截圖顯示,但是func() 函數里修改了全局變量 flag 的值。
代碼正常生成,但此時會得到如下的警告:
也就是說,我們之前對數據對象 flag 所設置的初始值是沒用的,會被模型中 func 子系統的輸出端口 Out1 的初始值所覆蓋。
默認情況下 Out1 端口的初始值為 0 ,所以看下圖的初始化函數里, flag 被初始化為 false,我們之前所設置的初始值 true 沒有發生作用。
主程序里的 while(flag&(inx<100)) 都不會被執行。這個問題,通過仿真也會測出來。
所以,需要雙擊 func 子系統的 Out1 端口,設置初始值為 true,仿真才能得到正確的結果。同時,也會最后得到下面的初始化代碼。
do while循環
使用流程圖的向導,選擇 do while 模式,把 Chart 里面的流程圖改改就行了。另外,被調用的 func 函數,也可以寫在 Chart 里面。
Stateflow 有相應的流程圖向導可以直接使用,自動生成對應的流程圖結構。
-
輸出信號
+關注
關注
0文章
295瀏覽量
12000 -
初始化
+關注
關注
0文章
50瀏覽量
11986
發布評論請先 登錄
相關推薦
技術干貨驛站 ▏深入理解C語言:嵌套循環與循環控制的底層原理

評論