- Đăng vào
Điều khiển mô hình Simulink bằng Matlab GUI
Giới thiệu
Ờ phần trước: Hướng dẫn mô phỏng robot 2 bậc tự do bằng Matlab Simulink mình đã giới thiệu cách chuyển mô hình từ Solidworks sang Matlab Simulink bằng công cụ Simmechanics.
Tiếp theo hôm nay là phần 2 của bài hướng dẫn: Điều khiển mô hình Simulink bằng Matlab GUI. Từ mô hình đã có của robot 2 bậc tự do, chúng ta sẽ thiết kế giao diện, điều khiển actuator của từng khâu, đồng thời sẽ đọc cảm biến để hiển thị vị trí của từng khớp lên giao diện chương trình. Trong khi khớp chuyển động thì giá trị hiển thị cũng thay đổi tương ứng.
Hình 1. Điều khiển mô hình Simulink bằng Matlab GUI.
Chỉnh sửa mô hình Simulink
Hình 2. Chỉnh sửa mô hình Simulink.
So với mô hình ban đầu, chúng ta cần phải thêm một số khối để phục vụ cho việc kết nối với GUI và xử lý sự kiện.
Thiết kế giao diện
Hình 3. Giao diện điều khiển.
Giao diện điều khiển gồm các nút ấn điều khiển vị trí từng khâu và phẩn hiển thị vị trí hiện tại của khâu đó.
Chương trình xử lý sự kiện
localAddEventListener
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callback Function for adding an event listener to the gain block
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function eventhandle = localAddEventListener
eventhandle = add_exec_event_listener('Scara2dof/Sensor', ...
'PostOutputs', @localEventListener);
localEventListener
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callback Function for executing the event listener on the gain block
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function localEventListener(block, eventdata) %#ok
simData = block.OutputPort(1).Data;
apphandles = guidata(Panel) ;
apphandles.fbGoc1 = int16(simData(2));
apphandles.fbGoc2 = int16(simData(1));
set(apphandles.txtGoc1, 'String',num2str(apphandles.fbGoc1));
set(apphandles.txtGoc2, 'String',num2str(apphandles.fbGoc2));
drawnow;
btnTangkhau1_Callback
% --- Executes on button press in btnTangkhau1.
function btnTangkhau1_Callback(hObject, eventdata, handles)
% hObject handle to btnTangkhau1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
handles.Goc1 = handles.Goc1 + 10; % Moi lan tang 10 deg
set_param('Scara2dof/Actuator1','after', ...
num2str(handles.Goc1));
guidata(hObject,handles);
btnTangkhau2_Callback
function btnTangkhau2_Callback(hObject, eventdata, handles)
% hObject handle to btnTangkhau2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
handles.Goc2 = handles.Goc2 + 10; % Moi lan tang 10 deg
set_param('Scara2dof/Actuator2','after', ...
num2str(handles.Goc2));
guidata(hObject,handles);
btnGiamkhau1_Callback
function btnGiamkhau1_Callback(hObject, eventdata, handles)
% hObject handle to btnGiamkhau1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
handles.Goc1 = handles.Goc1 - 10; % Moi lan giam 10 deg
set_param('Scara2dof/Actuator1','after', ...
num2str(handles.Goc1));
guidata(hObject,handles);
btnGiamkhau2_Callback
function btnGiamkhau2_Callback(hObject, eventdata, handles)
% hObject handle to btnGiamkhau2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
handles.Goc2 = handles.Goc2 - 10; % Moi lan giam 10 deg
set_param('Scara2dof/Actuator2','after', ...
num2str(handles.Goc2));
guidata(hObject,handles);
btnStart_Callback
function btnStart_Callback(hObject, eventdata, handles)
% hObject handle to btnStart (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
modelName = 'Scara2dof';
handles.modelname = modelName;
handles.Goc1 = 0; % Bien goc khau 1
handles.Fbgoc1 = 0; % Feedback goc khau 1
handles.Goc2 = 0; % Bien goc khau 2
handles.Fbgoc2 = 0; % Feedback goc khau 2
% Load the simulink model
if ~modelIsLoaded(modelName)
load_system(modelName);
end
% Simulink may optimise your model by integrating all your blocks. To
% prevent this, you need to disable the Block Reduction in the Optimisation
% settings.
set_param(handles.modelname,'BlockReduction','off');
% set the stop time to inf
set_param(handles.modelname,'StopTime','inf');
% set the simulation mode to normal
set_param(handles.modelname,'SimulationMode','normal');
% When the model starts, call the localAddEventListener function
set_param(handles.modelname,'StartFcn','localAddEventListener');
% Start the model
set_param(handles.modelname, 'SimulationCommand', 'start');
set(hObject,'Enable','off');
set(handles.btnStop, 'Enable','on');
set(handles.txtStatus, 'String','START COMPLETE!');
guidata(hObject,handles);
btnStop_Callback
function btnStop_Callback(hObject, eventdata, handles)
% hObject handle to btnStop (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set_param(handles.modelname,'SimulationCommand','stop');
set_param(handles.modelname,'StopTime','10');
set_param(handles.modelname,'StartFcn','');
set(hObject,'Enable','off');
set(handles.btnStart,'Enable','on');
set_param('Scara2dof/Actuator1','after','0');
set_param('Scara2dof/Actuator2','after','0');
guidata(hObject,handles);
try
catch ME
% Get rid of the figure if it was created
if exist('hf','var') && ~isempty(hf) && ishandle(hf)
delete(hf);
end
% Get rid of the model if it was loaded
bdclose(all);
end