From cc03ede267c2269dde2af3fdeb4dcdb04ef0bb76 Mon Sep 17 00:00:00 2001 From: NaruX Date: Thu, 16 Mar 2017 16:32:47 +0100 Subject: [PATCH] bugfixes Logviewer umgebaut Fenster schlie?en bei Verbindungsfehler Verbindungscheck mit Z?hlercounter --- revpipycontrol.e4p | 8 +++-- revpipycontrol/__init__.py | 0 revpipycontrol/revpilogfile.py | 53 +++++++++++++++++++++++++------ revpipycontrol/revpioption.py | 5 ++- revpipycontrol/revpiprogram.py | 1 + revpipycontrol/revpipycontrol.py | 54 +++++++++++++++++++++++--------- setup.py | 2 +- 7 files changed, 93 insertions(+), 30 deletions(-) delete mode 100644 revpipycontrol/__init__.py diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p index 59d6c76..7fdd4cd 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,7 +1,7 @@ - + en_US @@ -9,7 +9,7 @@ Python3 Console - 0.2.1 + 0.2.6 Sven Sager akira@narux.de @@ -27,7 +27,9 @@ - + + data + revpipycontrol/revpipycontrol.py Mercurial diff --git a/revpipycontrol/__init__.py b/revpipycontrol/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/revpipycontrol/revpilogfile.py b/revpipycontrol/revpilogfile.py index c1a7884..9113d5d 100644 --- a/revpipycontrol/revpilogfile.py +++ b/revpipycontrol/revpilogfile.py @@ -21,21 +21,42 @@ class RevPiLogfile(tkinter.Frame): def _createwidgets(self): self.master.wm_title("RevPi Python PLC Logs") + self.rowconfigure(0, weight=0) + self.rowconfigure(1, weight=1) + self.columnconfigure(0, weight=1) + self.columnconfigure(1, weight=0) + self.columnconfigure(2, weight=0) + self.columnconfigure(3, weight=1) + self.columnconfigure(4, weight=0) + self.columnconfigure(5, weight=0) + # PLC Log + self.lblapplog = tkinter.Label(self) + self.lblapplog["text"] = "RevPyPyLoad - Logfile" + self.lblapplog.grid(column=0, row=0, sticky="w") + self.btnapplog = tkinter.Button(self) + self.btnapplog["command"] = self.btn_clearplc + self.btnapplog["text"] = "Clear screen" + self.btnapplog.grid(column=1, row=0, sticky="e") self.plclog = tkinter.Text(self) self.plcscr = tkinter.Scrollbar(self) - self.plclog.pack(side="left", expand=True, fill="both") - self.plcscr.pack(side="left", fill="y") - # self.plclog["state"] = "disabled" + self.plclog.grid(sticky="wnse", columnspan=2, column=0, row=1) + self.plcscr.grid(sticky="ns", column=2, row=1) self.plclog["yscrollcommand"] = self.plcscr.set self.plcscr["command"] = self.plclog.yview # APP Log + self.lblapplog = tkinter.Label(self) + self.lblapplog["text"] = "Python PLC program - Logfile" + self.lblapplog.grid(column=3, row=0, sticky="w") + self.btnapplog = tkinter.Button(self) + self.btnapplog["command"] = self.btn_clearapp + self.btnapplog["text"] = "Clear screen" + self.btnapplog.grid(column=4, row=0, sticky="e") self.applog = tkinter.Text(self) self.appscr = tkinter.Scrollbar(self) - self.appscr.pack(side="right", fill="y") - self.applog.pack(side="right", expand=True, fill="both") - # self.applog["state"] = "disabled" + self.applog.grid(sticky="nesw", columnspan=2, column=3, row=1) + self.appscr.grid(sticky="ns", column=5, row=1) self.applog["yscrollcommand"] = self.appscr.set self.appscr["command"] = self.applog.yview @@ -46,10 +67,19 @@ class RevPiLogfile(tkinter.Frame): self.master.after(1000, self.get_applines) self.master.after(1000, self.get_plclines) + def btn_clearapp(self): + self.applog.delete(1.0, tkinter.END) + + def btn_clearplc(self): + self.plclog.delete(1.0, tkinter.END) + def get_applines(self): roll = self.applog.yview()[1] == 1.0 - for line in self.xmlcli.get_applines(): - self.applog.insert(tkinter.END, line) + try: + for line in self.xmlcli.get_applines(): + self.applog.insert(tkinter.END, line) + except: + pass if roll: self.applog.see(tkinter.END) self.master.after(1000, self.get_applines) @@ -61,8 +91,11 @@ class RevPiLogfile(tkinter.Frame): def get_plclines(self): roll = self.plclog.yview()[1] == 1.0 - for line in self.xmlcli.get_plclines(): - self.plclog.insert(tkinter.END, line) + try: + for line in self.xmlcli.get_plclines(): + self.plclog.insert(tkinter.END, line) + except: + pass if roll: self.plclog.see(tkinter.END) self.master.after(1000, self.get_plclines) diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py index 567cbca..243b2ba 100644 --- a/revpipycontrol/revpioption.py +++ b/revpipycontrol/revpioption.py @@ -84,8 +84,11 @@ class RevPiOption(tkinter.Frame): lbl = tkinter.Label(prog) lbl["text"] = "Python PLC Programname" lbl.grid(columnspan=2, **cpadw) + lst = self.xmlcli.get_filelist() + if len(lst) == 0: + lst.append("none") opt_startpy = tkinter.OptionMenu( - prog, self.var_startpy, *self.xmlcli.get_filelist()) + prog, self.var_startpy, *lst) opt_startpy.grid(columnspan=2, **cpadwe) ckb_slave = tkinter.Checkbutton(prog, justify="left") ckb_slave["text"] = "RevPi als PLC-Slave verwenden" diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py index 4d9faaf..6c7264f 100644 --- a/revpipycontrol/revpiprogram.py +++ b/revpipycontrol/revpiprogram.py @@ -286,6 +286,7 @@ class RevPiProgram(tkinter.Frame): ) ec = self.xmlcli.set_pictoryrsc(Binary(fh.read()), ask) + print(ec) if ec == 0: if ask: tkmsg.showinfo( diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index a639527..48bfb82 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 # # RevPiPyControl -# Version: 0.2.1 +# Version: 0.2.6 # # Webpage: https://revpimodio.org/revpipyplc/ # (c) Sven Sager, License: LGPLv3 @@ -20,7 +20,7 @@ from os.path import dirname from os.path import join as pathjoin from xmlrpc.client import ServerProxy -socket.setdefaulttimeout(3) +socket.setdefaulttimeout(2) def addroot(filename): u"""Hängt root-dir der Anwendung vor Dateinamen. @@ -46,8 +46,14 @@ class RevPiPyControl(tkinter.Frame): self.cli = None self.dict_conn = revpiplclist.get_connections() + self.errcount = 0 self.revpiname = None + # Globale Fenster + self.tklogs = None + self.tkoptions = None + self.tkprogram = None + # Fenster aufbauen self._createwidgets() @@ -118,7 +124,7 @@ class RevPiPyControl(tkinter.Frame): # PLC Menü self.mplc = tkinter.Menu(self.mbar, tearoff=False) self.mplc.add_command(label="PLC log...", command=self.plclogs) - self.mplc.add_command(label="PLC monitor...", command=self.plcmonitor) + #self.mplc.add_command(label="PLC monitor...", command=self.plcmonitor) self.mplc.add_command(label="PLC options...", command=self.plcoptions) self.mplc.add_command(label="PLC program...", command=self.plcprogram) self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled") @@ -135,7 +141,6 @@ class RevPiPyControl(tkinter.Frame): ) def _opt_conn(self, text): - socket.setdefaulttimeout(20) sp = ServerProxy( "http://{}:{}".format( self.dict_conn[text][0], int(self.dict_conn[text][1]) @@ -147,13 +152,27 @@ class RevPiPyControl(tkinter.Frame): except: self.servererror() else: - self.cli = sp + self._closeall() + socket.setdefaulttimeout(15) + self.cli = ServerProxy( + "http://{}:{}".format( + self.dict_conn[text][0], int(self.dict_conn[text][1]) + ) + ) self.revpiname = text self.var_conn.set("{} - {}:{}".format( text, self.dict_conn[text][0], int(self.dict_conn[text][1]) )) self.mbar.entryconfig("PLC", state="normal") + def _closeall(self): + if self.tklogs is not None: + self.tklogs.master.destroy() + if self.tkoptions is not None: + self.tkoptions.destroy() + if self.tkprogram is not None: + self.tkprogram.destroy() + def plclist(self): win = tkinter.Toplevel(self) revpiplclist.RevPiPlcList(win) @@ -175,14 +194,14 @@ class RevPiPyControl(tkinter.Frame): def plcoptions(self): win = tkinter.Toplevel(self) - revpioption.RevPiOption(win, self.cli) + self.tkoptions = revpioption.RevPiOption(win, self.cli) win.focus_set() win.grab_set() self.wait_window(win) def plcprogram(self): win = tkinter.Toplevel(self) - revpiprogram.RevPiProgram(win, self.cli, self.revpiname) + self.tkprogram = revpiprogram.RevPiProgram(win, self.cli, self.revpiname) win.focus_set() win.grab_set() self.wait_window(win) @@ -198,11 +217,15 @@ class RevPiPyControl(tkinter.Frame): self.cli.plcstart() def servererror(self): - socket.setdefaulttimeout(3) + """Setzt alles auf NULL.""" + socket.setdefaulttimeout(2) self.cli = None self._btnstate() self.mbar.entryconfig("PLC", state="disabled") self.var_conn.set("") + + self._closeall() + tkmsg.showerror("Fehler", "Server ist nicht erreichbar!") def tmr_plcrunning(self): @@ -212,16 +235,17 @@ class RevPiPyControl(tkinter.Frame): self.var_status.set("NOT CONNECTED") else: try: - if self.cli.plcrunning(): - self.txt_status["readonlybackground"] = "green" - else: - self.txt_status["readonlybackground"] = "red" - plcec = self.cli.plcexitcode() except: - self.var_status.set("SERVER ERROR") - self.servererror() + self.errcount += 1 + if self.errcount >= 5: + self.var_status.set("SERVER ERROR") + self.servererror() else: + self.errcount = 0 + self.txt_status["readonlybackground"] = \ + "green" if plcec == -1 else "red" + if plcec == -1: plcec = "RUNNING" elif plcec == -2: diff --git a/setup.py b/setup.py index 1fa2b71..3dcc4b1 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ globsetup = { "author_email": "akira@narux.de", "url": "https://revpimodio.org/revpipyplc/", "license": "LGPLv3", - "version": "0.2.1", + "version": "0.2.6", "name": "revpipycontrol",