寫在前面
這個筆記是看B站UP 快樂的宇航boy 所出的simulink基礎教程系列視頻過程中記下來的,寫的很粗糙不完整,也不會補。視頻教程很細跟著做就行。
lesson1-7節的筆記up有,可以加up的群,里面大佬挺活躍的。
lesson8 for循環 For iterator subsystem
例1 循環累加(迭代次數10次)
雙擊For Iterator可以配置迭代次數
例2 查找數組中大于5的數個數
在該樣例中,設置項【開始時的狀態】對運行結果影響很大,如果設置為【保持】,則在每次進入該模塊運行時,累加器上一次的運行結果會被保留,導致最終的運算結果出錯。設置為【重置】,每次進入模塊時累加器都會清零從新計算,最終計算結果正常。
例3 查找數組中數值為5的數的下標
For iterator設置迭代次數(從內部或外部) 輸出為索引值
可以根據輸入值【設置下一個迭代變量 i】 set next i
在本例中,Next_i變量的作用是查到索引后跳出循環。
小結:simulink的for循環模塊使用不如C語言for循環,一般實際工程中使用simulink的stateflow狀態機實現for循環要更加靈活。
lesson9 while/if/switch case
while循環 while iterator subsystem
模塊名 while iterator subsystem
IC - Init condition - 使能,若IC輸入為0,則不進入循環
進入子系統,為循環累加模型,如下圖
cond - condition - 控制循環是否繼續的使能條件
雙擊【while iterator】模塊設置【循環迭代次數】和【開始時的狀態】
if模塊
和 if action subsystem模塊搭配使用(用于執行條件成立后動作
else if分支,雙擊模塊配置實現,使用逗號分隔分支判斷條件
switch case模塊
相當于多分支if,執行模塊同樣為if action subsystem
雙擊配置分支case,中間用逗號分隔
在Action子系統內可以對數據保持狀態進行配置
lesson10 各類常用子系統介紹
Enabled subsystem 使能子系統
該子系統為累加器,在Enable使能信號值為1時,運行子系統
運行結果如下圖,符合預期(使能信號為1時,計數值累加)
Triggered subsystem 觸發子系統
上升沿/下降沿時使能
pulse generator 脈沖信號 觸發源
子系統內部模型同樣為累加器
通過子系統內對Trigger的配置可以設置 上升沿/下降沿/上升沿或下降沿 觸發
運行模型結果如下圖,符合預期(在trigger信號為上升沿&下降沿時計數值增加)
function-call subsystem 函數調用子系統
用信號為function call 需使用模塊生成信號進行調用 function-call generator,內外部時間設置必須一致,否則報錯。
下圖為Function-Call Generator的參數設置,采樣時間為0.1,意味著0.1s進入一次Function-Call Subsystem
subsystem內部如下圖,為累加器
雙擊function模塊進行配置,注意配置項【采樣時間】需與Function-Call Generator的參數設置一致,否則會報錯。
運行結果如下圖,符合預期(0.1秒進入一次子系統,0.1秒建個累加器數值增加)
【注:采樣時間設置項必須為模型步長的倍數】
例2 使用stateflow調用Function-Call
【注:關于stateflow模塊需看lesson15】
stateflow狀態機內部
配置event信號如下圖
結果如下圖,符合預期(0.1秒計數值增加一)
Simulink Function
Simulink Function和Function Caller模塊搭配使用,前者為定義,后者調用
simulink function類似于C語言函數定義
函數輸入非單一,也支持數組輸入 輸入輸出端口維度需要定義
例1 加法函數
Function內部實現,簡單加法
Function Caller調用函數,模塊參數配置如下
用逗號分隔開函數輸入/輸出的多個引腳
運行結果如下圖
定義了Simulink Function后可以多次調用
例2 數組加法
Simulink Function內部實現如下圖,實現維度為3的數組和數值相加的加法器,輸出一個維度3的數組
雙擊對Simulink Function模塊進行配置,可以修改函數名稱,修改函數范圍
Function Caller參數配置如下
兩種調用方式如下,數組輸入可以使用mux也可直接在Constant模塊直接輸入
lesson11 作業
【注:這節模型大,不好截圖,看視頻跟著做比較好】
搭建簡易車輛動力學模型,公式如下圖
參數如下
使用m腳本文件管理參數
使用m腳本管理模型參數優勢在于,如果參數修改了,只需要修改m文件,而不需要修改模型
lesson12 查表模塊 Lookup Table
一維查表 1-D Lookup Table
X-breakpoints斷點 Y-TableData表數據
上圖查表模塊配置對應下表
x | -2 | -1 | 0 | 1 | 2 |
---|---|---|---|---|---|
y | 1 | 2 | 3 | 4 | 5 |
查表X-Y需一一對應,數組維度需要匹配。且breakpoints-X必須單調增加,否則會報錯。
通過X來查找對應的Y數據,運行結果如下圖所示,符合查找預期(輸入1結果4)。
由于模塊插值算法設置項選擇了【線性點-斜率】方法,輸入X值在表格中2個X之間時,會根據兩點斜率計算中間點的值。
輸入X=0.5得到結果Y=3.5
若插值方法選擇【均一/Flat】,即X值和下一X值之間的所有X數值所對應的Y值均為前一X值所對應的Y值。(類似于取整)
若插值方法選擇【最臨近值/Nearest】,兩X中間值所對應的Y值則由更臨近的X值決定。(類似于四舍五入)
運行結果
當外插值方法選擇【線性】時,系統根據最后兩個點的斜率計算之后的數據
例如
如果外插選擇【裁剪】
運行結果
使用m腳本進行參數管理
在matlab中編寫m腳本
運行后matlab工作區會出現對應變量
將變量添加進模塊配置
運行結果
設置表格數據為外部輸入,即從輸入端口輸入表數據和斷點。
從外部輸入數據,模型如下,結果正確。
二維查表 2-D Lookup Table
使用m腳本管理參數,x1對應行標號,x2對應列標號,y2為表格數值。表格行數對應x1數組長度,表格列數對應x2數組長度。
模塊配置
模型輸入有2項,u1對應查找行,u2對應查找列
三維查表 3-D Lookup Table
使用m腳本配置三維表格參數
模塊配置
模型結果
動態查表 Lookup Table Dynamic
表格數值在模型運行時變化,使用動態查表
運行結果
【使用場景:查表的數據由其他模塊計算而來,可使用該模塊】
在新版本matlab中,普通一維查表模塊的配置表格數值從外部端口輸入,也可實現動態查表的功能
模型如下
運行結果
Lesson13 Matlab Function
使用m腳本實現模塊功能,雙擊模塊進入編輯器
多輸入輸出函數
function [y1, y2] = fcn(u1, u2)y1 = u1 + u2;y2 = u1 - u2;
end
運行
在編輯器界面點擊【編輯數據】,可以對輸入輸出參數進行配置,如配置參數大小、類型等
if語句
每個if需和end關鍵字配對
function y = fcn(u1)y = 0;if u1 > 0y = 1;elseif u1 < 0y = -1;elseif u1 == 0y = 0;endend
運行
for循環
每個for循環 需要匹配end關鍵字
for循環參數說明 - 起始步 : 步長 : 終點
% 查找數組u中大于0的數個數
function y = fcn(u)y = uint8(0);for i = 1:1:5if u(i) > 0y = y + 1;endendend
結果
matlab庫函數 排序sort
% 排序
function y = fcn(u)y = sort(u);end
結果(sort函數默認從小到大排序)
persistent關鍵字 定義持久變量
一般函數內定義的變量為局部變量,函數結束后被清除。persistent持久變量相當于全局變量,不會在函數結束后被清除。相當于c語言static關鍵字,靜態局部變量。
% persistent變量
function y = fcn()persistent u;% u = 0;if isempty(u)u = 0;endu = u + 1;y = u;end
注:matlab無u++;
這種寫法,自增須寫為u = u + 1;
運行結果(時長5s,步長0.1)
添加trigger - 上升沿/下降沿觸發執行
在符號窗口點擊添加事件,選擇添加trigger/觸發器
點擊添加好的trigger可以配置觸發器觸發方式
模型如下圖,pulse generator發出占空比50%周期1s的方波,
matlab function模塊內部為自累加函數
% 自累加
function y = fcn()persistent u;if isempty(u)u = 0;endu = u + 1;y = u;end
運行結果如下圖,每次上升沿觸發一次模塊執行,累加計數值加一
添加 function call函數調用輸出
和trigger添加類似,可以添加多個函數調用輸出
函數調用輸出fcncall名稱可以更改,調用fcncall直接在代碼中輸入對應名稱即可。
step階躍模塊:在某一時刻(設置階躍時間為4s)發生從數值0到數值1的變化
參考:https://blog.csdn.net/Mountain01/article/details/130782041
MATLAB function模塊內部代碼
function fcn(u)if u > 0fcncall;endend
Function-Call Subsystem內部
運行結果,在第4秒時發生階躍,matlab function模塊發出function call信號使能Function-Call subsystem模塊進行自累加
lesson14 Data Inspector 數據檢查器
【此節使用模型為Lesson11作業】
除了scope模塊以外的數據查看方法,比scope更加靈活
設置需要檢測的數據
雙擊信號線,可以配置該信號線的名稱,配置好名稱便于在數據檢查器中查看
單機信號線,會出現標識“…”,選擇第二項“記錄所選信號”(圖標為無線信號)
正在記錄的信號線將顯示圖標,單機圖標也可進入數據檢查器窗口
輸出端口會默認記錄數據在data inspector中
設置顯示單位和數據類型【注:單位需要在信號線對應模塊中進行配置,才會在此處顯示】
設置圖表布局
要使信號線數據顯示在右側圖表框內,需要在左側信號列表勾選信號名,一個子圖內也可勾選多個信號數據
在同一圖表中檢測任意數量的數據曲線
通過游標工具可以查看曲線上對應點的數值,兩個游標可以查看兩個數值之間的時間差
清除子圖可以將所選的或者所有子圖勾選的信號線數據清空,恢復為初始狀態
查找信號在模型中的位置,可以在左側信號列表中選擇信號,點擊右鍵->在模型中突出顯示,點擊右上角的×可以關閉高亮效果。
與前一次運行數據進行比較
樣例為之前搭建的RC一階濾波器【第一節】
選擇記錄輸入信號線和輸出信號線,在數據檢查器中觀測結果
先以alpha=0.05運行一次,再以alpha=0.07運行第二次,比較兩次運行的輸出信號結果
進入比較模塊,選擇基線和比較項分別為第一次運行輸出信號和第二次運行輸出信號,點擊比較。因為未進行容差設置,左側界面標紅顯示不匹配。
容差:以基線為基礎,在±容差值的范圍內查看比較項是否在基線的容差范圍內。
點擊比較項旁邊的[+更多]以配置容差參數,此處設置絕對容差0.2,然后點擊比較。
可以看到左側顯示匹配,下圖中曲線上下綠色區域即基線數值±容差值的范圍,比較項處于該范圍內因而通過比較。
數據文件可以另存為.mldatx文件,以便下次使用
lesson15 stateflow基礎 流程圖
stateflow庫
示例 使用chart實現if語句
判斷語句寫在中括號內,執行語句寫在大括號內。
一般規范,橫線寫判斷語句,縱線寫執行語句。
同一個節點有多個跳轉線時應設置優先級(線上的數字)。
線的優先級更改:右鍵線,執行順序Execution order。
在模型資源管理器Model Explorer中可以對接口和參數進行配置。
示例 使用chart實現for循環
輸出數組等于輸入數組的平方
注:數組索引起始為1
在chart中右鍵線條可以設置斷點
使用C語言
設置方式如圖,在chart模塊左下角小圖標可以看到當前語言
一般來說語法沒有太大差別,區別點:
自增
C語言 i ++;
matlab i = i + 1;
取反
C語言 y = !x;
matlab y = ~x;
參數使用matlab腳本中定義變量
在模型資源管理器中設置
設置變量作用域Scope為parameter,即可識別到腳本中變量
lesson16 stateflow基礎 狀態機
例
if x > 0state = 1;
elsestate = 0;
使用狀態機實現邏輯,如圖
需要在模型資源管理器中配置變量并配置輸入、輸出端口,如下圖
狀態機狀態之間如果有多條跳轉線,將會按照跳轉線的優先級來依次判斷。
狀態機每次步長進行一次跳轉,不能連續跳轉(即便滿足條件也不跳轉)。
entry / during / exit
entry后的語句會在進入狀態時執行;
during后的語句會在狀態保持時執行;
exit后的語句會在退出狀態時執行。
例
if x > 0
輸出狀態state = 1
且輸出計數1開始計數if x <= 0
輸出狀態state = 0
且輸出計數2開始計數
使用chart實現如圖
需要在模型資源管理器中配置參數
實現結果
entry關鍵字可縮寫為en,during關鍵字可縮寫為du,exit關鍵字可縮寫為ex
在狀態機中添加流程圖
例
if x > 0
輸出狀態state=1
在狀態1下,如果y=1,計數器開始計數
如果y=0,計數器停止計數,且計數器數據保持不變if x <= 0
輸出狀態state=0
計數器清零
實現
默認轉移線(有實心圓點的線)只會在第一次進入狀態時走,另一條線在狀態保持期間走(從狀態邊框拉出)。
運行使用單步運行,過程中修改x,y數據進行調試。快捷鍵shift + ctrl + x
可注釋不適用的模塊,防止影響數據檢查。
運行結果
狀態自跳轉
自跳轉:狀態從自身退出,又重新進入自身
例 計數器
start == 1
計數器計數
reset == 1
計數器重置
實現
運行結果
lesson17-18 代碼生成
場景
流程
步驟
搭建模型,在【APP】欄選擇【Embedded Coder】,會彈出新欄【C代碼】,進入并點擊【編譯】即可生成C代碼。
編譯快捷鍵【Ctrl+B】
注:建模需設置為定步長才可進行代碼生成
生成代碼的最外層需要有inport和outport,即輸入輸出端口
生成文件
ert -
rtw - real time workshop
代碼文件
和模型名稱同名的.c文件為主要代碼文件,實現模型功能。
step函數 主要,運行時
initialize 初始化
terminate 終止
所有inport輸入會在一個結構體中,全局變量。outport輸出同上。
同名.h文件,實際程序中include后,可以調用.c中函數
代碼生成配置
求解器配置
固定步長(基礎采樣時間)設置不會影響實際代碼
tlc選擇
tlc相當于代碼生成的模板
是否生成報告&是否自動打開報告
只生成代碼
編譯會生成可執行文件,win平臺生成同名.exe文件。一般僅生成代碼就行。
模型和代碼的追溯關系設置
對模型中想追溯代碼的模塊單擊【右鍵】-【C/C++代碼】-【導航到C/C++代碼】,即可定位到該模塊生成的代碼在c文件中的位置。
此功能在代碼調試bug時會用到。
靜態代碼度量 static code metrics
在【配置參數】 > 【代碼生成 】> 【報告】窗格中,選擇【生成靜態代碼度量】。生成代碼報告中會有相關訊息。
原子子系統
右鍵子系統模塊【模塊參數】,勾選【視為原子單元】
原子子系統對比其他子系統邊框更粗,細邊框的子系統實際上為虛擬子系統,matlab生成代碼時仍然作為整體看待。
點擊【代碼生成】欄即可配置該原子子系統代碼生成相關配置
重新生成代碼,即會單獨生成相應子系統代碼文件
文件打包格式配置
緊湊型 compact
原子子系統配置需配置【文件名選項】為【自動】,否則會與緊湊型生成代碼相沖突報錯。
生成的代碼文件數量變少,函數、代碼等被集合到同一個文件中,便于復制代碼。
其他
代碼映射 Code Mapping - C
可以對生成的函數名稱進行設置
lesson19 常用模塊介紹2
saturation 范圍限制
效果
ground & terminator
如果根據功能,模型的輸入或者輸出端口不需要連接任何模塊,直接懸空,也可以仿真或者生成代碼,但通常都會報告警信息。
對于不使用的輸出端口,可以連接到Terminator模塊上;
對于不需要信號輸入的輸入端口,可以連接到Ground模塊上,等同于給了輸入值為0;
這樣可以避免模型報出告警信息,也使得模型更加規范。
Rate Limiter 變化速率限制模塊
功能:對輸入信號的變化速率的最大值進行限制,信號變大的速率和變小的速率的最大值,分開設置。
如果信號變大的速率小于Rising slewrate,則輸出與輸入相同;
如果信號變大的速率大于Rising slewrate,則輸出按照Rising slewrate的速度更新;
信號變小同理。
效果如圖
Integrator/Discrete-Time Integrator 連續積分器/離散積分器
功能:對輸入信號進行積分
Integrator:官方不建議生成代碼
Discrete-Time Integrator:嵌入式系統軟件開發,應使用這個積分器,可以生成代碼測試
二者效果相同
連續微分 Derivative / 離散微分 Discrete Derivative
求斜率
結果
乘積 Product of elements
將輸入的所有元素相乘,使用方法和普通product模塊有別
修改配置項中【輸入數目】項的符號【*】為【/】,功能變為將元素相乘后求倒數
結果
注:和product本質為同一模塊,符號改變為【**】即變為普通product
求和 Sum of Elements
對輸入各個元素求和
修改【符號列表】項符號為【-】,功能變更為數組求和后求反
結果
注:和加法器為同一模塊,修改【符號列表】為【++】,變為普通加法器
Data Type Conversion 數據類型轉換模塊
功能:可以將一個信號的數據類型轉換成另一種類型。
雙擊模塊在【模塊參數】中配置【輸出類型】即可配置強制轉換類型。
如果是浮點的轉換成整形,則小數點會被抹掉,在建模過程中,如果模型報出數據類型不匹配的錯誤,可以使用這個模塊將數據類型轉換成需要的類型。
使用這個模塊應當注意,轉換類型應合理,在將寬的數據類型轉換成窄的數據類型時,應當審視是否有溢出。
下圖展示了浮點轉整形時,小數會被抹掉:
數據類型轉換時要注意合理性,以下為錯誤示范:高8位被丟棄,導致數據出現錯誤。
數據類型向后繼承Inherit,自動根據后面要使用的數據類型進行轉換,不要特別進行設置
lesson20 常用模塊介紹3
視頻:https://www.bilibili.com/video/BV17h4y197W4
Manual Switch 手動開關
功能:根據開關狀態選擇不同輸入通路,雙擊模塊即可切換開關狀態。
Merge 合并模塊
功能:Merge模塊可以將多個輸入合并成一個信號,合并的邏輯是,輸出信號等于當前被激活的那個輸入信號,因此多個輸入信號不能同時被更新,在同一個時刻,應只有一個輸入信號被更新。
Merge模塊的輸入信號應當用心設計,永遠使用有條件執行的子系統的輸出作為Merge模塊的輸入,并且將子系統未被使能時輸出的更新設置成held,參考help文檔中Merge模塊的使用原則,例如下面這個模型:
Multiport Switch 多端口選擇模塊
功能:根據控制信號的值,選擇不同的輸入信號輸出,與C語言中的Switch語句很類似。
最上方入參為控制信號,如果輸入為浮點型數據,simulink會自動對其取整。
最下方*為default默認輸出,通過設置可配置告警或者報錯。
模塊參數中可以對該模塊進行配置,如【數據端口數量】可以配置分支數量,默認端口是否和最后一個端口合并等。
效果
Sources 信號源類別模塊
仿真時使用
Signal Builder 信號構造模塊
功能:構造自己想要的各種信號曲線,幫助測試模型。
新版本移除該模塊,功能放在Signal Editor模塊中。
在matlab命令行輸入如下代碼進行調用:
block = signalbuilder([], 'create', [0 5], {[2 2];[0 2]});
打開Signal Builder可以在其中編輯需要的各種曲線,實例效果如下:
編輯器
效果
Clock/Digital Clock 時鐘/數字時鐘模塊
功能:輸出當前仿真時間
連續系統使用Clock模塊,離散系統使用Digital Clock模塊
如下圖所示,digital clock數字時鐘更新與模塊設定的【采樣時間】有關,Clock時鐘模塊時間數值是連續更新的。
Stop Simulation 仿真停止模塊
功能:輸入信號設為True,可以控制仿真停止
如下模型展示了這個模塊的功能,斜坡信號模塊的斜率為1,當仿真時間達到10時,StopSimulation模塊的輸入信號變為true,所以雖然仿真時間設為20,但是在10s時仿真停止。
Real-Time Synchronization 實時仿真模塊
功能:可以控制模型按照真實時間的速度運行,適用于模型和一些實時系統聯合仿真調試的場景。但是改模塊保證的實時性精度不高。
添加該模塊到模型中即可,該模塊沒有輸入輸出。如下參數配置,表示誤差累積達到10次,模型會報錯停止運行,如果可以接受實時性的誤差,不希望模型經常報錯停止運行,可以將這個參數設置為一個較大的數值。
該模塊發揮作用需要安裝Kernel,在matlab命令行窗口中運行如下命令安裝
sldrtkernel -install
在Simulink help文檔中搜索如下主題,可以查看相關信息
Install Real-Time Kemel
2021a版本的Matlab在win11系統上,有兼容性問題,無法正常使用該模塊
lesson21 位運算模塊使用介紹
Bit Clear/Bit set 位清除模塊/位置位模塊
功能:
Bit Clear:將一個數的指定bit位設為0。
Bit Set:將一個數的指定bit位設為1。
輸入必須是整型,不支持浮點型數據。
【模塊參數】配置中可以指定要修改的某個位。
效果如下圖:
Bitwise Operator 按位操作模塊
功能:將輸入信號和一個指定的數按位進行邏輯運算
如下圖,設置模塊有兩個輸入,輸出結果是將兩個輸入按照位進行與運算得出的。
也可以將要按位與運算的數值配置在模塊參數中,如下圖
結果
Bit to Integer Converter / bit流轉整型模塊
功能:將二進制bit流(用數組表示)轉換成整型數
如下圖所示,將數組[0 0 1 0]轉換成十進制數2
配置
位數需要與輸入數組的維度相對應,否則報錯
MSB first,數組的第一個元素表示bit流的最高bit位,數組的最后一個元素表示bit流的最低bit位,因此數組[0 0 1 0]被轉換成了十進制的2。
如果配置為LSB優先,bit順序相反,數組[0 0 1 0]被轉換為二進制0b0100,即十進制數值4。
參考:【MSB和LSB】https://blog.csdn.net/lx123010/article/details/103657114
配置轉換為有符號數
結果
首位為符號位,后7位為補碼
Integer to Bit Converter 整型轉bit流模塊
功能:將整型數轉換成二進制bit流(用數組表示)
即如下圖所示,也可以選擇輸出的數組為 MSB first 或者LSB first【圖中為MSB優先】
Shift Arithmetic 算術位移模塊
功能:1.將數按照bit位左移或者右移;
2.將數的二進制小數點左移或者右移
如下圖將無符號數3,左移一位,得到結果6
配置
注意,有符號負數右移時,高位補1。如下圖。
如果選擇移動方向為雙向,則負數表示左移,正數表示右移。
Binary points to shift 將數的二進制小數點移位
這個參數配置是將二進制的小數點左移或者右移,如下圖,-1表示左移,將二進制數0b00000011
的二進制小數點左移了一位,即:
0b 0000 0011.
-> 0b 0000 001.1
小數點左側的數表示整數部分,即20=1
小數點右側的數表示小數部分,即2-1=0.5
因此轉換后的數在display中顯示為1.5,但這是定點類型數據,被轉換后的數據類型是ufix8 En1,在內存中存儲的數據,轉換前后并沒有發生變化,這也可以通過如下兩個display得到證實。ufix8_En1為定點數據類型。
再看如下的例子,將15小數點左移兩位:
0b 0000 1111.
-> 0b 0000 11.11
整數部分:21+20=3
小數部分:2-1+2-2=0.75
因此轉換后的數據是3.75,被轉換后的定點數據類型是ufx8_En2。
【小數點移位并不改變數據在內存中的存儲方式,改變的是對該數據的解析方式】
lesson22 51單片機跑馬燈
https://www.bilibili.com/video/BV1NV411g7En
思路:使用模型實現循環移位
使能子系統1
使能子系統2
結果-循環左移
結果-循環右移
配置生成代碼的入參和返回值
relay
Relay模塊的輸出在兩個指定值之間切換。打開中繼時,它會一直保持打開,直到輸入低于Switch off point參數的值為止。關閉中繼時,它會一直保持關閉,直到輸入高于Switch on point參數的值為止。此模塊接受一個輸入并生成一個輸出。
參考資料:https://zhuanlan.zhihu.com/p/338742418
end