Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 163 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
163
Dung lượng
2,79 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO NGÀNH CNKT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI: THIẾT KẾ BỘ ĐIỂU KHIỂN CHỐNG DAO ĐỘNG TẢI CHO CẦU TRỤC GVHD : ThS.NGUYỄN TRẦN MINH NGUYỆT SVTH : ĐINH ĐỨC TRUNG MSSV : 13151111 SVTH : NGUYỄN VI CƯỜNG MSSV : 13124007 Khoá : 2013-2017 SKL005010 Tp Hồ Chí Minh, tháng 07/2017 TRƢỜNG ĐẠI HỌC SƢ PHẠM KỸ THUÂṬ THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƢƠNGG̣ CAO ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ BỘ ĐIỂU KHIỂN CHỐNG DAO ĐỘNG TẢI CHO CẦU TRỤC SVTH : ĐINH ĐỨC TRUNG MSSV : 13151111 NGUYỄN VI CƢỜNGMSSV : 13124007 Khoá : 2013 Ngành : Cơng nghệ kỹ thuật điều khiển và tự động hóa GVHD: ThS.NGUYỄN TRẦN MINH NGUYỆT Tp Hồ Chí Minh, tháng năm 2017 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tƣ ̣do – Hạnh phúc *** -Tp Hồ Chí Minh, ngày 24 tháng năm 2017 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Đinh Đức Trung MSSV: 13151111 Nguyễn Vi Cƣờng 13124007 Ngành: KT Điều khiển tự động hóa Lớp: 13151CLC Giảng viên hƣớng dẫn: ThS.Nguyễn Trần Minh Nguyệt ĐT: 0989638457 Tên đề tài: Nội dung thƣc̣ đề tài: Thi cơng mơ hình cầu trục mạch điện điều khiển Lập trình xử lý tín hiệu giao diện HMI Thiết kế điều khiển chống dao động Sản phẩm: Mơ hình cầu trục chƣơng trình điều khiển TRƢỞNG NGÀNH GIẢNG VIÊN HƢỚNG DẪN i CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tƣ ḍ o – Hạnh phúc *** ́ PHIÊU NHÂṆ XÉT CỦA GIÁO VIÊN HƢỚNG DẪN Họ tên sinh viên: MSSV: Ngành: Tên đề tài: Giáo viên hƣớng dẫn: NHÂṆ XÉT Về nội dung đề tài & khối lƣợng thƣc̣ hiện: Ƣu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằng chữ …………………………) Tp Hồ Chí Minh, ngày tháng năm 20… Giáo viên hƣớng dẫn (Ký & ghi rõ họ tên) ii CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tƣ ̣do – Hạnh phúc *** ́ PHIÊU NHÂṆ XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên sinh viên: MSSV: Ngành: Tên đề tài: Giáo viên phản biện : NHÂṆ XÉT Về nội dung đề tài & khối lƣợng thƣc̣ hiện: Ƣu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằng chữ …………………………) Tp Hồ Chí Minh, ngày tháng năm 20… Giáo viên hƣớng dẫn iii LỜI CẢM ƠN Nhóm khơng thể theo đuổi hồn thành đề tài luận văn tốt nghiệp vòng 16 tuần khơng có giúp đỡ ngƣời thân bạn bè xung quanh Do vậy, với trân trọng cảm kích, nhóm xin gửi lời cảm ơn đến thầy cơ, ngƣời thân gia đình bạn bè xung quanh chăm sóc, an ủi gặp trở ngại động viên nhóm để thực luận văn Lời cảm ơn đầu tiên, xin chân thành gửi đến Cô Nguyễn Trần Minh Nguyệt ngƣời tận tình hƣớng dẫn truyền đạt kiến thức giúp tơi hồn thành luận văn Điều quan trọng Th.S Nguyễn Trần Minh Nguyệt hƣớng nhóm tìm đƣợc đƣờng nghiên cứu thuật tốn có tính ứng dụng cao thực tiễn, phù hợp với sở thích niềm đam mê Bên cạnh đó, tơi xin chân thành gửi lời cảm ơn đến quý thầy cô môn Điều Khiển Tự Động: thầy Nguyễn Minh Tâm, cô Nguyễn Trần Minh Nguyệt, thầyNguyễn Tấn Đời,…đã cho nhóm kiến thức bổ ích quý giá trình học tập để ứng dụng vào nghiên cứu phát triển đề tài nhƣ ứng dụng vào công việc sau Tôi xin chân thành gửi lời cảm ơn đến tất bạn đại học khóa 2013 động viên, giúp đỡ, trao đổi kiến thức với suốt khóa học Cuối cùng, tơi xin chân thành cảm ơn quan tâm, hỗ trợ, tạo điều kiện động viên vật chất lẫn tinh thần thành viên gia đình suốt thời gian qua Tp.HCM, ngày 24 tháng 07 năm 2017 Nhóm thực đề tài Đinh Đức Trung Nguyễn Vi Cƣờng iv TÓM TẮT ĐỀ TÀI Hệ cầu trục đƣợc ứng dụng ngày rộng rãi để di chuyển container, hàng hóa có kích thƣớc lớn từ địa điểm đến địa điểm khác nhiều khu vực khác nhƣ: bến cảng, công trƣờng, kho hàng Trong trình hoạt động, chuyển động giàn xe nguyên nhân chính gây tƣợng lắc lƣ tải trọng, đặc biệt trình tăng tốc đầu hành trình giảm tốc cuối hành trình Việc dao động tải khơng gây khó khăn di chuyển tải tới vị trí mong muốn mà gây hƣ hỏng cho tải cấu chính cầu trục Là đối tƣợng có tính phi tuyến cao tƣơng đối không ổn định, phƣơng pháp điều khiển để giảm dao động xác định vị trícủa tải trọng vấn đề cấp thiết mặt lý luận nhƣ áp dụng vào thực tiễn Mơ hình tốn học đƣợc thiết lập dựa công thức EulerLagrange Hệ thống sử dụng tín hiệu vào cảm biến góc encoder động DC Sau tín hiệu vào đƣợc xử lý bằng board Arduino để trở thành đại lƣợng vật lý góc,vận tốc góc,vị trí,vận tốc.Đây thông số cần thiết cho khâu hồi tiếp.Bộ điều khiển theo thuật toán Fuzzy đƣợc thiết kế để thay đổi vị trí xe dầm theo vị trí đặt dựa giá trị vị trí vận tốc giàn xe Trong trình hoạt động,ngƣời sử dụng tùy chọn điều khiển Fuzzy, PID Fuzzy tuned PID để chống dao động dựa theo giá trị góc vận tốc góc.Kết đƣợc hiển thị qua giao diện Matlab GUI kiểm chứng qua thực nghiệm cho thấy hiệu thuật toán chống dao động khác v SUMMARY OF PROJECT Gantry crane systems have been increasingly used to move large containers and goods from one location to another in many places such as ports,warehouses.During operation, the movement of the platform is one of the main causes of the swaying of the load, especially the acceleration at the start position and the deceleration at the end position.The swaying of load not only makes it difficult to move the load to the desired position but also damage the load and the structure of the crane itself.As a highly nonlinear and relatively unstable object, a control approach to reduce oscillation is critical as well as practical.The mathematical model is based on the Euler-Lagrange formula.This system uses input signal of angle sensor and encoder of DC motor Then the input signals are processed by the Arduino board to become the physical quantities of angle, angular velocity, position, velocity These are the parameters required for the feedback stage Fuzzy Controller is designed to change the position of the trolley based on the position and velocity User can choose the Fuzzy, PID or Fuzzy tuned PID controller prevent oscillation based on angular and angular velocity values Results are displayed through the Matlab GUI interface ,which shows the effectiveness of different anti-oscillation controller vi MỤC LỤC NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP i ́ PHIÊU NHÂṆ XÉT CỦA GIÁO VIÊN HƢỚNG DẪN ii ́ PHIÊU NHÂṆ XÉT CỦA GIÁO VIÊN PHẢN BIỆN iii LỜI CẢM ƠN iv TÓM TẮT ĐỀ TÀI v SUMMARY OF PROJECT vi MỤC LỤC vii Danh mục hình ảnh x Danh mục bảng biểu xii DANH MỤC CÁC TỪ VIẾT TẮT xiii CHƢƠNG : TỔNG QUAN 1.1 Lời mở đầu 1.2 Mục tiêu đề tài 1.3 Phƣơng án thực 1.4 Giới hạn đề tài 1.5 Các phƣơng pháp nghiên cứu CHƢƠNG : CƠ SỞ LÝ THUYẾT 2.1 Mô tả hệ thống 2.2 Mơ hình hóa hệ thống 2.3 Lí thuyết PID 2.3.1 Thành phần Tỉ lệ (P) 2.3.2 Thành phần Tích phân (I) 10 2.3.3 Thành phần Vi phân (D) 10 2.4 Lý thuyết điều khiển mờ (Fuzzy Logic Control) .11 2.4.1 Định nghĩa tập mờ 11 2.4.2 Tính chất tập hợp mờ 14 2.4.3 Biến mờ biến ngôn ngữ 15 vii 2.4.4 Mệnh đề mờ mệnh đề hợp thành 16 2.4.5 Các luật hợp thành 17 2.4.6 Giải mờ 17 2.4.7 Hệ quy tắc mờ 19 2.4.8 Xây dựng điều khiển Fuzzy 20 2.5 Bộ điều khiển giám sát mờ (Fuzzy Tuned PD) 21 2.6 Các tiêu chuẩn đánh giá chất lƣợng hệ thống điều khiển 22 2.6.1 Thời gian đáp ứng ts (thời gian độ/settling time): 22 2.6.2 Độ vọt lố POT (Percent of Overshoot): 22 2.6.3 Sai số xác lập exl (steady-state error): 23 2.6.4 Tiêu chuẩn IAE (tích phân trị tuyệt đối sai số) .23 2.7 Giới thiệu I2C 24 2.8 Bộ lọc Kalman 25 2.8.1 Giới thiệu chung lọc Kalman 25 2.8.2 Tóm tắt lí thuyết lọc Kalman 26 CHƢƠNG : THIẾT KẾ MƠ HÌNH 29 3.1 Thiết kế phần cứng 29 3.2 Giới thiệu linh kiện 30 3.2.1 Arduino Mega 2560 30 3.2.2 Module GY- 521 32 3.2.3 Encoder 33 3.2.4 Động DC 35 3.2.5 Mạch cầu H - BTS7960 43A 35 3.2.6 Nguồn 24V 37 3.3 Thi cơng mơ hình 37 3.4 Phƣơng án thiết lập linh kiện lập trình xử lý tín hiệu .39 3.4.1 Xử lí liệu đọc từ cảm biến 39 3.4.2 Thuật toán đo tốc độ động 41 3.4.3 Điều khiển tốc độ chiều quay động DC 42 viii set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton17,'Enable','off'); % - Executes on button press in pushbutton16 function pushbutton16_Callback(hObject, eventdata, handles) % hObject handle to pushbutton16 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); ĐỒ ÁN TỐT NGHIỆP set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 75; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton16,'Enable','off'); % - Executes on button press in pushbutton15 function pushbutton15_Callback(hObject, eventdata, handles) % hObject handle to pushbutton15 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); ĐỒ ÁN TỐT NGHIỆP vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 65; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton15,'Enable','off'); % - Executes on button press in pushbutton14 function pushbutton14_Callback(hObject, eventdata, handles) % hObject handle to pushbutton14 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count global vitribatdau ĐỒ ÁN TỐT NGHIỆP global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 55; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton14,'Enable','off'); % - Executes on button press in pushbutton13 function pushbutton13_Callback(hObject, eventdata, handles) % hObject handle to pushbutton13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri ĐỒ ÁN TỐT NGHIỆP global index global giatri_tudong global count global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 45; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton13,'Enable','off'); % - Executes on button press in pushbutton12 function pushbutton12_Callback(hObject, eventdata, handles) ĐỒ ÁN TỐT NGHIỆP % hObject handle to pushbutton12 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 35; ĐỒ ÁN TỐT NGHIỆP set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton12,'Enable','off'); % - Executes on button press in pushbutton11 function pushbutton11_Callback(hObject, eventdata, handles) % hObject handle to pushbutton11 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; ĐỒ ÁN TỐT NGHIỆP set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 25; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton11,'Enable','off'); % - Executes on button press in pushbutton10 function pushbutton10_Callback(hObject, eventdata, handles) % hObject handle to pushbutton10 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; ĐỒ ÁN TỐT NGHIỆP goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 15; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton10,'Enable','off'); % - Executes on button press in pushbutton9 function pushbutton9_Callback(hObject, eventdata, handles) % hObject handle to pushbutton9 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global giatri_tudong global count ĐỒ ÁN TỐT NGHIỆP global vitribatdau global goctruoc global tonggoc global gocnghieng tonggoc=0; goctruoc=gocnghieng(index); vitribatdau=vitri(index); cla(handles.axes1,'reset'); cla(handles.axes3,'reset'); count=tic; set(handles.edit17, 'String', ''); set(handles.edit14, 'String', ''); set(handles.edit13, 'String', ''); set(handles.pushbutton7,'userdata',1); giatri_tudong = []; vitri_toi = 5; set(handles.pushbutton7,'Enable','off'); set(handles.pushbutton9,'Enable','off'); % - Executes on button press in pushbutton18 function pushbutton18_Callback(hObject, eventdata, handles) % hObject handle to pushbutton18 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ĐỒ ÁN TỐT NGHIỆP set(handles.pushbutton18,'userdata',1); set(handles.pushbutton19,'userdata',0); set(handles.pushbutton20,'userdata',0); set(handles.pushbutton22,'userdata',0); set(handles.pushbutton18,'BackgroundColor','blue'); set(handles.pushbutton19,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton20,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton22,'BackgroundColor',[0.94 0.94 0.94]); % - Executes on button press in pushbutton19 function pushbutton19_Callback(hObject, eventdata, handles) % hObject handle to pushbutton19 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global laymau set(handles.pushbutton19,'userdata',1); set(handles.pushbutton18,'userdata',0); set(handles.pushbutton20,'userdata',0); set(handles.pushbutton22,'userdata',0); laymau=[]; set(handles.pushbutton18,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton19,'BackgroundColor','blue'); set(handles.pushbutton20,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton22,'BackgroundColor',[0.94 0.94 0.94]); % - Executes on button press in pushbutton20 ĐỒ ÁN TỐT NGHIỆP function pushbutton20_Callback(hObject, eventdata, handles) % hObject handle to pushbutton20 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(handles.pushbutton20,'userdata',1); set(handles.pushbutton18,'userdata',0); set(handles.pushbutton19,'userdata',0); set(handles.pushbutton22,'userdata',0); set(handles.pushbutton18,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton19,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton22,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton20,'BackgroundColor','blue'); function edit21_Callback(hObject, eventdata, handles) % hObject handle to edit21 (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 edit21 as text % str2double(get(hObject,'String')) returns contents of edit21 as a double % - Executes during object creation, after setting all properties ĐỒ ÁN TỐT NGHIỆP function edit21_CreateFcn(hObject, eventdata, handles) % hObject handle to edit21 (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 % - Executes on button press in pushbutton21 function pushbutton21_Callback(hObject, eventdata, handles) % hObject handle to pushbutton21 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global vitri_toi global vitri global index global s fprintf(s,'%i',0+255); if get(handles.pushbutton7, 'userdata')==1 vitri_toi = vitri(index); end ĐỒ ÁN TỐT NGHIỆP % - Executes on button press in pushbutton22 function pushbutton22_Callback(hObject, eventdata, handles) % hObject handle to pushbutton22 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(handles.pushbutton20,'userdata',0); set(handles.pushbutton18,'userdata',0); set(handles.pushbutton19,'userdata',0); set(handles.pushbutton22,'userdata',1); set(handles.pushbutton18,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton19,'BackgroundColor',[0.94 0.94 0.94]); set(handles.pushbutton22,'BackgroundColor','blue'); set(handles.pushbutton20,'BackgroundColor',[0.94 0.94 0.94]); ĐỒ ÁN TỐT NGHIỆP ... chống dao động PD .66 Hình 5.8 Kết chạy - tải 300g – chống dao động Fuzzy Tuned PD 66 Hình 5.9 Kết chạy - tải 600g – không chống dao động 67 Hình 5.10 Kết chạy - tải 600g – chống dao động. .. PID, Fuzzy tuned PID cho hệ cầu trục, tự động hóa khả điều khiển vị trí xe dầm loại bỏ dao động tải trọng vận hành Bộ điều khiển chống dao động đƣợc áp dụng mơ hình cầu trục thực, thông qua... Hình 5.1 Kết chạy - khơng tải - không chống dao động 63 Hình 5.2 Kết chạy - khơng tải – chống dao động Fuzzy Logic 63 Hình 5.3 Kết chạy - không tải – chống dao động PD 64 Hình 5.4 Kết chạy