8.1 M語言控制模型的仿真
M語言與Simulink結合的方式:
- 在Simulink模型或模塊中使用回調函數
- 在M語言中調用與模型相關的命令,控制模型的建立,設置模塊的屬性,增刪信號線,以及運行模型仿真等
為了調用和操作Simulink模型,M語言中最常用的函數有sim、set_param、get_param。
8.1.1 sim控制模型仿真及參數配置
(1)simOut=sim('model','ParameterName1',value1,'ParameterName2',value2,...);
對名為model的模型進行仿真,仿真時將其參數通過[參數名,參數值]的方式進行配置。
simOut是一個Simulink.SimulationOutput對象,包含了仿真的輸出:仿真采樣時間、狀態值和信號值。
sim_out=sim('mymodel','SimulationMode','Normal','stoptime','30');
(2)simOut=sim('model',ParameterStruct);
仿真時通過結構體變量配置參數。
param_struct=struct('SimulationMode','Normal','stoptime','30');
sim_out=sim('mymodel',param_struct);
(3)simOut=sim('model',ConfigSet);
仿真時通過配置集合來配置參數。
getActiveConfigSet() %獲取模型的配置集合變量 attachConfigSet() %綁定參數配置集合到模型 setActiveConfigSet() %激活模型的某個參數配置
對ConfigSet對象進行參數獲取/設定也使用set_param()/get_param()。
(4)sim('model');
當不需要該表模型的參數配置,也不關心模型仿真的輸出時,可以直接sim。
使用上述命令運行仿真時,並不修改模型的配置,而是通過sim函數暫時設置某個參數應用於此次仿真,仿真后模型的配置參數仍然保持之前的設定不受影響。
當希望觀察模型參數配置不同對仿真結果有何影響時,直接使用多個sim語句帶上不同的參數配置作為M腳本運行即可。
示例:

Data Export選Array。
param_struct1.SaveState = 'on';
param_struct1.StateSaveName = 'xout1';
param_struct1.SaveOutput = 'on';
param_struct1.OutputSaveName = 'yout1';
param_struct1.SolverType = 'Fixed-step';
param_struct1.Solver = 'FixedStepDiscrete';
param_struct1.FixedStep = '0.01';
sim_out1 = sim('mymodel',param_struct1);
param_struct2 = param_struct1;
param_struct2.FixedStep = '2';
param_struct2.OutputSaveName ='yout2';
sim_out2 = sim('mymodel',param_struct2);
t1 = get(sim_out1, 'tout');
t2 = get(sim_out2, 'tout');
y1 = get(sim_out1, 'yout1');
y2 = get(sim_out2, 'yout2');
figure;
title('Sim a model with different config parameters');
subplot(211);
plot(t1,y1);
xlabel('time(s)');
ylabel('yout1');
subplot(212);
plot(t2,y2);
xlabel('time(s)');
ylabel('yout2');

8.1.2 set_param控制模型仿真過程
set_param(object,param1,value1,param2,value2,...);
- object:模型或模塊對象,既可以使用路徑表示,也可以使用句柄表示;
- paramX:模型或模塊的參數名;
- valueX:對應於paramX的參數值。
獲取參數則使用get_param(object,param),每次只能獲取一個參數的值。
有一個參數名為SimulationCommand,可由set_param設置不同的值來控制模型仿真的過程。
| 值 | 功能說明 |
| start | 啟動模型仿真 |
| pause | 暫停模型仿真 |
| step | 單步執行仿真 |
| continue | 繼續模型放着 |
| stop | 停止模型仿真 |
例:在仿真過程中某些時刻改變某些參數的值。

set_param('mymodel','SolverType','Fixed-step','Solver','FixedStepDiscrete','FixedStep','0.1');
set_param('mymodel', 'SimulationCommand', 'start');
set_param('mymodel', 'SimulationCommand', 'pause');
set_param('mymodel', 'SimulationCommand', 'step');
pause(0.2);
t = get_param('mymodel', 'SimulationTime') % get current simulation time
while t~=0
t = get_param('mymodel', 'SimulationTime'); % get current simulation time
if t < 30
set_param('mymodel/Gain', 'Gain','3');
elseif t < 80
set_param('mymodel/Gain', 'Gain','1.5');
else
set_param('mymodel/Gain', 'Gain','-0.3');
end
set_param('mymodel', 'SimulationCommand', 'step');
pause(0.2);
end
set_param('mymodel', 'SimulationCommand', 'stop');

