Điều khiển tay máy ba bậc tự do dùng thị giác máy tính

MỤC LỤC GIỚI THIỆU: 1. Nhận xét của giáo viên hướng dẫn. 2. Nhận xét của giáo viên phản biện. 3. Mục lục. PHẦN A: MỞ ĐẦU 1 PHẦN B: NỘI DUNG 3 Chương 1: Cở sở lý thuyết . 4. 1.1 Lý thuyết PLC S7-200 . 4 1.1.1 Giới thiệu PLC S7-200 4 1.1.2 Bộ nhớ PLC S7-200 . 6 1.1.3 Bộ điều rộng xung (PTO/PWM) . 7 1.1.4 Bộ đếm xung tốc độ cao 11 1.2 Tổng quan về Robot 18 1.2.1 Lịch sử phát triển 18 1.2.2 Hệ thống Robot 20 1.2.3 Phân loại Robot 20 1.2.4 Các khái niệm cơ bản . 22 1.3 Khảo sát tay máy 3 bậc tự do 29 1.3.1 Quy tắc Denavit-Hartenberg 29 1.3.2 Động học và động lực học thuận 30 1.3.3 Động học ngược . 39 1.4 Ứng dụng MATLAB 41 1.4.1 Xử lý ảnh trong MATLAB 41 1.4.2 OPC Toolbox . 50 1.5 Sơ lược các bộ truyền động 55 1.5.1 Bộ truyền động bánh răng thẳng . 55 1.5.2 Bộ truyền động bánh vít 56 1.6 Động cơ DC 57 1.6.1 Cấu tạo 57 1.6.2 Nguyên tắc hoạt động 58 1.6.3 Các phương pháp điều khiển . 58 1.7 Rotary Encoder . 59 1.7.1 Cấu tạo . 59 1.7.2 Nguyên tắc hoạt động 60 1.8 Van khí nén . 61 1.9 Xi lanh khí nén . 62 Chương 2: Thiết kế và thi công phần cứng 63 2.1 Thiết kế mạch . 63 2.1.1 Mạch nguồn 63 2.1.2 Mạch chuyển đổi áp . 64 2.1.3 Mạch công suất . 64 2.1.4 Mạch đảo chiều động cơ 65 2.1.5 Mạch lấy tín hiệu xung Encoder . 65 2.1.6 Relay đóng mở van khí 66 2.2 Thông số khâu, khớp của tay máy 68 2.2.1 Thông số khâu 68 2.2.2 Góc ban đầu 68 2.2.3 Thông số encoder . 68 2.2.4 Cách tính xung từ góc của khớp . 68 2.3 Thi công 69 2.3.1 Mạch điều khiển . 69 2.3.2 Hộp điều khiển . 70 2.3.3 Không gian làm việc 70 2.3.4 Tay máy . 71 Chương 3: Xây dựng phần mềm 72 3.1 Lưu đồ giải thuật cho toàn hệ thống . 72 3.2 Lưu đồ giải thuật cho xử lý ảnh 73 3.3 Lưu đồ giải thuật cho chương trình PLC 74 3.3.1 Lưu đồ giải thuật cho chương trình chính 74 3.3.2 Lưu đồ giải thuật cho chương trình con . 75 3.4 Giao diện điều khiển bằng MATLAB 77 PHẦN C: ĐÁNH GIÁ VÀ KẾT LUẬN . 78 Phụ lục . 80 Tài liệu tham khảo . 110 T rong thời đại ngày nay, ngành công nghiệp đóng vai trò quan trọng trong nền kinh tế. Từ những ngành như sản xuất, chế biến lương thực thực phẩm, nước uống cho đến các ngành công nghệ chế tạo máy, công nghệ chế tạo ôtô, các ngành công nghệ cao v.v Tất cả những ngành đó có được hiệu quả kinh tế cao không ít nhờ vào các hệ thống sản xuất tự động, những Robot tự động, những tay máy công nghiệp, chúng đã thay thế sức lao động con người một cách hiệu quả nhất. Robot được sử dụng rộng rãi từ những nơi mà môi trường có tính độc hại, nguy hiểm, độ chính xác cao trong công nghiệp cho đến các công việc hằng ngày. Do vậy Robot có tầm quan trọng rất lớn và là một trong những lĩnh vực nghiên cứu hàng đầu trong thời đại ngày nay. Là sinh viên chuyên ngành điện tử tự động, để bổ sung những kiến thức đã học cũng như nghiên cứu những vấn đề mới trong lĩnh vực điều khiển nên chúng em quyết định chọn đề tài “Điều khiển tay máy 3 bậc tự do dùng thị giác máy tính”. Thông qua luận văn chúng em sẽ khảo sát, nghiên cứu và điều khiển tay máy 3 bậc tự do để gắp vật cố định trên mặt phẳng nhờ sự trợ giúp bởi Camera xác định tọa độ vật. Để điều khiển tay máy có thể dùng vi xử lý, vi điều khiển hoặc PLC kết hợp với mạch công suất, mạch cảm biến . Song thực tế cho thấy nếu xử lý ảnh dùng Camera số bằng vi điều khiển hoặc PLC thì rất khó thực hiện, tốc độ xử ảnh chậm và giá thành cao. Chúng em đã chọn phương pháp dùng máy tính để xử lý ảnh và điều khiển tay máy thông qua PLC. Mọi việc dễ dàng hơn nhiều và MATLAB trở thành phần mềm hữu hiệu để thực hiện theo cách trên. MATLAB tích hợp nhiều công cụ cho nhiều lĩnh vực trong đó có hai Toolbox cần thiết là: Image Processing Toolbox cho việc xử lý ảnh và OPC Toolbox cho việc kết nối PLC. Mặc dù đã cố gắng hoàn thành luận văn đúng thời hạn nhưng trong quá trình thực hiện không tránh khỏi những thiếu sót. Chúng em rất mong nhận được sự đóng góp ý kiến từ quý Thầy cô và các bạn để đề tài của chúng em ngày càng hoàn thiện hơn.

