Anh Nguyễn

nvtienanh.info

Điều khiển mô hình Simulink bằng Matlab GUI

2014-12-26 Anh Nguyễnnotes

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.

Điều khiển mô hình Simulink

Hình 1. Điều khiển mô hình Simulink bằng Matlab GUI.

Chỉnh sửa mô hình Simulink

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

Giao diện điều khiể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

Video hướng dẫn cụ thể