Đọc và ghi dữ liệu

Một phần của tài liệu Ứng dụng xử lý ảnh để phân loại sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC (Trang 98 - 116)

Đây là bước quan trọng trong việc đọc và ghi dữ liệu từ Raspberry đến PLC S7 1200. Sử dụng các lệnh có sẵn trong thư viện Snap7 và thư viện đã mã hoá giúp chúng ta thì ta đã có thể dễ dàng đọc vùng nhớ và ghi dữ liệu lên vùng nhớ đó. Cụ thể, vùng nhớ mà nhóm đã chọn là MD với kiểu dữ liệu là Dword (4byte).

Thực hiện trên Raspberry Pi 4B bằng Python qua thư viện Snap7, để đọc và ghi dữ liệu thì ta cần mã hoá kiểu dữ liệu, với thư viện Snap7 cũng đã giúp ta việc đó. Với dữ liệu được gửi vào PLC ở vùng nhớ MD104, MD108, MD112, MD118. Với dữ liệu được ghi vào vùng nhớ MD 100 là 10 để phân loại sản hình tròn, dữ liệu được ghi vào vùng nhớ MD 112 là 20 để phân loại sản hình vuông, dữ liệu được ghi vào vùng nhớ MD 108 là 30 để phân loại sản hình tam giác và dữ liệu được ghi vào vùng nhớ MD 118 là 40 để phân loại sản hình chữ nhật đồng thời đếm sản phẩm.

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

81 SVTH: Bùi Anh Dũng

Phạm Lê Bảo Hoàng

Người hướng dẫn: ThS. Phan Thị Thanh Vân

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

82 SVTH: Bùi Anh Dũng

Phạm Lê Bảo Hoàng

Người hướng dẫn: ThS. Phan Thị Thanh Vân

KẾT LUẬN

- Kết luận đề tài:

Sau khi hoàn thành đồ án tốt nghiệp với đề tài “Ứng dụng xử lý ảnh để phân loại sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC”, nhóm em đã có thêm nhiều kiến thức chuyên ngành, tìm hiểu các dây chuyền sản xuất tự động hiện nay, các thiết bị điện được sử dụng phổ biến trong công nghiệp, thi công mô hình và tủ điện công nghiệp phù hợp với yêu cầu đã đặt ra.

Tìm hiểu và sử dụng ngôn ngữ lập trình Python, cách xử lý ảnh, phần mềm TIA Portal V16 trong việc lập trình hệ thống, cũng như WinCC trong việc điều khiển và giám sát, tạo giao diện giao tiếp HMI, đáp ứng đúng yêu cầu công nghệ cũng như có khả năng ứng dụng vào thực tế. Phân tích, giải quyết và xử lý những vấn đề phát sinh trong quá trình nghiên cứu, tìm hiểu, thi công đồ án. Tổ chức làm việc nhóm 2 người một cách hiệu quả, giải quyết công việc như đã thảo luận.

- Ưu điểm của đề tài:

+ Mô hình là một khâu của một dây chuyền sản xuất hiện đại. Bám sát thực tế + Mô hình hoạt động ổn định

+ Xử lý ảnh đúng, phân loại sản phẩm chính xác + Có thể giám sát và điều khiển qua WinCC. - Hướng phát triển đề tài :

+ Đề tài chỉ là một khâu nhỏ nên có thể đầu tư thêm để phát triển thêm nhiều khâu khác như phân loại sản phẩm theo màu sắc, đóng gói sản phẩm,… để tạo ra một dây chuyền sản xuất hoàn chỉnh với độ chính xác cao hơn.

+ Tăng chất lượng của Camera để việc xử lý ảnh tốt hơn nữa. + Thiết kế và lắp đặt các phần cứng ổn định và đẹp hơn.

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

83 SVTH: Bùi Anh Dũng

Phạm Lê Bảo Hoàng

Người hướng dẫn: ThS. Phan Thị Thanh Vân

TÀI LIỆU THAM KHẢO

[1] PLCTech (2020). Tài liệu PLC Siemens S7 1200 Tiếng Việt

https://plctech.com.vn/tai-lieu-plc-siemens-s7-1200-tieng-viet/. [2] Lê Phước Sinh (2018). Giáo trình và bài tập thực hành S7 1200.

https://www.ebookbkmt.com/2018/03/giao-trinh-bai-tap-thuc-hanh-s7-1200- le.html

[3] Nhật Tri Automation (2020). Giáo trình PLC S7 – 1200.

[4] Nguyễn Hiền Minh, Phan Thanh Phong (2019). Ứng dụng xử lý ảnh trong hệ

thống phân loại sản phẩm. https://123docz.net//document/6067077-do-an-tot-

nghiep-ung-dung-xu-ly-anh-trong-he-thong-phan-loai-san-pham.htm

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC PHỤ LỤC 1. Chương trình xử lý ảnh import numpy as np import cv2 import snap7 import snap7.client from snap7.util import * import snap7.types as p import ctypes PLC = snap7.client.Client() def ReadMemory(PLC,byte,bit,datatype): result = PLC.read_area(p.Areas.MK,0,byte,datatype) if datatype==0x01: return get_bool(result,0,bit)