8.2 M語言修改模塊屬性
set_param('m_control_05','SimulationCommand','start');
scope_h = find_system('m_control_05', 'findall','on','blockType','Scope');
num_scope = length(scope_h);
for ii = 1: num_scope
set(scope_h(ii), 'Open', 'on');
end
8.3 M語言自動建立模型
幾個重要的函數:
- 模型相關:new_system創建新模型,load_system將模型加載到內存(不可見),open_system打開模型使可視化;
- 模塊相關:add_block向模型中追加模塊,delete_block刪除模塊,replace_block替換模塊;
- 信號線相關:add_line在模塊輸入/輸出口之間連線,delete_line將既存的信號線刪除。
8.3.1 模型的建立及打開
new_system可以有返回值,返回模型的句柄。
>> h=new_system('new')
h =
1.8480e+03
save_system可以與new_system連用而直接將模型保存在硬盤上。
load_system將模型隱式打開。
close_system關閉模型,參數為模型名,不寫參數時關閉選中的模型(gcs)。
bdclose all可以無條件關閉所有隱式或顯示打開的模型,即使模型存在改動也不提示保存,謹慎使用。
8.3.2 模塊的添加、刪除及替換
add_block('src','dest')
src指所添加的模塊的路徑,dest表示這個源模塊添加到的目標路徑。
add_block('simulink/Sources/Constant','mymodel/Constant')
add_block('src','dest','param1','value1',...)
可以在添加模塊的同時對其參數進行設定。
注意:在添加模塊時應避免命名的重復,否則會導致錯誤;在添加模塊之前,要先顯示或隱式的將模型打開。
replace_block('sys','old_blk','new_blk')
sys為模型名,old_blk為需要被替換的模塊類型名,new_blk為用來替換其他模塊的模塊名。
當模型中被替換的模塊類型存在多個模塊時,會彈出對話框供用戶選擇。
替換后模塊名沒有改變。
replace_block('mymodel','Scope','simulink/Sinks/Out1')
delete_block('blk')將此類模塊全部刪掉。
8.3.3 信號線的添加及刪除
h=add_line('sys','oport','iport')
在模型sys中追加從輸出口oport到輸入口iport的信號線,並返回其句柄h。
輸入輸出端口都需要在模塊名后追加斜杠和端口序號。
add_block('simulink/Sources/In1','mymodel/In1');
add_block('simulink/Sinks/Out1','mymodel/Out1');
add_line('mymodel','In1/1','Out1/1','autorouting','on');

autorouting可以使連線僅保持水平和豎直兩個方向。
8.3.4 M語言自動創建模型
自動創建switch模型。
function varargout = section_model(varargin)
% SECTION_MODEL MATLAB code for section_model.fig
% SECTION_MODEL, by itself, creates a new SECTION_MODEL or raises the existing
% singleton*.
%
% H = SECTION_MODEL returns the handle to a new SECTION_MODEL or the handle to
% the existing singleton*.
%
% SECTION_MODEL('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in SECTION_MODEL.M with the given input arguments.
%
% SECTION_MODEL('Property','Value',...) creates a new SECTION_MODEL or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before section_model_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to section_model_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help section_model
% Last Modified by GUIDE v2.5 02-Jan-2015 09:24:44
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @section_model_OpeningFcn, ...
'gui_OutputFcn', @section_model_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before section_model is made visible.
function section_model_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to section_model (see VARARGIN)
% Choose default command line output for section_model
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes section_model wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = section_model_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as a double
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit3_Callback(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit3 as text
% str2double(get(hObject,'String')) returns contents of edit3 as a double
% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --------------------------------------------------------------------
function Untitled_1_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_2_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
bdclose all;
threshold = get(handles.edit1,'string');
up_out = get(handles.edit2, 'string');
down_out = get(handles.edit3, 'string');
rel = get(handles.popupmenu1,'Value');
mdl_name = 'switch_section';
mdl_handle = new_system(mdl_name);
open_system(mdl_handle);
add_block('simulink/Signal Routing/Switch',[mdl_name,'/Switch']);
add_block('simulink/Commonly Used Blocks/In1',[mdl_name,'/In1'],'Position',[35 213 65 227]);
add_block('simulink/Commonly Used Blocks/Out1',[mdl_name, '/Out1'],'Position',[345 213 375 227]);
add_block('simulink/Commonly Used Blocks/Constant',[mdl_name, '/Constant'],'Position',[125 150 155 180]);
add_block('simulink/Commonly Used Blocks/Constant',[mdl_name, '/Constant1'],'Position',[125 265 155 295]);
if rel == 2
criterial = 'u2 > Threshold';
elseif rel == 1
criterial = 'u2 >= Threshold';
else
criterial = 'u2 ~= 0';
end
set_param([mdl_name,'/Switch'], 'Criteria', criterial, 'Threshold', threshold);
set_param([mdl_name, '/Constant'],'Value', up_out);
set_param([mdl_name, '/Constant1'],'Value', down_out);
autorouting = get(handles.checkbox1, 'value');
if isequal(autorouting, 0)
add_line(mdl_name,'In1/1','Switch/2');
add_line(mdl_name,'Switch/1','Out1/1');
add_line(mdl_name,'Constant/1','Switch/1');
add_line(mdl_name,'Constant1/1','Switch/3');
else
add_line(mdl_name,'In1/1','Switch/2','autorouting','on');
add_line(mdl_name,'Switch/1','Out1/1','autorouting','on');
add_line(mdl_name,'Constant/1','Switch/1','autorouting','on');
add_line(mdl_name,'Constant1/1','Switch/3','autorouting','on');
end
% --------------------------------------------------------------------
function Untitled_5_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
web('http://www.ilovematlab.cn/article-29-1.html');
% --------------------------------------------------------------------
function Untitled_4_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
bdclose all;
close(gcf);
% --------------------------------------------------------------------
function Untitled_7_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_8_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
web('http://weibo.com/u/2300570331');
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu1
if 3 == get(hObject,'Value')
set(handles.edit1, 'Enable', 'off', 'string','0');
else
set(handles.edit1, 'Enable', 'on');
end
% --- Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in checkbox1.
function checkbox1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox1