doc111 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2957 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Điều khiển tay máy ba bậc tự do dùng thị giác máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
atlab OPC Client chúng ta cần phải chọn Server, sau đó click chuột phải vào menu Create Client. Kết quả như hình dưới đây: Để tương tác với PLC thông qua các biến, trước hết ta phải tạo trong PC Access các biến cần sử dụng. Sau đó OPC Toolbox sẽ liên kết các biến đó thông qua PC Access. Các biến đã được Add vào Client thì có thể truy cập với bit nhớ, ô nhớ hay thanh ghi trong PLC. Ta có thể ghi, đọc hoặc thu thập dữ liệu thông qua các biến đó. Tuy nhiên thông thường các chương trình điều khiển bằng MATLAB đều có giao diện để giao tiếp dễ dàng. Các giao diện này có thể tạo bằng M – file hoặc GUI của MATLAB. Do vậy ta vẫn có thể sử dụng OPC Toolbox thông qua các hàm đặc trưng, các biến trong MATLAB điều có thể tương tác với các biến trong OPC Toolbox. Việc này giúp cho việc tạo giao diện điều khiển thiết bị dùng PLC bằng MTALAB trở nên dễ dàng. Các hàm cơ bản của OPC Toolbox : * Tạo một Object kết nối với Server Object name = opcda( ‘locallhost’, ‘OPC Client Name’) VD: da = opcda(‘locallhost’, ‘S7200.OPCServer’) * Kết nối với Server: Connect( Object name) VD: Connect(da) * Ngừng kết nối với server: Disconnect( Object name) VD: Disconnect( da) * Tạo một nhóm để quản lý các biến: grp1 =addgroup( Object name) VD: grp1 =addgroup(da) * Tạo biến trong một nhóm : Tên biến = additm( Group name, ‘biến truy cập trên Server’) VD: itm1 = additm(grp1,McroWin.s7200.Start) * Xóa một Object: Delete ( object name) VD: Delete ( da) * Lưu một Object vào Workspace của Matlab: Save myopc “Oblect name” * Tải lên một Object: Load myopc * Ghi dữ liệu vào một biến: Write ( tên biến, giá trị của biến) * Đọc dữ liệu một biến: Read ( tên biến) * Ghi dữ liệu vào một biến: Writeasync ( tên biến, giá trị của biến) * Đọc dữ liệu bất đồng bộ một biến: Readasync ( tên biến) 1.5 Sơ lược các bộ truyền động: 1.5.1 Bộ truyền động bánh răng: 1.5.1.1 Công dụng: Bộ truyền bánh răng thẳng dùng để truyền chuyển động quay giữa hai trục song song. Qua bộ truyền bánh răng thẳng momen quay của trục tác động sẽ được tăng lên hoặc giảm xuống tùy thuộc vào tỷ số truyền của bánh răng. Hình 1.27: Bộ truyền động bánh răng. 1.5.1.2 Ưu điểm – Nhược điểm: Ưu điểm: - Kích thước nhỏ, khả năng tải lớn. - Tỷ số truyền không đổi do hiện tượng trơn trợt. - Hiệu suất cao có thể đạt 0,97 đến 0,99. - Làm việc với vận tốc lớn. - Tuổi thọ cao. Nhược điểm: - Chế tạo tương đối phức tạp. - Đòi hỏi độ chính xác cao. - Phát ra nhiều tiếng ồn khi hoạt động. 1.5.1.3 Tỷ số truyền: Trong hệ thống truyền động dùng bánh răng thì tỷ số truyền của bộ bánh răng là quan trọng nhất vì nó quyết định đến tốc độ quay, momen quay của bánh răng thứ cấp. Sau đây là công thức tính tỷ số truyền: Trong đó: n1,n2 là tốc độ của bánh răng 1 và 2. z1,z2 là số răng của bánh răng 1 và 2. 1.5.2 Bộ truyền động trục vít bánh vít: 1.5.2.1 Công dụng: Bộ truyền trục vít – bánh vít gọi tắt là bộ truyền trục vít được xếp vào loại răng và vít. Bộ truyền trục vít dùng để truyền chuyển động và công suất cho hai trục chéo nhau. Thông thường hai trục lệch nhau 900. Đặc điểm quan trọng là bộ truyền trục vít có khả năng tự hãm. Bánh vít Trục vít Hình 1.28: Bộ truyền động trục vít – bánh vít. Phân loại trục vít theo dạng mặt chia có hai loại: trục vít trụ ( mặt chia trục vít là mặt trụ) và trục vít Globoid (mặt chia lõm). Phân loại theo trục ren thì chia thành 3 loại: trục vít Archimede, trục vít Convolute và trục vít thân khai. Đối với bộ truyền trục vít truyền động thì số mối ren z = 1,2,4. Số mối ren càng ít thì khả năng tự hãm càng cao. 1.5.2.2 Ưu điểm – Nhược điểm: Ưu điểm: tỷ số truyền lớn, làm việc êm, không ồn, có khả năng tự hãm và có chính xác động học cao. Nhược điểm: - Hiệu suất thấp, sinh nhiệt nhiều do vận tốc trược lớn. - Vật liệu chế tạo bánh vít làm bằng kim loại màu nên đắt tiền. - Phát ra nhiều tiếng ồn khi hoạt động. 1.5..2.3 Tỷ số truyền: Khi trục vít quay một vòng thì bánh vít sẽ quay một góc bằng z1 lần của góc 2π/z2. Để bánh vít quay một vòng thì trục vít phải quay 2π/(2πz1/z2) = z2/z1 vòng, nên: Với: z1: số đầu mối của trục vít. z2 : số răng của bánh vít. 1.6 Động cơ DC: 1.6.1 Cấu tạo: Động cơ DC là động cơ điện hoạt động với dòng điện một chiều. Động cơ điện DC ứng dụng rộng rãi trong đời sống cũng như công nghiệp bởi lý do dễ điều khiển, hiệu suất cao, “momen” lớn. Trong công nghiệp, động cơ điện một chiều được sử dụng ở những nơi yêu cầu “momen” mở máy lớn hoặc yêu cầu thay đổi tốc độ trong phạm vi rộng. Hình 1.29: Động cơ DC Một động cơ DC có 6 phần cơ bản: 1. Phần ứng hay Rotor (Armature). 2. Cổ góp (Commutat). 3. Nam châm tạo từ trường hay Stator (field magnet). 4. Chổi than (Brushes). 5. Trục motor (Axle). 6. Bộ phận cung cấp dòng điện DC. 1.6.2 Nguyên tắc hoạt động: Hình dưới mô tả nguyên tắc hoạt động của động cơ DC. Dòng điện chạy qua khung dây sinh ra từ trường. Theo nguyên tắc bàn tay trái lực từ làm cho khung dây quay một góc 900. Khi roto quay được một góc 900 thì lực từ không còn tác dụng là “momen” quay nữa, nhưng do quán tính làm cho roto quay thêm một góc nhỏ nữa. Roto liên tục và đúng chiều là do bộ cổ góp điện sẽ làm chuyển mạch dòng điện sau mỗi vị trí ứng với 1/2 chu kỳ. Trong các máy điện một chiều lớn, người ta có nhiều cuộn dây nối ra nhiều phiến góp khác nhau trên cổ góp. Nhờ vậy dòng điện và lực quay được liên tục và hầu như không bị thay đổi theo các vị trí khác nhau của Roto. Hình 1.29: Nguyên lý hoạt động của đông cơ DC 1.6.3 Các phương pháp điều khiển: Có nhiều cácnh để điều khiển tốc độ động cơ DC như bằng phương pháp thay đổi điện áp, thay đổi từ thông hoặc phương pháp điều chỉnh độ rộng xung (PWM). Trong cánh tay máy thì chúng em chọn phương pháp điều khiển bằng cách thay đổi độ rộng xung. Chọn phương pháp này vì chúng dễ thực hiện, mạch cấu tạo đơn giản. Vhi Vlo b a t Hình 1.30: Điều khiển động cơ bằng PWM Khi tỷ lệ thời gian "on" trên thời gian "off" thay đổi sẽ làm thay đổi điện áp trung bình (VAVG). Tỷ lệ phần trăm thời gian "on" trong một chu kỳ chuyển mạch nhân với điện áp cấp nguồn sẽ cho điện áp trung bình đặt vào động cơ. Như vậy với điện áp nguồn cung cấp là 100V, và tỷ lệ thời gian ON là 25% thì điện áp trung bình là 25V. VAV thay đổi từ VL đến VH tùy theo các độ rộng Ton và Toff 1.7 Rotary Encoder: 1.7.1 Cấu tạo: Một Encoder thông thường gồm 1 hay nhiều bộ phát và thu nhận ánh sáng. Phần thu thường là photodiotde hoặc phototransistor, một đĩa chắn quang có khoét lỗ gắn trên trục quay đặt giữa bộ phát và thu, thông thường trục quay này sẽ được gắn với trục quay của đối tượng cần đo tốc độ. Encoder thường có các dây sau: – Dây cấp nguồn cho encoder, thường là +5V DC. – Dây nối đất (GND). – Dây pha A – tín hiệu ra theo độ phân giải. – Dây pha B – tín hiệu ra theo độ phân giải. Hai pha A và B lệch pha nhau 1 góc 90 độ. Do đó có thể xác định chiều quay của Encoder thông sự trễ sớm pha của hai pha lẫn nhau Hình 1.31: Cấu tạo cơ bản của Encoder. 1.7.2 Nguyên tắc hoạt động: Nguyên tắc hoạt động của Encoder dựa vào tín hiệu có hoặc không của ánh sáng tại phần thu (phototransistor). Khi Encoder quay, ánh sáng luân phiên chiếu qua các rãnh trên đĩa Encoder. Khi ánh sáng qua rãnh, phototransistor được tích cực, khi đến vị trí bị chắn ánh sáng phototransistor thụ động trở lại. Quá trình này tạo ra xung tại chân ra của phototransistor. Xung này chưa vuông, người ta phải thông qua mạch nắn tạo ra xung vuông như ý muốn. Hai pha A và B đặt lệch nhau 90 độ. Khi quay theo chiều này thì pha A sớm pha hơn pha B. Nhưng khi quay chiều ngược lại thì pha B sớm hơn pha A. Thông qua sự sớm và trễ pha ta có thể xác định chiều quay của Enocder. A B 900 * Trường hợp quay thuận: pha B sớm pha hơn pha A A B *Trường hợp quay nghịch: pha A sớm pha hơn pha B A B 1.8 Van khí nén: Van khí nén dùng trong tay máy có nhiệm vụ thay đổi dòng khí vào xi lanh của tay kẹp. Van sử dụng là van đảo chiều. Có nhiều loại van đảo chiều như: van 2/2, van 3/2, van 4/2, van 5/2, 4/3, van 5/3. Tuy nhiên do cơ cấu xi lanh tay kẹp đơn giản nên chúng em dùng van đảo chiều 5/2. Trong loại van này thì cửa P là cửa cung cấp năng lượng, cửa A lắp vào bên trái của cơ cấu chấp hành, cửa B lắp vào bên phải của cơ cấu chấp hành. Cửa T và cửa R là cửa xả năng lượng. Khi con trược van di chuyển qua cửa phải, cửa P thông với cửa A, cửa B thông với cửa T. Khi con trược di chuyển qua cửa trái, cửa P thông với cửa B, cửa A thông với cửa R. Hình 1.32 : Cấu tạo van đảo chiều 5/2. Hình 1.33: Van đảo chiều trong thực tế. 1.9 Xi lanh khí nén: Xi lanh dùng trong tay kẹp là loại xi lanh 2 chiều. Cấu tạo của xi lanh 2 chiều được thể hiện như hình dưới: Hình 1.34: Cấu tạo và nguyên tắc hoạt động của xi lanh hai chiều. Nguyên tắc hoạt động của xi lanh 2 chiều: - Không cho khí vào xi lanh thì pitton có thể ở vị trí bất kỳ. - Khí vào 1 ra 2: pitton bị đẩy ra. - Khí vào 2 ra 1: pitton bị đẩy vào. Hình1.10 : Xi lanh 2 chiều trong thực tế CHƯƠNG 2: THIẾT KẾ VÀ THI CÔNG PHẦN CỨNG 2.1 Thiết kế mạch: 2.1.1 Mạch nguồn: Khối nguồn phải đáp ứng các yêu cầu sau: - 5V cấp cho encoder hoạt động với điện áp DC ổn định. - 12V cấp cho việc khiển relay và bộ phận kích dẫn FET(IRF540) để khiển motor hoạt động. - 24V cấp nguồn cho PLC và cấp cho động cơ, van khí. Sơ đồ nguyên lí của khối nguồn: Hình 2.1: Sơ đồ nguyên lý mạch nguồn. Trong đó: J1 là ngõ vào 24V (DC). J2, J3 là các ngõ ra. J2 là ngõ ra áp 12V và 24V. J3 là ngõ ra áp 12V và 5V(VCC). 2.1.2 Mạch chuyển đổi điện áp : PLC hoạt động ở điện áp 24V DC nhưng mạch công suất hoạt động ở 12V DC và Encoder đọc tín hiệu xung hoạt động ở 5V DC. DO vậy để giao tiếp giữa chúng với nhau cần phải có mạch chuyển áp. Linh kiện cơ bản của mạch là Opto quang. Sơ đồ nguyên lí: Hình 2.2 : Sơ đồ mạch chuyển áp. 2.1.3 Mạch công suất: Hình 2.3: Sơ đồ mạch công suất. Đây là một phần mạch công suất tiếp nhận tín hiệu từ PLC để khiển motor. Có thể hoạt động theo ON/OFF hoặc điều xung. Đảo chiều động cơ nhờ role. Chế độ ON/OFF: khi PLC cấp 24V ở PWM1 thì opto dẫn làm cho P1 là 12Và D468 dẫnà tín hiệu IRF1 là 12V làm cho IRF540 dẫn và ngõ ra motor có áp là 24V. 24V 0 Ton Toff T Chế độ điều xung: xung ngõ ra PLC đưa vào tín hiệu PWM1: Xung ngõ ra ở tín hiệu P1: 12V 0 Xung ngõ ra ở motor: 24V 0 2.1.4 Mạch đảo chiều động cơ: Cấu tạo bên trong của ULN 2803: ULN2803 được cấu tạo bên trong giống như một transistor NPN darlington có Emiter nối GND, Colector là ngõ ra, và Base là ngõ vào. Chỉ có tác dụng đảo mức 1 thành 0. Còn muốn đảo mức 0 thành 1 thì phải có điện trở kéo lên bên ngoài. Hình 2.4: Cấu tạo ULN 2803 Khi PLC cấp 24V vào tín hiệu ROLE1, opto sẽ dẫnà tín hiệu RL1 là 12V, qua ULN2803 đảo thành 0V, làm role dẫn, và điện áp của động cơ sẽ được đảo ngược à động cơ đảo chiều. 2.1.5 Mạch lấy tín hiệu xung từ encoder đưa vào PLC: Sơ đồ mạch: Hình 2.5: Sơ đồ mạch lấy tín hiệu xung Encoder. Vì encoder có áp sử dụng là 5V, nên ngõ ra là tín hiệu xung 5V. Ta dùng opto để chuyển tín hiệu xung 5V của encoder thành tín hiệu xung 24V cấp cho PLC. Khi xung encoder mức 0(0V) làm cho opto dẫn, và tín hiệu EN1 ngõ ra là 24V, và ngược lại khi xung encoder mức 1(5V) thì opto không dẫn, EN1 sẽ là 0V. EN1 là tín hiệu đưa vào PLC. 2.1.6 Relay đóng mở van khí: Công tắc van khí sử dụng áp là 24V. Nên ta dùng một role để khiển. Khi role đóng tác động van khí và tay kẹp sẽ gắp vật, còn khi role không dẫn tác động van khí và tay kẹp sẽ nhả vật. Tóm tắt kết nối phần cứng: Kết nối từ PLC đến encoder, mạch công suất: J2, J3, J5, J6 là các jumper 4 kết nối tới các encoder. Và J7 là ngõ ra sau khi chuyển đổi tín hiệu xung 5V của encoder thành 24V nhờ opto và đưa vào PLC theo các chân: I0.0, I0.1 cho HSC0 encoder của khâu đế I0.3, I0.4 cho HSC4 encoder của khâu 1 I0.6, I0.7 cho HSC1 encoder của khâu 2 I1.2, I1.3 cho HSC2 encoder của khâu 3( mở rộng cho cánh tay 4 khâu). J4 là jumper 10 kết nối tới ngõ ra của PLC. Lần lượt là: PWM1 chân Q0.0 PWM2 chân Q0.1 PWM3 chân Q0.2 PWM4 chân Q0.3 ROLE1 chân Q0.4 ROLE2 chân Q0.5 ROLE3 chân Q0.6 ROLE4 chân Q0.7 VAN chân Q1.0 J8 là jumper 10 kết nối tới mạch công suất để khiển motor và van khí. 2.2 Thông số khâu, khớp của tay máy 2.2.1 Thông số tay máy: Khâu 1: L1 = 12.5 cm Khâu 2: L2 = 20 cm Khâu 3: L3 = 33 cm 2.2.2 Góc ban đầu của các khâu: Góc 1 : 0 độ Góc 2 : 178 độ Góc 3 : 27 độ 2.2.3 Thông số xung encoder của các khớp: Encoder khớp 1 : 200 xung Encoder khớp 2 : 100 xung Encoder khớp 3 : 100 xung 2.2.4 Cách tính xung từ các góc của khớp: Vì PLC sử dụng đếm counter ở chế độ 4x nên encoder 200 xung sẽ trở thành encoder 800 xung. Ta có: 800 xung ứng với 360 độ. Nên khi có góc thì ứng với số xung là: số xung = Tương tự với encoder 100 xung thì: số xung = 2.3 Thi công: 2.3.1 Mạch điều khiển: Hình 2.6: Layout mạch điều khiển. Hình 2.7: Mạch điều khiển. 2.3.2 Hộp điều khiển: Hình 2.7:Hộp điều khiển. 2.3.3 Không gian làm việc: Hình 2.8 : Không gian làm việc của tay máy. 2.3.4 Tay máy: Hình 2.9 : Hình tay máy. CHƯƠNG 3: XÂY DỰNG PHẦN MỀM. 3.1 Lưu đồ giải thuật cho toàn hệ thống: START Xác định tâm của vật cần gắp. Xác định tọa độ của vật trong hệ quy chiếu. Giải động học ngược Truyền dữ liệu cho PLC Thực hiện gắp vật Thực hiện đặt vật Trở về vị trí ban đầu END 3.2 Lưu đồ giải thuật cho xử lý ảnh: START Lấy ảnh từ Camera Chuyển từ ảnh màu sang ảnh xám Loại bỏ những điểm trắng nhỏ Chuyển từ ảnh xám sang ảnh nhị phân Lấp đầy lỗ trống Lấy biên vật. Lấy tâm vật dựa vào biên đã xác định. RUN = 1? END Y N Hiển thị kết quả. Chương trình xử lý ảnh dùng để tìm tâm vật cần gắp, từ đó lấy tọa độ tâm của vật cần gắp trong khung ảnh. Sau khi lấy tọa độ tâm vật ta chuyển tọa độ đó thành tọa độ so với tay máy. 3.3 Lưu đồ giải thuật cho chương trình PLC: 3.3.1 Lưu đồ giải thuật cho chương trình chính: START KHỞI TẠO COUNTER KHỞI TẠO ĐIỂU XUNG NẠP GIÁ TRỊ BAN ĐẦU CHO BIẾN,BIT LOAD GIÁ TRỊ ĐIỀU XUNG LẤY GIÁ TRỊ COUNTER CHUYỂN ĐỔI CÁC GIÁ TRỊ START=1? Y N MANUAL=0? Y N ĐIỀU KHIỂN BẰNG TAY END CONTROL=10? Y RESET COUNTER CONTROL=11? N Y VITRI_BANDAU N CHẠY GẮP VẬT 3.3.2 Lưu đồ giải thuật cho chương trình con 3.3.2.1 Chương trình con quay về vị trí ban đầu: START CÔNG TẮC 1=1? + - TẮT MOTOR1, ROLE1 BẬT MOTOR1, ROLE1 CÔNG TẮC 2=1? + - TẮT MOTOR2, ROLE2 BẬT MOTOR2, ROLE2 CÔNG TẮC 3=1? + - TẮT MOTOR3, ROLE3 BẬT MOTOR3, ROLE3 END 3.3.2.2 Chương trình con khởi tạo Motor: START KHỞI TẠO ĐIỀU XUNG Q0.0 KHỞI TẠO ĐIỀU XUNG Q0.1 END 3.3.2.3 Chương trình con Reset các Byte sử dụng: START END CHO CÁC BYTE LƯU GIÁ TRỊ HSC =0. CHO CÁC BYTE LƯU GIÁ TRỊ GẮP VẬT CỦA KHÂU 1,2,3 =0. CHO CÁC BYTE LƯU GIÁ TRỊ ĐẬT VẬT CỦA KHÂU 1,2,3 =0. CHO CÁC BYTE LƯU GIÁ TRỊ NĂNG =0. CHO CÁC BYTE LƯU GIÁ TRỊ ĐIỀU KHIỂN =0. 3.3.2.4 Chương trình con reset Counter: START END KHỞI TẠO LẠI COUNTER 1 (ĐẾM ENCODER KHÂU 3) KHỞI TẠO LẠI COUNTER 4 (ĐẾM ENCODER KHÂU 2) KHỞI TẠO LẠI COUNTER 0 (ĐẾM ENCODER KHÂU 1) 3.3.2.5 Chương trình con dừng Motor: START END XÓA BIT MOTOR, RELAY XÓA BIT CHẠY TRONG CHƯƠNG TRÌNH XÓA BIT ĐIỀU XUNG 3.4 Giao diện điều khiển bằng MATLAB: PHẦN C 1. Đánh giá: - Luận văn hoàn thành đúng thời hạn và đạt được yêu cầu đặt ra. - Thi công phần cứng gọn gàng, mạch hoạt động ổn định đáp ứng yêu cầu của luận văn. Khi tay máy hoạt động mặc dù vấn đề điều khiển vẫn chưa thực sự tối ưu nhưng tay máy vẫn gắp được vật. 2. Kết luận: Đề tài này không phải là một đề tài dễ, vì có nhiều bài toán cần phải giải quyết trong một thời gian ngắn. Với kết quả đạt được thì có thể xem như cơ bản giải quyết các vấn đề cốt lõi, nhưng cần phát triển hơn nữa. Sau khi hoàn thành luận văn, chúng em đã học tập được rất nhiều nhiều kiến thức về PLC, lý thuyết về tay máy robot, về xử lý ảnh v.v… Chúng sẽ là hành trang quý báu cho chúng em ra trường và công việc sau nay. 3. Hướng phát triển đề tài: Mặc dù luận văn hoàn thành mục tiêu đề ra nhưng để ứng dụng thực tế thì còn khoảng cách rất lớn, do vậy cần phải phát triển các vấn đề sau: - Điều khiển tối ưu lộ trình của tay máy. - Sử dụng cảm biến góc với độ phân giải cao hơn và kết cấu cơ khí tốt hơn để táy máy khi hoạt động ít bị sai số góc. - Thiết kế và điều khiển tay máy với số bậc tự do lớn 3 bậc, bởi vì với 3 bậc tự do tay máy không đáp ứng được yêu cầu thực tế cho nhiều ứng dụng. - Xử lý ảnh cần phải tốt hơn, loại bỏ được nhiễu do ánh sáng và màu nền gây ra. PHỤ LỤC 1. Code chương trình MATLAB: function varargout = arm(varargin) % ARM M-file for arm.fig % ARM, by itself, creates a new ARM or raises the existing % singleton*. % % H = ARM returns the handle to a new ARM or the handle to % the existing singleton*. % % ARM('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in ARM.M with the given input arguments. % % ARM('Property','Value',...) creates a new ARM or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before arm_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to arm_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 arm % Last Modified by GUIDE v2.5 08-Jul-2009 19:01:33 % Begin initialization code - DO NOT EDIT gui_Singleton = 1;0 gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @arm_OpeningFcn, ... 'gui_OutputFcn', @arm_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 arm is made visible. function arm_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 arm (see VARARGIN) % Choose default command line output for arm handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes arm wait for user response (see UIRESUME) % uiwait(handles.figure1); global val_bright run isconnect l1 l2 l3 x_cen y_cen global goc1 goc2 goc3 tam1 tam2 tam3 byte_control global chieu1 byte_cao_ic1 byte_thap_ic1 global chieu2 byte_cao_ic2 byte_thap_ic2 global chieu3 byte_cao_ic3 byte_thap_ic3 global byte_1 byte_2 byte_3 bit_manual set(handles.Brightness,'Value',0.3); set(handles.Threshold,'Value', 0.7); val_bright = get(handles.Brightness,'Value'); set(handles.axes1,'Visible','off'); run = 1 ; isconnect = 0 l1=13 l2=20 l3=34 goc1=0 goc2=180 goc3=90 tam1=0; tam2=0; tam3=0; bit_manual=0; byte_control=1; byte_1=0 byte_2=0 byte_3=0 chieu1=0; byte_cao_ic1=0; byte_thap_ic1=0; %--------------- chieu2=0; byte_cao_ic2=0; byte_thap_ic2=0; %--------------- chieu3=0; byte_cao_ic3=0; byte_thap_ic3=0; %--------------- %save data ; % --- Outputs from this function are returned to the command line. function varargout = arm_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 stringPopup = get_stringPopup(hObject,handles) val = get(hObject,'Value'); string_list = get(hObject,'String'); stringPopup = string_list{val}; % convert from cell array % to string % Function to function doublePopup = get_doublePopup(hObject,handles) val = get(hObject,'Value'); string_list = get(hObject,'String'); selected_string = string_list{val}; % convert from cell array % to string doublePopup = str2double(selected_string); % --- Executes on button press in button_ClearTX. function Brightness_Callback(hObject, eventdata, handles) global val_bright; val_bright = get(handles.Brightness,'Value'); % --- Executes during object creation, after setting all properties. function Brightness_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end % --- Executes on slider movement. function Threshold_Callback(hObject, eventdata, handles) function Threshold_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end function Start_camera_Callback(hObject, eventdata, handles) global val_bright vidobj run x_cen y_cen vidobj = videoinput('winvideo'); preview(vidobj); triggerconfig(vidobj, 'manual'); x = 1; while (run == 1 ) rad =0; len =0; rai =0; radi =0; RGB = getsnapshot(vidobj); I = rgb2gray(RGB); bw = im2bw(I,val_bright); bw = bwareaopen(bw,200); se = strel('disk',1); bw = imclose(bw,se); bw = imfill(bw,'holes'); [B,L] = bwboundaries(bw,'noholes'); imshow(label2rgb(L, @jet, [.5 .5 .5])) hold on; for k = 1:length(B) boundary = B{k}; plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2) %x=length(B); end ; stats = regionprops(L,'Area','Centroid'); %center_obj = stats.Centroid; for k = 1:length(B) boundary = B{k}; delta_sq = diff(boundary).^2; perimeter = sum(sqrt(sum(delta_sq,2))); area = stats(k).Area; metric = 4*pi*area/perimeter^2; if metric > 0.7 imshow(RGB); centroid = stats(k).Centroid; plot(centroid(1),centroid(2),'ok','LineWidth',1,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',5); len =length(boundary); for count = 1:len rad(count) = sqrt((boundary(count,1)-centroid(2))^2 + (boundary(count,2)-centroid(1))^2); end ; rai =sum(rad ); radi=rai/len; % set(txt5,'String',radi); plot(boundary(:,2),boundary(:,1),'g','LineWidth',2); %rad_string = sprintf('%2.2f',radi); %metric_string = sprintf('%2.2f',metric); center_obj = stats.Centroid; y_cen = center_obj(:,1); x_cen = center_obj(:,2); z = center_obj ; y_cen = round((y_cen - 22)/5.9)-25 x_cen = round((x_cen - 22)/5.9)+17 x_string =sprintf('%2.0f',x_cen); y_string =sprintf('%2.0f',y_cen); text(boundary(1,2)-10,boundary(1,1)+35,x_string,'Color','r',... 'FontSize',12,'FontWeight','bold'); text(boundary(1,2)-35,boundary(1,1)+10,y_string,'Color','y',... 'FontSize',12,'FontWeight','bold'); title('ARM ROBOT'); end; end; hold off; pause(0.1e-200); end ; % --- Executes on button press in Stop. function Stop_Callback(hObject, eventdata, handles) global val_bright vidobj run run = 0 ; val_bright1 = num2str(val_bright); set(handles.edit_y,'String',val_bright1); stop(vidobj); delete(vidobj); % --- Executes on button press in Reset. function Reset_Callback(hObject, eventdata, handles) global val_bright val_bright1 = num2str(val_bright); set(handles.edit_y,'String',val_bright1); % --- Executes on button press in Exit. function Exit_Callback(hObject, eventdata, handles) close all function edit_z_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in But_send. function But_send_Callback(hObject, eventdata, handles) global s byte_control global theta1 theta2 theta3 x1 y1 z1 l l1 l2 l3 anpha1 anpha2 global goc1 goc2 goc3 x_cen y_cen run global chieu1 byte_cao_ic1 byte_thap_ic1 global chieu2 byte_cao_ic2 byte_thap_ic2 global chieu3 byte_cao_ic3 byte_thap_ic3 run = 0 ; x1=get(handles.edit_x,'string') y1=get(handles.edit_y,'string') z1=get(handles.edit_z,'string') x1=str2num(x1) y1=str2num(y1) z1=str2num(z1) x1 = x_cen; y1 = y_cen; z1 = 5; if((x1^2+y1^2)>0) %----------------- theta1=acos(y1/sqrt(x1^2+y1^2)) theta1=theta1*180/pi theta1=180-theta1 %------------------ l=sqrt(x1^2+y1^2+(l1-z1)^2) anpha1=acos((l2^2+l^2-l3^2)/(2*l2*l)) anpha2=acos(sqrt(x1^2+y1^2)/l) anpha1=anpha1*180/pi anpha2=anpha2*180/pi if (z1>l1) theta2=90+anpha1+anpha2 elseif (z1==l1) theta2=90+anpha1 else theta2=90+anpha1-anpha2 end theta3=acos((l2^2+l3^2-l^2)/(2*l2*l3)) theta3=theta3*180/pi theta1=round(theta1) theta2=round(theta2) theta3=round(theta3) tam1=abs(goc1-theta1) tam2=abs(goc2-theta2) tam3=abs(goc3-theta3) % chuyen goc sang xung % ti le banh rang khau de : 162/71 % ti le banh rang khau 1:162/71 % ti le banh rang khau 2:7.2 tam1=tam1*200*71/165%19/46;%*200*19/48.5; tam2=tam2*400*71/162%19/55;% 400*19/ 60 tam3=tam3*100/7.2%11.5; % 100/13 tam1=round(tam1); tam2=round(tam2); tam3=round(tam3); %-------xac dinh chieu-------------- if (theta1>goc1) chieu1=0; else chieu1=1; end %------------ if (theta2>goc2) chieu2=0; else chieu2=1; end %------------ if (theta3>goc3) chieu3=0; else chieu3=1; end %------------------tinh byte cao-thap byte_thap_ic1=mod(tam1,255); byte_cao_ic1=(tam1-byte_thap_ic1)/255; byte_thap_ic2=mod(tam2,255); byte_cao_ic2=(tam2-byte_thap_ic2)/255; byte_thap_ic3=mod(tam3,255); byte_cao_ic3=(tam3-byte_thap_ic3)/255; %---------------------------------------- goc1=theta1 goc2=theta2 goc3=theta3 set(handles.edit_theta1,'string',theta1) set(handles.edit_theta2,'string',theta2) set(handles.edit_theta3,'string',theta3) set(handles.edit_ic1,'string',chieu1) set(handles.edit_ic2,'string',chieu2) set(handles.edit_ic3,'string',chieu3) set(handles.edit_ic11,'string',byte_cao_ic1) set(handles.edit_ic22,'string',byte_cao_ic2) set(handles.edit_ic33,'string',byte_cao_ic3) set(handles.edit_ic111,'string',byte_thap_ic1) set(handles.edit_ic222,'string',byte_thap_ic2) set(handles.edit_ic333,'string',byte_thap_ic3) fwrite(s,99); fwrite(s,byte_control); fwrite(s,chieu1); fwrite(s,byte_cao_ic1); fwrite(s,byte_thap_ic1); fwrite(s,chieu2); fwrite(s,byte_cao_ic2); fwrite(s,byte_thap_ic2); fwrite(s,chieu3); fwrite(s,byte_cao_ic3); fwrite(s,byte_thap_ic3); %fwrite(s,99); %fwrite(s,00); %fwrite(s,1); %fwrite(s,1); %fwrite(s,23); %fwrite(s,1); %fwrite(s,2); %fwrite(s,34); %fwrite(s,1); %fwrite(s,3); %fwrite(s,45); else end % --- Executes during object deletion, before destroying properties. function figure1_DeleteFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global isconnect s %load data; if(isconnect==1) isconnect = 0 record(s,'off') fclose(s); get(s) delete(s); clear s; end %save data % --- Executes during object creation, after setting all properties. function figure1_CreateFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called function edit_theta1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_theta1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_theta2_Callback(hObject, eventdata, handles) function edit_theta2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_theta3_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_theta3_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function X_Callback(hObject, eventdata, handles) function edit_y_Callback(hObject, eventdata, handles) function edit_z_Callback(hObject, eventdata, handles) function text1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function text1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_text_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_text_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic11_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic11_CreateFcn(hObject, eventdata, handles) on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic22_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic22_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic33_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic33_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic1_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic2_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic2_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic3_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic3_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic111_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic111_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic222_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic222_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_ic333_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_ic333_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in cmd_quaylai. function cmd_quaylai_Callback(hObject, eventdata, handles) % hObject handle to cmd_quaylai (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global s byte_control global goc1 goc2 goc3 tam1 tam2 tam3 global chieu1 byte_cao_ic1 byte_thap_ic1 global chieu2 byte_cao_ic2 byte_thap_ic2 global chieu3 byte_cao_ic3 byte_thap_ic3 fwrite(s,99); fwrite(s,2); fwrite(s,abs(1-chieu1)); fwrite(s,byte_cao_ic1); fwrite(s,byte_thap_ic1); fwrite(s,abs(1-chieu2)); fwrite(s,byte_cao_ic2); fwrite(s,byte_thap_ic2); fwrite(s,abs(1-chieu3)); fwrite(s,byte_cao_ic3); fwrite(s,byte_thap_ic3); goc1=0 goc2=135 goc3=55 tam1=0; tam2=0; tam3=0; byte_control=1; function edit_cmd_start_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_cmd_start_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in cmd_start. function cmd_start_Callback(hObject, eventdata, handles) % hObject handle to cmd_start (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global start writeasync(start,1) % --- Executes on button press in con_plc. function con_plc_Callback(hObject, eventdata, handles) % hObject handle to con_plc (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global da grp1 hsc0 hsc1 hsc4 manual start control toi1 toi2 toi3 lui1 lui2 lui3 global dat1 dat2 dat3 nang van_khi dung da = opcda('localhost','S7200.OPCServer') connect(da) grp1 = addgroup(da) start = additem(grp1,'MicroWin.s7.start') hsc0 = additem(grp1,'MicroWin.s7.hsc0') hsc1 = additem(grp1,'MicroWin.s7.hsc1') %hsc2 = additem(grp1,'MicroWin.s7.hsc2') hsc4 = additem(grp1,'MicroWin.s7.hsc4') manual = additem(grp1,'MicroWin.s7.manual') control = additem(grp1,'MicroWin.s7.control') toi1 = additem(grp1,'MicroWin.s7.toi1') toi2 = additem(grp1,'MicroWin.s7.toi2') toi3 = additem(grp1,'MicroWin.s7.toi3') lui1 = additem(grp1,'MicroWin.s7.lui1') lui2 = additem(grp1,'MicroWin.s7.lui2') lui3 = additem(grp1,'MicroWin.s7.lui3') dat1=additem(grp1,'MicroWin.s7.dat1') dat2=additem(grp1,'MicroWin.s7.dat2') dat3=additem(grp1,'MicroWin.s7.dat3') nang=additem(grp1,'MicroWin.s7.nang') van_khi=additem(grp1,'MicroWin.s7.van_khi') dung=additem(grp1,'MicroWin.s7.dung') % --- Executes on button press in Stop_plc. function Stop_plc_Callback(hObject, eventdata, handles) % hObject handle to Stop_plc (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global start control writeasync(start,0) writeasync(control,10) % --- Executes on button press in cmd_send. function cmd_send_Callback(hObject, eventdata, handles) % hObject handle to cmd_send (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global hsc0 hsc1 hsc2 hsc4 control dat1 dat2 dat3 nang global theta1 theta2 theta3 x1 y1 z1 l l1 l2 l3 anpha1 anpha2 global goc1 goc2 goc3 byte_1 byte_2 byte_3 byte_11 byte_22 byte_33 byte_nang global tam run y_cen x_cen run = 0 ; writeasync(control,10) pause(0.05) writeasync(control,100) x1=get(handles.edit_nhap1,'string') y1=get(handles.edit_nhap2,'string') z1=get(handles.edit_nhap3,'string') x1=str2num(x1) y1=str2num(y1) z1=str2num(z1) x1 = x_cen; y1 = y_cen; z1 = 3; if((x1^2+y1^2)>0) %----------------- theta1=acos(y1/sqrt(x1^2+y1^2)) theta1=theta1*180/pi theta1=180-theta1 %------------------ l=sqrt(x1^2+y1^2+(l1-z1)^2) anpha1=acos((l2^2+l^2-l3^2)/(2*l2*l)) anpha2=acos(sqrt(x1^2+y1^2)/l) anpha1=anpha1*180/pi anpha2=anpha2*180/pi if (z1>l1) theta2=90+anpha1+anpha2 elseif (z1==l1) theta2=90+anpha1 else theta2=90+anpha1-anpha2 end theta3=acos((l2^2+l3^2-l^2)/(2*l2*l3)) theta3=theta3*180/pi theta1=round(theta1) theta2=round(theta2) theta3=round(theta3) byte_1=goc1-theta1 byte_2=goc2-theta2 byte_3=goc3-theta3 set(handles.edit_1,'string',byte_1) set(handles.edit_2,'string',byte_2) set(handles.edit_3,'string',byte_3) goc1=theta1 goc2=theta2 goc3=theta3 byte_1=byte_1*75.3/36; byte_2=byte_2*40/36; byte_3=byte_3*40/36; byte_1=round(byte_1) byte_2=round(byte_2) byte_3=round(byte_3) %----------------------- tam=180-goc2-5 if tam>0 byte_nang=0-tam; byte_nang=byte_nang*40/36; byte_nang=round(byte_nang); goc2=goc2+tam; end x1=get(handles.edit_dat1,'string') y1=get(handles.edit_dat2,'string') z1=get(handles.edit_dat3,'string') x1=str2num(x1) y1=str2num(y1) z1=str2num(z1) %----------------- theta1=acos(y1/sqrt(x1^2+y1^2)) theta1=theta1*180/pi theta1=180-theta1 %------------------ l=sqrt(x1^2+y1^2+(l1-z1)^2) anpha1=acos((l2^2+l^2-l3^2)/(2*l2*l)) anpha2=acos(sqrt(x1^2+y1^2)/l) anpha1=anpha1*180/pi anpha2=anpha2*180/pi if (z1>l1) theta2=90+anpha1+anpha2 elseif (z1==l1) theta2=90+anpha1 else theta2=90+anpha1-anpha2 end theta3=acos((l2^2+l3^2-l^2)/(2*l2*l3)) theta3=theta3*180/pi theta1=round(theta1) theta2=round(theta2) theta3=round(theta3) byte_11=goc1-theta1 byte_22=goc2-theta2 byte_33=goc3-theta3 set(handles.edit_d1,'string',byte_11) set(handles.edit_d2,'string',byte_22) set(handles.edit_d3,'string',byte_33) goc1=theta1 goc2=theta2 goc3=theta3 byte_11=byte_11*79/36; byte_22=byte_22*40/36; byte_33=byte_33*40/36; byte_11=round(byte_11) byte_22=round(byte_22) byte_33=round(byte_33) %------------------------- writeasync(hsc0,byte_1) writeasync(hsc4,byte_2) writeasync(hsc1,byte_3) writeasync(dat1,byte_11) writeasync(dat2,byte_22) writeasync(dat3,byte_33) writeasync(nang,byte_nang) writeasync(control,1) end function edit_nhap1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_nhap1_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function edit_hsc0_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_nhap2_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_nhap2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_nhap3_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_nhap3_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in cmd_toi1. function cmd_toi1_Callback(hObject, eventdata, handles) % hObject handle to cmd_toi1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global toi1 writeasync(toi1,1) %pause(0.2); %writeasync(toi1,0) % --- Executes on button press in cmd_lui1. function cmd_lui1_Callback(hObject, eventdata, handles) % hObject handle to cmd_lui1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global lui1 writeasync(lui1,1) %pause(0.2); %writeasync(lui1,0) % --- Executes on button press in cmd_toi2. function cmd_toi2_Callback(hObject, eventdata, handles) % hObject handle to cmd_toi2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global toi2 writeasync(toi2,1) %pause(0.2); %writeasync(toi2,0) % --- Executes on button press in cmd_lui2. function cmd_lui2_Callback(hObject, eventdata, handles) % hObject handle to cmd_lui2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global lui2 writeasync(lui2,1) pause(0.2); writeasync(lui2,0) % --- Executes on button press in cmd_toi3. function cmd_toi3_Callback(hObject, eventdata, handles) % hObject handle to cmd_toi3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global toi3 writeasync(toi3,1) %pause(0.2); %writeasync(toi3,0) % --- Executes on button press in cmd_lui3. function cmd_lui3_Callback(hObject, eventdata, handles) % hObject handle to cmd_lui3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global lui3 writeasync(lui3,1) %pause(0.2); %writeasync(lui3,0) function edit_1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_1_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_2_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_3_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_3_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_dat1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_dat1_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_dat2_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_dat2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit_dat2 (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 edit_dat3_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_dat3_CreateFcn(hObject, eventdata, handles) % 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 edit_d1_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_d1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit_d1 (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 edit_d2_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_d2_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit_d3_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function edit_d3_CreateFcn(hObject, eventdata, handles) % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in cmd_manual. function cmd_manual_Callback(hObject, eventdata, handles) % hObject handle to cmd_manual (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global bit_manual manual if bit_manual==1 bit_manual=0 writeasync(manual,0) set(handles.text_manual,'string','Automatic') else bit_manual=1 writeasync(manual,1) set(handles.text_manual,'string','Manual') end % --- Executes on button press in cmd_kep. function cmd_kep_Callback(hObject, eventdata, handles) % hObject handle to cmd_kep (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global van_khi writeasync(van_khi,1) % --- Executes on button press in cmd_tha. function cmd_tha_Callback(hObject, eventdata, handles) % hObject handle to cmd_tha (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global van_khi writeasync(van_khi,0) % --- Executes on button press in cmd_dung. function cmd_dung_Callback(hObject, eventdata, handles) % hObject handle to cmd_dung (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global dung writeasync(dung,1) writeasync(dung,0) % --- Executes on button press in cmd_reset. function cmd_reset_Callback(hObject, eventdata, handles) % hObject handle to cmd_reset (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global goc1 goc2 goc3 % GOC BAN DAU goc1=0%12 goc2=180%130; goc3=90%49 % --- Executes on button press in cmd_stop. function cmd_stop_Callback(hObject, eventdata, handles) % hObject handle to cmd_stop (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global start control writeasync(start,0) writeasync(control,10) % --- Executes on button press in exit. function exit_Callback(hObject, eventdata, handles) % hObject handle to exit (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global run run = 0; close all % --- Executes on button press in cmd_begin. function cmd_begin_Callback(hObject, eventdata, handles) % hObject handle to cmd_begin (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global control start writeasync(start,0) writeasync(control,11) 2.Code chương trình PLC: Đặt tên cho Bit: 2.1 Chương trình MAIN: 2.2 Chương trình con khởi tạo chế độ điều xung cho Q00,Q01: 2.3 Chương trình con Reser Counter: 2.4 Chương trình con khởi tạo motor: 2.5 Chương trình con về vị trí ban đầu: TÀI LIỆU THAM KHẢO [1]. Nguyễn Đức Thành, MATLAB và ứng dụng trong điều khiển, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh. [2]. Trần Thế San biên dịch, Cở sở nghiên cứu và sáng tạo ROBOT, nhà xuất bản Thống Kê. [3]. Nguyễn Đức Thành, Đo lường và điều khiển bằng máy tính, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh. [4]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập môn xử lý ảnh số, nhà xuất bản Khoa học và Kỹ thuật. [5]. Nguyễn Hữu Lộc, Cơ sở thiết kế máy, nhà xuất bản: Đại học quốc gia Tp. Hồ Chí Minh. [1]. Nguyễn Đức Thành, MATLAB và ứng dụng trong điều khiển, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh. [2]. Trần Thế San biên dịch, Cở sở nghiên cứu và sáng tạo ROBOT, nhà xuất bản Thống Kê. [3]. Nguyễn Đức Thành, Đo lường và điều khiển bằng máy tính, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh. [4]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập môn xử lý ảnh số, nhà xuất bản Khoa học và Kỹ thuật. [5]. Nguyễn Hữu Lộc, Cơ sở thiết kế máy, nhà xuất bản: Đại học quốc gia Tp. Hồ Chí Minh. [6]. [7]. [8]. [9]. [10]. [11].

Các file đính kèm theo tài liệu này:

  • docluan van_TRO_SI.doc
  • rarBản chính thức.rar
  • docMỤC LỤC.doc