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