Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 101 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
101
Dung lượng
4,63 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CNKT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA CHẨN ĐOÁN LỖI CHO HỆ THỐNG ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ SỬ DỤNG THUẬT TOÁN CNN GVHD: TS TẠ VĂN PHƯƠNG SVTH: BẠCH CƠNG HỒNG NGUYỄN THÀNH LONG SKL009216 Tp.Hồ Chí Minh, tháng 8/2022 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN - ĐIỆN TỬ BÁO CÁO TỐT NGHIỆP ĐỀ TÀI: CHẨN ĐOÁN LỖI CHO HỆ THỐNG ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ SỬ DỤNG THUẬT TỐN CNN SVTH : BẠCH CƠNG HỒNG MSSV: 18151180 NGUYỄN THÀNH LONG MSSV: 18151197 Khóa : 2018-2022 Ngành : CÔNG NGHỆ KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GVHD: TS TẠ VĂN PHƯƠNG Tp Hồ Chí Minh, tháng năm 2022 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN - ĐIỆN TỬ BÁO CÁO TỐT NGHIỆP ĐỀ TÀI: CHẨN ĐOÁN LỖI CHO HỆ THỐNG ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ SỬ DỤNG THUẬT TỐN CNN SVTH : BẠCH CƠNG HỒNG MSSV: 18151180 NGUYỄN THÀNH LONG MSSV: 18151197 Khóa : 2018-2022 Ngành : CÔNG NGHỆ KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GVHD: TS TẠ VĂN PHƯƠNG Tp Hồ Chí Minh, tháng năm 2022 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** Tp Hồ Chí Minh, ngày tháng năm 2022 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Bạch Cơng Hồng MSSV: 18151180 Nguyễn Thành Long MSSV: 18151197 Ngành: Công nghệ kỹ thuật Điều khiển Tự động hóa Lớp: 181511 Giảng viên hướng dẫn: TS Tạ Văn Phương Ngày nhận đề tài: 10/03/2022 Điện thoại: 0908248231 Ngày nộp đề tài: 06/08/2022 Tên đề tài: Chẩn đoán lỗi cho hệ thống điều khiển tốc độ động sử dụng thuật toán CNN Nội dung thực đề tài: - Điều khiển ổn định tốc độ động sử dụng điều khiển PID thông qua giao thức Modbus RTU - Chẩn đốn lỗi đặc tính thiết bị cho PLC sử dụng khối OB82 Tia Portal V16 - Chẩn đoán lỗi cho động sử dụng thuật toán CNN - Thiết kế giao diện giám sát đưa cảnh báo lỗi cho hệ thống động sử dụng Python 3.7 Sản phẩm: - Mơ hình điều khiển tốc độ động thông qua giao thức Modbus RTU - Model chẩn đoán lỗi sử dụng thuật toán CNN - Giao diện giám sát điều khiển hệ thống TRƯỞNG NGÀNH GIẢNG VIÊN HƯỚNG DẪN CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** Tp Hồ Chí Minh, ngày tháng năm 2022 PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN Họ tên sinh viên: Bạch Cơng Hồng MSSV: 18151180 Họ tên sinh viên: Nguyễn Thành Long MSSV: 18151197 Ngành: Công nghệ kỹ thuật Điều khiển Tự động hóa Tên đề tài: Chẩn đốn lỗi cho hệ thống điều khiển tốc độ động sử dụng thuật toán CNN Họ tên giảng viên hướng dẫn: TS Tạ Văn Phương NHẬN 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: 6.Điểm:……………(Bằngchữ: .) Tp Hồ Chí Minh, ngày tháng năm 2022 Giảng viên hướng dẫn (Ký & ghi rõ họ tên) CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** Tp Hồ Chí Minh, ngày tháng năm 2022 PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN PHẢN BIỆN Họ tên sinh viên: Bạch Cơng Hồng MSSV: 18151180 Họ tên sinh viên: Nguyễn Thành Long MSSV: 18151197 Ngành: Công nghệ kỹ thuật Điều khiển Tự động hóa Tên đề tài: Chẩn đốn lỗi cho hệ thống điều khiển tốc độ động sử dụng thuật toán CNN Họ tên giảng viên phản biện: NHẬN 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 2022 Giảng viên phản biện (Ký & ghi rõ họ tên) Báo cáo đồ án tốt nghiệp LỜI CẢM ƠN Lời đầu tiên, nhóm thực báo cáo xin gửi lời cảm ơn chân thành đến thầy giáo TS Tạ Văn Phương người trực tiếp hướng dẫn thực đề tài, giúp đỡ tạo điều kiện cho chúng em mượn thiết bị để hồn thành báo cáo tiến độ sâu trình nghiên cứu Xin cảm ơn thầy suốt thời gian thực đề tài, thầy ln tận tình, chu đáo, quan tâm bảo chúng em gặp khó khăn việc nghiên cứu thực đề tài ln bám sát nhóm thực báo cáo để có điều chỉnh kịp thời nhằm giúp đề tài đạt kết tốt thời gian quy định Để đồ án hoàn thành tiến độ đạt kết tốt nhóm chúng em nhận nhiều giúp đỡ, hỗ trợ nhiều quan, tổ chức cá nhân Bằng tất chân thành em xin thay mặt nhóm gửi lời cám ơn đến tất thầy cơ, phịng ban tạo điều kiện để chúng em học tập nghiên cứu đồ án Trong phải kể đến thầy khoa Điện – Điện tử trường Đại học Sư Phạm Kỹ Thuật thành phố Hồ Chí Minh quan tâm, giảng dạy, bảo chúng em cách tận tình để chúng em có vốn kiến thức định để tiến hành nghiên cứu thực thành công đề tài Nhóm thực báo cáo xin gửi lời cảm ơn chân thành đến thầy giáo –TS Tạ Văn Phương Trong trình thực đề tài thầy tạo điều kiện cho nhóm thực báo cáo tiếp cận số thiết bị tự động hóa Siemens Đồng thời, nhóm thực báo cáo xin gửi lời cảm ơn đến tác giả sách, báo, tạp chí khoa học mang đến cho nhóm thực báo cáo kiến thức vơ bổ ích để hỗ trợ cho đề tài Bên cạnh không cảm ơn anh chị trước Họ người bạn chia sẻ cho chúng em kinh nghiệm, khó khăn mà anh chị gặp đưa hướng giải để từ chúng em tự đúc kết giải pháp để hạn chế thiếu sót suốt thời gian làm báo cáo Đồng thời cảm ơn bạn làm chung đồ hỗ trợ, giúp đỡ lúc gặp khó khăn Lời cảm ơn i Báo cáo đồ án tốt nghiệp Cuối cùng, nhóm thực báo cáo xin cảm ơn Trường Đại học sư phạm kỹ thuật TP HCM nơi mà nhóm gắn bó từ ngày đầu chập chững vào trường nơi có nhiều sân chơi để nhóm thỏa sức sáng tạo, vui chơi, học hỏi trau dồi thêm kinh nghiệm kiến thức cho thân Xin chân thành cảm ơn! Lời cảm ơn ii Báo cáo đồ án tốt nghiệp TÓM TẮT ĐỀ TÀI Đề tài “Chẩn đoán lỗi cho hệ thống điều khiển tốc độ động sử dụng thuật toán CNN” đề xuất giải pháp giám sát chẩn đoán lỗi cho hệ thống điều khiển dựa vào điều khiển PLC nhằm cảnh báo đưa chẩn đoán, dẫn để sử dụng khắc phục, đưa hệ thống trở lại hoạt động bình thường cách nhanh Bên cạnh đó, nhóm thựchiện báo cáo thiết kế giao diện Visual Studio điều khiển ổn định hệ thống,lưu trữ lỗi, giá trị tag giám sát lỗi hệ thống Đề tài phát triển theo hướng ứng dụng, thiết kế giải pháp dựa mơ hình mạng neural tích chập (CNN) - tập hợp thuật tốn để có mơ hình liệu trừu tượng hóa mức cao cách sử dụng nhiều lớp xử lý cấu trúc phức tạp Giải pháp chạy ứng dụng Visual Studio Code với thư viện mở tảng Python Trong đề tài này, nhóm thực báo cáo tập trung vào ba nội dung chính: Thứ nhất: Điều khiển ổn định tốc độ cho động sau: - Dùng biến tần điều khiển tốc độ động - Giao tiếp PLC với biến tần giao thức Modbus RTU sử dụng đường truyền vật lý RS485 - Dùng điều khiển PID để điều khiển ổn định tốc độ cho động Thứ hai: Chuẩn đoán lỗi dựa vào đặc tính thiết bị: - Truy xuất mã lỗi thiết bị - Hiển thị mã lỗi chẩn đoán lỗi giao diện điều khiển phát sinh lỗi Thứ ba: Chẩn đoán lỗi dựa vào cấu trúc mạng neural tích chập (CNN): - Truy xuất mã lỗi thiết bị - Thu thập liệu để training - Chọn model - Đưa training data set vào để tiến hành training - Kiểm tra đánh giá model Tóm tắt đề tài iii Báo cáo đồ án tốt nghiệp - Đưa liệu testing data set vào để chẩn đoán lỗi - Chuẩn đoán lỗi real time mơ hình thực Tóm tắt đề tài iv Báo cáo đồ án tốt nghiệp 5.3.2 Lỗi giả lập cho động Hình 13 Màn hình giám sát cảnh báo hệ thống bị lỗi F1 Hình 14 Màn hình giám sát cảnh báo hệ thống bị lỗi F2 68 Báo cáo đồ án tốt nghiệp Hình 15 Màn hình giám sát cảnh báo hệ thống bị lỗi F3 Hình 16 Màn hình giám sát cảnh báo hệ thống bị lỗi F4 69 Báo cáo đồ án tốt nghiệp Hình 17 Màn hình giám sát cảnh báo hệ thống bị lỗi F5 Hình 18 Màn hình giám sát cảnh báo hệ thống bị lỗi F6 70 Báo cáo đồ án tốt nghiệp Hình 19 Màn hình giám sát cảnh báo hệ thống bị lỗi F7 71 Báo cáo đồ án tốt nghiệp CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1 Kết luận Sau thực đề tài, nhóm thực báo cáo hồn thành yêu cầu đặt đề tài “Chẩn đoán lỗi cho hệ thống điều khiển tốc độ động sử dụng thuật toán CNN” Đề tài đạt kết bật sau đây: - Điều khiển ổn định tốc độ cho động điều khiển PID với dãy tần số từ 15-50Hz thông qua giao thức Modbus RTU - Chẩn đốn lỗi đặc tính hệ thống nhờ vào truy xuất mã lỗi nhà sản xuất lỗi nguồn đột ngột biến tần (F004), lỗi kết nối PLC với biến tần (F081) hiển thị lên hình giao diện điều khiển giám sát - Chẩn đoán lỗi hệ thống dựa vào cấu trúc mạng CNN hiển thị lỗi lên giao diện điều khiển giám sát hệ thống - Thiết kế giao diện điều khiển, hiển thị liệu, cảnh báo lỗi MessageBox, chẩn đoán lỗi, lưu lại lịch sử lỗi xuất liệu lịch sử file excel 6.2 Hướng phát triển Gắn thêm cảm biến chuyên dụng đo độ rung, moment giúp cho việc chẩn đoán lỗi xác Tiếp tục phát triển để tạo phần mềm ứng dụng hệ thống thực, áp dụng cho dịng PLC Chương 6: Kết luận hướng phát triển 72 Báo cáo đồ án tốt nghiệp TÀI LIỆU THAM KHẢO [1] N S Xanh, "Vai trò điều khiển lập trình PLC," 20 2021 [Online] Available: http://nangsuatxanh.vn/dao-tao-plc-vai-tro-cua-bo-dieu-khien-lap-trinh-plc.html [Accessed 22 2022] [2] Uniduc, "PID gì? Bộ điều khiển PID kiến thức bỏ qua.," 18 12 2020 [Online] Available: https://uniduc.com/vi/blog/pid#:~:text=1.1.,Hiểu%20đúng%20về&text=PID%20được%20tạo%20thành%20từ,sử%20dụng%20rất%20rộng% 20rãi [Accessed 12 2022] [3] C T T K T T Đ H PHÁT, "Truyền thơng Modbus gì?," 12 2020 [Online] Available: https://donghodoapsuat.vn/truyen-thong-modbus-lagi/#:~:text=Truyền%20thông%20modbus%20bao%20gồm,dạng%20serial%20RS232%20hoặc% 20RS485 [Accessed 18 2022] [4] C T T C N Đ L BFF, "Modbus TCP/IP Là Gì?," 18 2020 [Online] Available: https://doluongtudong.com/modbus-tcp-ip-la-gi/ [Accessed 12 2022] [5] Tapit, "Khái niệm giao thức Modbus RTU kết nối phần cứng," 12 2019 [Online] Available: https://tapit.vn/khai-niem-ve-giao-thuc-modbus-rtu-va-ket-noi-phan-cung/ [Accessed 6 2022] [6] N M Thanh, "CONVOLUTIONAL NEURAL NETWORK," 16 2018 [Online] Available: https://rpubs.com/thanhleo92/407837#:~:text=Mạng%20CNN%20là%20một%20tập,cho%20các %20lớp%20tiếp%20theo [Accessed 12 2022] [7] ItNavi, "Những Thông Tin Về Cấu Trúc Mạng CNN Là Gì?," 2021 [Online] Available: https://itnavi.com.vn/blog/cnn-la-gi#:~:text=cơ%20bản%20là%3A,Convolutional%20layer,vào%20vùng%20của%20hình%20ảnh [Accessed 12 2022] [8] V A Nguyen, "Các hàm kích hoạt (activation function) neural network," 2019 [Online] Available: https://aicurious.io/posts/2019-09-23-cac-ham-kich-hoat-activation-functiontrong-neural-networks/ [Accessed 15 2022] [9] N Hưng, "Thuật tốn CNN gì? Tìm hiểu Convolutional Neural Network," 19 2022 [Online] Available: https://vietnix.vn/cnn-la-gi/ [Accessed 25 2022] [10] MESIDAS, "PLC S7-1200 | Tổng quan SIMATIC S7-1200 Siemens," 16 2020 [Online] Available: https://mesidas.com/plc-s7-1200/ [Accessed 18 2022] [11] Siemens, "Communication Module cm 1241, RS422/485," 2019 [Online] Available: https://support.industry.siemens.com/cs/products/6es7241-1ch32-0xb0/communication-modulecm-1241-rs422-485?pid=59426&dtp=Manual&mlfb=6ES7241-1CH32-0XB0&mfn=ps&lc=enWW [Accessed 2022] [12] R Automation, "PowerFlex 520-Series Adjustable Frequency AC Drive Quick Start," 12 2020 [Online] Available: https://literature.rockwellautomation.com/idc/groups/literature/documents/qs/520-qs001_-ene.pdf [Accessed 2022] [13] Automaq, "EasyLogic™ DM6000H / DM6200H seri," 2021 [Online] Available: https://automaq.pe/w_files/otros/producto/metsedm6200hcl10rs_manual_1603213135.pdf [Accessed 2022] [14] Siemens, "Data sheet for three-phase Squirrel-Cage-Motors," 22 2019 [Online] Available: https://mall.industry.siemens.com/mall/en/WW/Catalog/Product/1LA70734AB10 [Accessed 2022] [15] Omron, "S82K power supply data sheet," 2021 [Online] Available: https://media.digikey.com/pdf/Data%20Sheets/Omron%20PDFs/S82K.pdf [Accessed 2022] 73 Báo cáo đồ án tốt nghiệp PHỤ LỤC Phụ Lục 1: Code xây dựng model CNN import numpy as np import pandas as pd import tensorflow as tf import matplotlib.pyplot as plt dataframe = pd.read_csv(r"D:\final\3-8-22\DATA_MOTOR\all_data_3_8.csv") dataframe=dataframe.iloc[np.random.permutation(len(dataframe))] print(dataframe.head()) data=dataframe.iloc[:,0:60].values label=dataframe.iloc[:,60].values label = tf.keras.utils.to_categorical(label,num_classes=8) print("Shape of X",data.shape) print("Shape of y",label.shape) print("Examples of X\n",data[:3]) print("Examples of y\n",label[:3]) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(data, label, test_size = 0.2, random_state = 42) X_train = X_train.reshape(X_train.shape[0],10,6).astype( 'float' ) X_test = X_test.reshape(X_test.shape[0],10, 6).astype( 'float' ) print(" X_train",X_train) print(" X_test",X_test) import keras from keras.models import Sequential from keras.layers import Dense from keras.layers.convolutional import Convolution1D from keras.layers.convolutional import MaxPooling1D, AveragePooling1D from keras.layers import Flatten from keras.models import Sequential, save_model, load_model model = Sequential() model.add(Convolution1D(filters=32, kernel_size=3, strides=2, padding='same', activation='relu', input_shape=(10, 6))) model.add(MaxPooling1D(pool_size=2, strides=1, padding='valid')) model.add(Convolution1D(filters=48, kernel_size=2, strides=1, padding='valid', activation='relu')) model.add(MaxPooling1D(pool_size=2, strides=1, padding='valid')) model.add(Flatten()) model.add(Dense(256, activation='relu')) model.add(Dense(84, activation='relu')) model.add(Dense(8, activation='softmax')) model.summary() model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam') history=model.fit(X_train, y_train, batch_size=64, epochs=1000,verbose=2, 74 Báo cáo đồ án tốt nghiệp validation_data=(X_test, y_test)) prediction=model.predict(X_test) predict_label=np.argmax(prediction,axis=1) print(predict_label) print(y_test) scores = model.evaluate(X_train, y_train) print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) model.save("Model_CNN_Lenet19h_3_8.h5") 75 Báo cáo đồ án tốt nghiệp Phụ Lục 2: Code chạy Runtime chương trình PLC from main import * import sys from PySide2 import QtCore, QtWidgets from PySide2.QtCore import QTimer,QDateTime,Signal from PySide2.QtCore import QThread from PySide2.QtGui import * from PySide2.QtWidgets import * from PySide2.QtWidgets import QApplication,QMainWindow #from Qttest import Ui_MainWindow import threading from ast import While from pickle import TRUE from tensorflow import keras import numpy as np # linear algebra import pandas as pd #loading data in table form import shiboken2 import sys, os, subprocess import timeit import time start_time = timeit.default_timer() Runtime_data=0 Runtime=0 # define snap7 import threading import snap7 from snap7.util import * from snap7.types import S7AreaDB, S7DataItem, S7SZL, S7SZLList, buffer_type, buffer_size, S7Object, Areas, WordLen from snap7.types import* from array import * row=0 start_time = timeit.default_timer() Runtime_data=0 Runtime=0 class py_plc(MainWindow): def star_conect(self): IP = self.ui.ip_plc.toPlainText() Rack = int(self.ui.rack_plc.toPlainText()) Slot = int(self.ui.slot_plc.toPlainText()) self.plc=snap7.client.Client() # Using libarary self.plc.connect(IP,Rack,Slot)# Connect to PLC print("on") global Runtime_data Runtime_data=0 Runtime_data1=1 76 Báo cáo đồ án tốt nghiệp self.data= [IP,Rack,Slot,Runtime_data] def readBool(db_number, start_offset, bit_offset): reading = self.plc.db_read(db_number, start_offset, 1) a = snap7.util.get_bool(reading, 0, bit_offset) print('DB Number: ' + str(db_number) + ' Bit: ' + str(start_offset) + '.' + str(bit_offset) + ' Value: ' + str(a)) return None def btn_start(self, index): global Runtime_data Runtime_data= self.data1= [self.data[0],self.data[1],self.data[2],Runtime_data] self.thread[1] = ThreadClass(index=self.data1) self.thread[1].signal1.connect(self.my_function) self.thread[1].signal.connect(self.my_function1) self.thread[1].start() def writeBool(db_number, start_offset, bit_offset, value):# (db number, start offset, read byte) reading = self.plc.db_read(db_number, start_offset, 1) # (value 1= true;0=false) (bytearray_: bytearray, byte_index: int, bool_index: int, value: bool) snap7.util.set_bool(reading, 0, bit_offset, value)# write back the bytearray and now the boolean value is changed in the PLC self.plc.db_write(db_number, start_offset, reading) return None print("START") thread1 = threading.Thread(target=writeBool(15, 0, 0, 1)) thread1 = threading.Thread(target=writeBool(15, 0, 1, 0)) thread1.start() def btn_stop(self): #self.data global Runtime_data Runtime_data=2 self.data2= [self.data[0],self.data[1],self.data[2],Runtime_data] self.thread[2] = ThreadClass(index=self.data2) self.thread[2].start() def writeBool(db_number, start_offset, bit_offset, value): reading = self.plc.db_read(db_number, start_offset, 1) snap7.util.set_bool(reading, 0, bit_offset, value) self.plc.db_write(db_number, start_offset, reading) return None print("STOP") thread2 = threading.Thread(target=writeBool(15, 0, 0, 0)) thread2 = threading.Thread(target=writeBool(15, 0, 1, 1)) thread2.start() def Bnt_setpoint(self): 77 Báo cáo đồ án tốt nghiệp self.data def writeMemory(db_number, start_address, value): self.plc.db_write(db_number, start_address, bytearray( struct.pack('>f', value))) # big-endian print('Start Address: ' + str(start_address) + ' Value: ' + str(value)) setpoint = float(self.ui.setpoind_plc.toPlainText()) thread3 = threading.Thread(target=writeMemory(14, 0, setpoint)) def Bnt_set_pid(self): self.data def writeMemory(db_number, start_address, value): self.plc.db_write(db_number, start_address, bytearray( struct.pack('>f', value))) # big-endian print('Start Address: ' + str(start_address) + ' Value: ' + str(value)) Kp = float(self.ui.kp_pid.toPlainText()) Ki = float(self.ui.ki_pid.toPlainText()) Kd = float(self.ui.kd_pid.toPlainText()) thread3 = threading.Thread(target=writeMemory(15, 2, Kp)) thread3 = threading.Thread(target=writeMemory(15, 6, Ki)) thread3 = threading.Thread(target=writeMemory(15, 10, Kd)) class ThreadClass(QtCore.QThread): signal = Signal(int) signal1 = Signal(list) signal2= Signal(int) def init (self,index=0): super(). init () self.data=index print("receiver:", self.data) self.Runtime_data=self.data[3] print("data[3]=",self.data[3]) def run(self): self.plc=snap7.client.Client() # Using libarary self.plc.connect(self.data[0],self.data[1],self.data[2]) #self.data[3]= self.Runtime_data print("data3=",self.Runtime_data) def ReadMemory(plc,db_number,addr_offset,bit,datatype): result = self.plc.read_area(snap7.types.Areas.DB,db_number,addr_offset,datatype) # DB14 is used to store data if datatype==S7WLBit: return get_bool(result,0,bit) elif datatype==S7WLByte or datatype==S7WLWord: return get_int(result,0) elif datatype==S7WLReal: return get_real(result,0) elif datatype==S7WLDWord: 78 Báo cáo đồ án tốt nghiệp return get_dword(result,0) else: return None def readdata(): read_data_plc=[0 for q in range (18)] read_data_plc[0]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc[1]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc[2]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc[3]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc[4]= ReadMemory(self.plc,7,6,0,S7WLByte) read_data_plc[5]= ReadMemory(self.plc,5,2,0,S7WLByte) read_data_plc[6]= ReadMemory(self.plc,14,24,0,S7WLReal) read_data_plc[7]= ReadMemory(self.plc,14,28,0,S7WLReal) read_data_plc[8]= ReadMemory(self.plc,14,32,0,S7WLReal) read_data_plc[9]= ReadMemory(self.plc,14,42,0,S7WLReal) read_data_plc[10]= ReadMemory(self.plc,14,46,0,S7WLReal) read_data_plc[11]= ReadMemory(self.plc,14,50,0,S7WLReal) read_data_plc[12]= ReadMemory(self.plc,3,52,0,S7WLReal) read_data_plc[13]= ReadMemory(self.plc,3,20,0,S7WLReal) read_data_plc[14]= ReadMemory(self.plc,8,8,0,S7WLBit) #lost power read_data_plc[15]= ReadMemory(self.plc,8,8,1,S7WLBit) #analog input read_data_plc[16]= ReadMemory(self.plc,8,8,2,S7WLBit) #analog output read_data_plc[17]= ReadMemory(self.plc,8,8,3,S7WLBit) #good HW self.signal1.emit(list(read_data_plc)) def readdata_runtime(): read_data_plc1=[0 for i in range (60)] read_data_plc1[0]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[1]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[2]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[3]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[4]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[5]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[6]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[7]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[8]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[9]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[10]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[11]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[12]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[13]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[14]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[15]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[16]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[17]= ReadMemory(self.plc,14,20,0,S7WLReal) 79 Báo cáo đồ án tốt nghiệp time.sleep(0.01) # Read # read_data_plc1[18]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[19]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[20]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[21]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[22]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[23]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[24]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[25]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[26]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[27]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[28]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[29]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[30]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[31]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[32]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[33]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[34]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[35]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[36]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[37]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[38]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[39]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[40]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[41]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[42]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[43]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[44]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[45]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[46]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[47]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) # Read # read_data_plc1[48]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[49]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[50]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[51]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[52]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[53]= ReadMemory(self.plc,14,20,0,S7WLReal) 80 Báo cáo đồ án tốt nghiệp time.sleep(0.01) # Read 10 # read_data_plc1[54]= ReadMemory(self.plc,14,0,0,S7WLReal) read_data_plc1[55]= ReadMemory(self.plc,14,4,0,S7WLReal) read_data_plc1[56]= ReadMemory(self.plc,14,8,0,S7WLReal) read_data_plc1[57]= ReadMemory(self.plc,14,12,0,S7WLReal) read_data_plc1[58]= ReadMemory(self.plc,14,16,0,S7WLReal) read_data_plc1[59]= ReadMemory(self.plc,14,20,0,S7WLReal) time.sleep(0.01) self.read_DB2D=np.reshape(read_data_plc1, (1, 10, 6)) def pred_model(): model_load = keras.models.load_model(r"D:\final\3-822\Model_CNN_Lenet19h_3_8.h5") pred_real = model_load.predict(self.read_DB2D) global n n=np.argmax(pred_real) self.signal.emit(int(n)) if np.argmax(pred_real)==0: print('Fine') elif np.argmax(pred_real)==1: print('F1') elif np.argmax(pred_real)==2: print('F2') elif np.argmax(pred_real)==3: print('F3') elif np.argmax(pred_real)==4: print('F4') elif np.argmax(pred_real)==5: print('F5') elif np.argmax(pred_real)==6: print('F6') elif np.argmax(pred_real)==7: print('F7') while self.Runtime_data==1: thread4 = threading.Thread(readdata()) thread4.start() thread6 = threading.Thread(readdata_runtime()) thread6.start() i=0 q=0 pred_model() global n time.sleep(0.01) if Runtime_data==2: print("Stop runtime") break self.plc.disconnect() thread5 = threading.Thread(target=run) 81 S K L 0