本系列教程是根據孫忠潇編著的<<Simulink仿真及代碼生成技術入門到精通>>學習筆記。
目錄
Simulink仿真入門到精通(一) Simulink界面介紹
Simulink仿真入門到精通(二) Simulink子產品
Simulink仿真入門到精通(三) Simulink信号
Simulink仿真入門到精通(四) Simulink子系統
Simulink仿真入門到精通(五) Simulink模型的仿真
Simulink仿真入門到精通(六) Simulink模型儲存為圖檔
Simulink仿真入門到精通(七) Simulink的回調函數
Simulink仿真入門到精通(八) M語言對Simulink模型的自動化操作及配置
Simulink仿真入門到精通(九) Simulink的流控制
Simulink仿真入門到精通(十) S函數
Simulink仿真入門到精通(十一) 子產品的封裝
Simulink仿真入門到精通(十二) Publish釋出M檔案
Simulink仿真入門到精通(十三) Simulink建立自定義庫
Simulink仿真入門到精通(十四) Simulink自定義環境
Simulink仿真入門到精通(十五) Simulink在流程工業中的仿真應用
Simulink仿真入門到精通(十六) Simulink基于模型設計的工業應用概述
Simulink仿真入門到精通(十七) Simulink代碼生成技術詳解
Simulink仿真入門到精通(十八) TLC語言
Simulink仿真入門到精通(十九) 總結回顧
目錄
- 14.1 Simulink 環境自定義功能
- 14.2 Simulink 工具欄菜單自定義
- 14.3 Simulink Library Browser 菜單欄自定義
- 14.4 Simulink 目标硬體自定義
- 14.5 Simulink 參數對話框控制
14.1 Simulink環境自定義功能
sl_sustomization.m函數是Simulink提供給使用者使用MATLAB語言自定義Simulink标準人機界面的函數機制。若sl_sustomization.m函數存在于MATLAB的搜尋路徑中,在當Simulink啟動時就會讀取此檔案的内容進行Simulink的人機界面的初始化。Simulink本身就提供了這個函數,使用者每次修改之後,必須重新開機Simulink或者使用指令sl_refresh_customizations使變更起作用。
參考:https://www.mathworks.com/help/simulink/ug/registering-customizations.html
Reading and Refreshing the Customization File
The
sl_customization.m
file is read when Simulink starts. If you change the
sl_customization.m
file, either restart Simulink or enter this command to see the changes:
sl_refresh_customizations
This command runs all
sl_customization.m
files on the MATLAB path and in the current folder. Some side-effects of running
sl_refresh_customizations
include:
- Rebuilding the Simulink Toolstrip
- Rebuilding all Simulink Editor menus
- Rebuilding the Library Browser menus and toolbars
- Clearing the Library Browser cache and refreshing the Library Browser
- Reloading the Viewers and Generators Manager data
14.2 Simulink工具欄菜單自定義
可以在Simulink提供的現有菜單欄的基礎上進行菜單項的添加。Simulink Model Editor中用于添加菜單項的位置有3個:頂層菜單的末尾、菜單欄和右鍵菜單的開始或結尾處。
添加的對象成為項目(item),為了添加項目,需要以下步驟:
- 建立一個定義項目的模式函數(schema function);
- 将這個定義菜單項目的函數注冊在sl_customization.m中;
- 為這個菜單項目定義一個觸發運作的回調函數。
例:增加一個顯示目前所選子產品屬性清單的菜單項目。
首先建立一個定義此項的模式函數。
function schema = get_block_property(callbackInfo)
schema = sl_action_schema; %使用sl_action_schema函數建立一個對象
schema.label = 'block property';
schema.userdata = 'Custom';
schema.callback = @custom_callback;
end
選中此菜單時觸發回調函數 custom_callback,顯示目前選中的子產品的屬性清單。
function custom_callback(callbackInfo)
inspect(gcbh);
disp('### The property of current block is displayed.');
end
接着将定義的函數注冊到sl_customization.m中。
以下代碼将Simulink菜單欄以及子層菜單的WidgetId顯示出來。
使用addCustomMenuFcn方法可以注冊一個自定義菜單項目函數。
function sl_customization(cm)
%% Register custom menu function.
cm.addCustomMenuFcn('Simulink:ToolsMenu', @custom_items);
end
在注冊的cuntom_items函數中使用句柄函數方式,亦成為匿名函數。
%% Define the custom menu function.
function schemaFcns = custom_items(callbackInfo)
schemaFcns = {@get_block_property};
end
這樣,就在Tools菜單最末一項得到所設定的菜單項。
注:函數custom_items、get_block_property和custom_callback的參數callbackInfo并沒有被使用,可使用~表示。
自定義Model Editor的菜單不僅可以是一級菜單,還可以是多級菜單。此時需要在sl_container_schema函數建立一個容器對象,并将剛才建立的菜單項目作為其成員添加進去。
%% Define the schema function for first menu item.
function schema = menu_control(callbackInfo)
schema = sl_container_schema;
schema.label = 'Customized';
schema.childrenFcns = {@get_block_property;}
end
在sl_costomization.m中注冊菜單項目模式函數時将最上層的模式容器對象注冊進去。即将@get_block_property改為@menu_control。
自定義菜單項也可以添加到右鍵菜單中。隻需将sl_customization.m中addCustomMenuFcn函數的首個參數'Simulink:ToolMenu'改為'Simulink:ContextMenu'即可。
14.3 Simulink Library Browser菜單欄自定義
可參考:https://www.mathworks.com/help/simulink/ug/customizing-the-library-browser.html
Simulink Library Browser菜單欄也可以添加使用者自定義的菜單,方法同前。
更改各個Simulink工具線的順序:Simulink Library Browser中各個工具箱的排列順序是内置的,由優先級和名稱2個因素決定。優先級數字越小工具箱排位越靠前;對于同一優先級的工具箱按照字母順序排列。預設情況下Simulink庫優先級為-1,其他工具箱優先級為0。
cm.LibraryBrowserCustomizer.applyOrder({'Embedder Coder',-2});
該指令将Embedded Coder工具箱顯示在首位。
cm.LibraryBrowserCustomizer.applyFilter({'Embedded Coder','Hidden'});
cm.LibraryBrowserCustomizer.applyFilter({'Simulink','Disabled'});
sl_refresh_customizations
以上代碼将Embedded Coder工具箱隐藏,将Simulink工具箱設定為不可用。
14.4 Simulink目标硬體自定義
在Configuration Parameter對話框中的Hardware Implementation子頁面可以選擇各個廠家提供的各種目标硬體晶片類型,設定其大小端方式、所支援的各種資料類型的位數等。
在sl_customization.m中使用loc_register_device注冊一個函數,在這個函數中對硬體的屬性進行描述即可。描述目标硬體的結構體對象需要使用RTW.HWDeviceRegistry建立并配置。需要配置的成員資訊有:
配置成員名 | 說明 |
Vendor | 晶片生産商 |
Type | 晶片系列号或類型名 |
Alias | 晶片别名,不使用時不用設定,為空 |
Platform | Production hardware以及Test hardware兩個組别中是否都顯示控件清單,二者組别名分别以字元串'prod','test'表示 |
setWordSizes | 設定各種資料類型的位數,按照長度順序char≤short≤int≤long,long以外類型位數必須為8的整數倍,最大為32位,long型位數不能少于32位 |
LargestAtomicInteger | 最大原子整數,生成代碼中存在資料拷貝時使用,若對位數大于此選項設定的資料進行整數資料拷貝,則檢測資料拷貝完整性展現在代碼生成中 |
LargestAtomicFloat | 最大原子浮點數,生成代碼中存在資料拷貝時使用,若對位數大于此選項設定的資料進行浮點數資料拷貝,則檢測資料拷貝完整性展現在代碼生成中 |
Endianess | 位元組次序設定,打斷big或小端little |
IntDivRoundTo | 有符号整數進行除法時的四舍五入方法選擇,'zero','floor'或'undefined' |
ShiftRightIntArith | true/false,設定是否将有符号整數的右移操作作為算數右移 |
setEnabled | 選擇此目标硬體時哪些GUI控件是可選的 |
例:描述一個虛拟目标硬體商Custom提供的SimulinkType系列晶片。
function sl_customization(cm)
cm.registerTargetInfo(@loc_register_device);
end
% loc_register_devie resigters self defined device into Simulink Parameter
% cofiguration
function thisprod = loc_register_device
thisprod = RTW.HWDeviceRegistry;
thisprod.Vendor = 'Custom';
thisprod.Type = 'Simulink Type';
thisprod.Alias = {};
thisprod.Platform = {'Prod','Test'};
thisprod.setWordSizes([8 16 16 32 32]);
thisprod.LargestAtomicInteger = 'Char';
thisprod.LargestAtomicFloat = 'Float';
thisprod.Endianess = 'Big';
thisprod.IntDivRoundTo = 'floor';
thisprod.ShiftRightIntArith = true;
thisprod.setEnabled({'BitPerPointer'});
end
重新整理後可以看到vendor中新增了Custom選項,上述配置已添加進去。
14.5 Simulink參數對話框控制
Simulink環境下的對話框也可以通過屬性設定的方法進行一定的自定義。
實作步驟是首先在sl_customization.m中使用addDlgPreOpenFcn方法注冊一個回調函數,回調函數綁定在目标控件的父對象上。再在回調函數中編寫設定目标控件屬性的M語句。對一個控件的回調函數需要注冊到其父對象的ConfigSet中,本質就是在其父控件被打開之前調用這個自定義的回調函數實作某控件的使能及可見性設定。
例:将SolverType隐藏,将仿真StartTime變為不可編輯。
function sl_customization(cm)
cm.addDlgPreOpenFcn('Simulink.SolverCC',@disable_solver_type);
end
function disable_solver_type(dialogH)
dialogH.hideWidgets({'Simulink.SolverCC.SolverType'});
dialogH.disableWidgets({'Simulink.SolverCC.StartTime'});
end