天天看點

Simulink仿真入門到精通(十四) Simulink自定義環境

本系列教程是根據孫忠潇編著的<<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),為了添加項目,需要以下步驟:

  1. 建立一個定義項目的模式函數(schema function);
  2. 将這個定義菜單項目的函數注冊在sl_customization.m中;
  3. 為這個菜單項目定義一個觸發運作的回調函數。

例:增加一個顯示目前所選子產品屬性清單的菜單項目。

首先建立一個定義此項的模式函數。

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顯示出來。 

Simulink仿真入門到精通(十四) Simulink自定義環境

使用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菜單最末一項得到所設定的菜單項。

Simulink仿真入門到精通(十四) Simulink自定義環境

注:函數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。

Simulink仿真入門到精通(十四) Simulink自定義環境

自定義菜單項也可以添加到右鍵菜單中。隻需将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子頁面可以選擇各個廠家提供的各種目标硬體晶片類型,設定其大小端方式、所支援的各種資料類型的位數等。

Simulink仿真入門到精通(十四) Simulink自定義環境

在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選項,上述配置已添加進去。

Simulink仿真入門到精通(十四) Simulink自定義環境

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
           

繼續閱讀