elif datatype==0x02 or datatype==0x04 : return get_int(result,0) elif datatype==0x08: return get_real(result,0) elif datatype==0x06: return get_dword(result,0) else: return None def WriteMemory(PLC,byte,bit,datatype,value): result = PLC.read_area(p.Areas.MK,0,byte,datatype) if datatype==0x01: set_bool(result,0,bit,value)

elif datatype== 0x02 or datatype==0x04 : set_int(result,0,value)

elif datatype==0x08: set_real(result,0,value)

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC elif datatype==0x06: set_dword(result,0,value) PLC.write_area(p.Areas.MK,0,byte,result) if __name__=="__main__": PLC.connect("169.254.151.50",0,1) cap = cv2.VideoCapture(0) while(True): # Capture frame-by-frame ret, cam = cap.read()

frame = cam[100:700,360:1000] #(y1:y2,x1:x2)

#chuyển màu

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #thresh = cv2.getTrackbarPos("threshold", "Trackbars") # chuyển về ảnh nhị phân

ret, frame_thres = cv2.threshold(gray,232, 255, cv2.THRESH_BINARY) #tìm điểm trên ảnh nhị phân

contours, hierarchy =

cv2.findContours(frame_thres,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) #tìm cạnh

canh = cv2.Canny(frame_thres, 195, 255, True) #vẽ viền

diemanh = cv2.drawContours(frame, contours, -1, (255, 0, 0), 3)

for cnt in contours:

(x,y,w,h) = cv2.boundingRect(cnt)

if w*h > 30 and 20< y <350: # pham vi hoạt động M = cv2.moments(cnt) # tìm tâm

cX = int(M["m10"]/(M["m00"]+1)) cY = int(M["m01"]/(M["m00"]+1))

cv2.circle (frame, (cX, cY), 5, (0,0,255), 1) #vẽ hình tròn cv2.drawContours(frame, contours, -1,(0,255,0), 2) #vẽ viền

approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True) # phân chia điểm để tìm khoảng cách lớn nhất của đường thẳng

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

print (len(approx)) # in lên Terminal area = cv2.contourArea(cnt)

if len(approx) == 4 or len(approx) == 5 or len(approx) == 6: # nếu cạnh là 4, 5, 6

area = cv2.contourArea(cnt) # các điểm trong vùng chứa print (w-h)

print (w*h)

if area/(w*h)<0.65: # diện tích tam giác cv2.drawContours(frame,[cnt],0,255,-1)

cv2.putText(frame, "tam giac", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("tam giac")

if ReadMemory(PLC,108,0,0x08) == 0: data=WriteMemory(PLC,108,0,0x06,30) elif -90 < w-h < 90 and 0<w*h<94000:

cv2.drawContours(frame,[cnt],0,(0,255,255),-1) cv2.putText(frame, "hinh vuong", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("hinh vuong")

if ReadMemory(PLC,112,0,0x08) == 0: WriteMemory(PLC,112,0,0x06,20) elif len(approx) ==4:

area = cv2.contourArea(cnt)

if -95 < w-h < 95 and 0< w*h <94000 and area/(w*h)>0.65: cv2.drawContours(crop,[cnt],0,(0,255,255),-1)

cv2.putText(crop, "hinh vuong", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("hinh vuong") elif area/(w*h)<0.6:

cv2.drawContours(crop,[cnt],0,255,-1)

cv2.putText(crop, "tam giac", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("tam giac") else:

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

cv2.putText(crop, "hinh chu nhat", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("chu nhat") else:

cv2.drawContours(frame,[cnt],0,(255,255,0),-1)

cv2.putText(frame, "hinh chu nhat", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("hinh chu nhat")

if ReadMemory(PLC,118,0,0x08) == 0: WriteMemory(PLC,118,0,0x06,40) elif len(approx)==3:

cv2.drawContours(frame,[cnt],0,255,-1)

cv2.putText(frame, "tam giac", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("tam giac")

if ReadMemory(PLC,108,0,0x08) == 0: WriteMemory(PLC,108,0,0x06,30) elif 16 >= len(approx) >= 10:

cv2.drawContours(frame,[cnt],0,(255,0,255),-1) cv2.putText(frame, "hinh tron", (cX - 20, cY - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

print ("hinh tron")

if ReadMemory(PLC,100,0,0x08) == 0: WriteMemory(PLC,100,0,0x06,10) elif len(approx) > 16: print ("Not") #cv2.imshow('frame',gray) #cv2.imshow('tim canh',canh) cv2.imshow('vien anh',diemanh) #cv2.imshow("Trackbars", frame) #cv2.imshow("nhi phan", frame_thres) if cv2.waitKey(1) & 0xFF == ord('q'): break

cap.release()

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

2. Chương trình PLC

 Chương trình chính (MAIN):

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

Tên đề tài: Ứng dụng xử lý ảnh để phân loai sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC

Một phần của tài liệu Ứng dụng xử lý ảnh để phân loại sản phẩm theo hình dạng, điều khiển và giám sát qua WinCC (Trang 98 - 116)