Habe folgende Fehlermeldung, die ich einfach nicht weggrkiege. Evtl kann jemand von euch mir helfen. Ich bin leider kein Hirsch in der Python umgebung.
Es geht um ein Projekt, wo ich über eine externe Hardware mit einem Raspberrypi Werte über die GUI auslese und einen Plot erzeuge.
Die ausgelesenen Werte möchte ich nun in der Datenbank mit einem Save Knopf in der GUI Speichern aber leider kommt immer dieser Fehler:
Traceback (most recent call last):
File "C:/ABBTS/Semester 5/B21-ga5.1_Engineering with Software (ENS)/GUI_Qt/plc_NEU/plc/Main.py", line 177, in <module>
window = UI()
File "C:/ABBTS/Semester 5/B21-ga5.1_Engineering with Software (ENS)/GUI_Qt/plc_NEU/plc/Main.py", line 47, in __init__
self.save_database.clicked.connect(self.save_database(self.Name_measurement.text(),self.IP_Address_history.currentText(),self.Ports_history.currentText(),self.CSV_txt_file_names,self.matplotlib_png_file_name,"N/A",self.labels))
AttributeError: 'UI' object has no attribute 'CSV_txt_file_names'
Process finished with exit code 1
Wenn mir jemand helfen kann wäre das echt super !!!
HIER DER GESAMTE CODE:
Code: Alles auswählen
import csv # zum Arbeiten mit CSV Dateien
from itertools import count # Verwendung bei map() um aufeinanderfolgende Datenpunkte zu generieren. = Schnellere ausfühurngszeit
from opcua import Client #Import von OPC UA für Kommunikation mit Codesys
import matplotlib.pyplot as plt # Für die Ploterzeugung
import sqlite3 # Datenbank
conn = sqlite3.connect('Database_.db') # Connect mit der Datenbank
from csv import DictWriter # Um den IP Verlauf in die CSV Datei zu schreiben
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton,QComboBox,QLineEdit,QMessageBox,QFileDialog # Für die GUI Anwendungen
from PyQt5 import uic #Für die UI
import sys #Für den zugriff auf Systemspezifische Parameter
class UI(QMainWindow):
def __init__(self):
super(UI, self).__init__()
uic.loadUi("ui.ui", self)
self.ip=[]
self.ports=[]
self.headersCSV = ['IP','PORT']
self.setWindowTitle('EWS Klausur')
############# ComboBox ##################################################
self.IP_Address_history = self.findChild(QComboBox, "Ip_address_history")
self.Ports_history = self.findChild(QComboBox, "ports_history")
############# Line_Edit #################################################
self.add_ip= self.findChild(QLineEdit, "add_ip")
self.add_ports= self.findChild(QLineEdit, "add_port")
self.Name_measurement= self.findChild(QLineEdit, "Name_measurement")
############# Buttons ###################################################
self.connect = self.findChild(QPushButton,"connect")
self.add = self.findChild(QPushButton,"add")
self.read = self.findChild(QPushButton,"read")
self.save = self.findChild(QPushButton,"save")
self.save_database = self.findChild(QPushButton,"save_database")
############# Buttons - clicked #######################################
self.connect.clicked.connect(self.Connection)
self.add.clicked.connect(self.add_ip_port)
self.read.clicked.connect(self.main)
self.save.clicked.connect(self.save_file)
self.save_database.clicked.connect(self.save_database(self.Name_measurement.text(),self.IP_Address_history.currentText(),self.Ports_history.currentText(),self.CSV_txt_file_names,self.matplotlib_png_file_name,"N/A",self.labels))
self.show()
def save_database(self,Name_measurement,IP_address,port_number,CSV_txt_file_names,matplotlib_png_file_name,times,labels):
data = [(Name_measurement,IP_address,port_number,CSV_txt_file_names,matplotlib_png_file_name,times,labels)]
conn.executemany("INSERT INTO Measurement (Name_measurement,IP_address,port_number,CSV_txt_file_names,matplotlib_png_file_name,times,labels) \
VALUES (?,?,?,?,?,?,?)",data);
conn.commit()
conn.close()
def Connection(self):
############# Data_History_saving########################################
if self.IP_Address_history.currentText() == "" or self.Ports_history.currentText() == "":
self.msg_box= QMessageBox()
self.msg_box.setIcon(QMessageBox.Warning)
self.msg_box.setText("Insert values in the required fileds")
self.msg_box.setWindowTitle("Warning")
self.msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
retval = self.msg_box.exec_()
print("insert values in the required fileds")
else:
self.main()
def add_ip_port(self):
if self.add_ip.text() == "" or self.add_ports.text() == "":
self.msg_box= QMessageBox()
self.msg_box.setIcon(QMessageBox.Warning)
self.msg_box.setText("Insert values in the required fileds")
self.msg_box.setWindowTitle("Warning")
self.msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
retval = self.msg_box.exec_()
else:
self.ip.append(self.add_ip.text())
self.ports.append(self.add_ports.text())
with open ('Data.csv','a', newline='') as data:
writer = DictWriter(data, fieldnames=self.headersCSV)
ip = self.add_ip.text().strip()
port = self.add_ports.text().strip()
temp ={'IP':ip,'PORT':port}
print(temp)
writer.writerow(temp)
self.IP_Address_history.addItems(self.ip)
self.Ports_history.addItems(self.ports)
data.close()
def get_opc_child(self,root, channel):
return root.get_child([
"0:Objects",
"2:DeviceSet",
"4:CODESYS Control for Raspberry Pi SL",
"3:Resources",
"4:app",
"3:Programs",
"4:MAIN",
f"4:OpcUA_U_{channel}"])
def read_channels(self,client):
try:
client.connect()
root = client.get_root_node()
self.change_status_of_connection_btn(1)
return [self.get_opc_child(root,channel).get_value() for channel in ["in1", "in2", "out1", "out2", "out3"] ]
except:
client.disconnect()
self.change_status_of_connection_btn(0)
def write_values(self,values):
self.CSV_txt_file_names = "C:\ABBTS\Semester 5\B21-ga5.1_Engineering with Software (ENS)\GUI_Qt\plc_NEU\plc/BORIS.txt"
with open(self.CSV_txt_file_names, "w", encoding="utf8") as file:
times = (0.005 * t for t in count())
writer = csv.writer(file, delimiter="\t", lineterminator="\r")
for row in zip(times, *values):
writer.writerow(map("{:.3f}".format, row))
def plot_values(self,values):
self.labels = "In1"+"In2"+"Out1"+"Out2"+"Out3"
plt.axis([0.0, 5.0, -4.0, 8.0])
times = [0.005 * t for t in range(len(values[0]))]
for numbers, label, color in zip(values,
["In1", "In2", "Out1", "Out2", "Out3"],
["green", "purple", "cyan", "orange", "red"]):
self.MplWidget.canvas.axes.clear()
plt.plot(times, numbers, label=label, color=color, linestyle="-", linewidth=2.5)
self.MplWidget.canvas.axes.plot(times, numbers, label=label, color=color, linestyle="-", linewidth=2.5)
self.MplWidget.canvas.draw()
plt.title('SPS_Signals', fontsize=26, color='blue')
plt.legend(loc='best')
plt.grid(False)
self.matplotlib_png_file_name = 'C:\ABBTS\Semester 5\B21-ga5.1_Engineering with Software (ENS)\GUI_Qt\plc_NEU\plc/SPS_Signal.png'
plt.savefig(self.matplotlib_png_file_name)
plt.show()
def main(self):
client = Client("opc.tcp://"+self.IP_Address_history.currentText()+":"+self.Ports_history.currentText())
values = self.read_channels(client)
self.write_values(values)
self.plot_values(values)
def save_file(self):
filepath, _ = QFileDialog.getSaveFileName(self,"Save file","","DOCX(*.DOCX) ;;JPEG(*.jpg *.jpeg) ;; ALL Files(*.*)")
if filepath == "":
return
from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('SPS_Logger_OPC-UA', 0)
document.add_heading('Meine Messungen', level=0)
document.add_picture('C:\ABBTS\Semester 5\B21-ga5.1_Engineering with Software (ENS)\GUI_Qt\plc_NEU\plc\SPS_Signal.png', width=Inches(5))
document.add_heading('In1 ist das Signal von OpcUA_U_in1 und kommt von WaveformsSquare', level=2)
document.add_heading('In2 ist das Signal von OpcUA_U_in2 und kommt von WaveformsTriangle', level=2)
document.add_heading('Out1 ist das Signal OpcUA_U_out1 = In1 - In2', level=2)
document.add_heading('Out2 ist das Signal OpcUA_U_out2 = In1 + In2', level=2)
document.add_heading('Out3 ist das Signal OpcUA_U_out3 = 0.527', level=2)
document.add_page_break(), document.save('test.docx')
def change_status_of_connection_btn(self,stat):
# 1 == connected
# 0 == not connected
if stat == 1:
self.connect.setStyleSheet("background-color:rgb(0, 255, 0);")
if stat == 0:
self.connect.setStyleSheet("background-color:rgb(255, 0, 0);")
app = QApplication(sys.argv)
window = UI()
app.exec_()