1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-11-08 15:43:52 +01:00

mktemp auf mkstemp umgestellt

PLC monitor aktiviert
revpicheckclient auf revpipyloader angepasst
Module als einzelnes Fenster anzeigen
This commit is contained in:
2017-06-27 16:12:09 +02:00
parent 099266032c
commit e9279e4a53
13 changed files with 1041 additions and 136 deletions

View File

@@ -3,6 +3,6 @@ syntax: glob
deb_dist/* deb_dist/*
dist/* dist/*
revpipycontrol.egg-info/* revpipycontrol.egg-info/*
doc/*
deb/* deb/*
.eric6project/* .eric6project/*
*.directory

136
doc/revpicheckclient.html Normal file
View File

@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html><head>
<title>revpicheckclient</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpicheckclient</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient">RevPiCheckClient</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiCheckClient" ID="RevPiCheckClient"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiCheckClient</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
tkinter.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>cli</td></tr><tr><td>tk</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__init__">RevPiCheckClient</a></td>
<td>Instantiiert MyApp-Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__hidewin">__hidewin</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__showwin">__showwin</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._createiogroup">_createiogroup</a></td>
<td>Erstellt IO-Gruppen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._createwidgets">_createwidgets</a></td>
<td>Erstellt den Fensterinhalt.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._readvalues">_readvalues</a></td>
<td>Alle Werte der Inputs und Outputs abrufen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.chval">chval</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.onfrmconf">onfrmconf</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.readvalues">readvalues</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.toggleauto">toggleauto</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiCheckClient.__init__" ID="RevPiCheckClient.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient (Constructor)</h3>
<b>RevPiCheckClient</b>(<i>master, xmlcli, xmlmode=0</i>)
<p>
Instantiiert MyApp-Klasse.
</p><a NAME="RevPiCheckClient.__hidewin" ID="RevPiCheckClient.__hidewin"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__hidewin</h3>
<b>__hidewin</b>(<i>win, event=None</i>)
<a NAME="RevPiCheckClient.__showwin" ID="RevPiCheckClient.__showwin"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__showwin</h3>
<b>__showwin</b>(<i>win</i>)
<a NAME="RevPiCheckClient._createiogroup" ID="RevPiCheckClient._createiogroup"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._createiogroup</h3>
<b>_createiogroup</b>(<i>device, frame, iotype</i>)
<p>
Erstellt IO-Gruppen.
</p><a NAME="RevPiCheckClient._createwidgets" ID="RevPiCheckClient._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt den Fensterinhalt.
</p><a NAME="RevPiCheckClient._readvalues" ID="RevPiCheckClient._readvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._readvalues</h3>
<b>_readvalues</b>(<i></i>)
<p>
Alle Werte der Inputs und Outputs abrufen.
</p><a NAME="RevPiCheckClient.chval" ID="RevPiCheckClient.chval"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.chval</h3>
<b>chval</b>(<i>device, io</i>)
<a NAME="RevPiCheckClient.onfrmconf" ID="RevPiCheckClient.onfrmconf"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.onfrmconf</h3>
<b>onfrmconf</b>(<i>canvas</i>)
<a NAME="RevPiCheckClient.readvalues" ID="RevPiCheckClient.readvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.readvalues</h3>
<b>readvalues</b>(<i></i>)
<a NAME="RevPiCheckClient.toggleauto" ID="RevPiCheckClient.toggleauto"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.toggleauto</h3>
<b>toggleauto</b>(<i></i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

114
doc/revpilogfile.html Normal file
View File

@@ -0,0 +1,114 @@
<!DOCTYPE html>
<html><head>
<title>revpilogfile</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpilogfile</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiLogfile">RevPiLogfile</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiLogfile" ID="RevPiLogfile"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiLogfile</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
tkinter.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.__init__">RevPiLogfile</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile._createwidgets">_createwidgets</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.btn_clearapp">btn_clearapp</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.btn_clearplc">btn_clearplc</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.get_applines">get_applines</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.get_applog">get_applog</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.get_plclines">get_plclines</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.get_plclog">get_plclog</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiLogfile.__init__" ID="RevPiLogfile.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile (Constructor)</h3>
<b>RevPiLogfile</b>(<i>master, xmlcli</i>)
<a NAME="RevPiLogfile._createwidgets" ID="RevPiLogfile._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<a NAME="RevPiLogfile.btn_clearapp" ID="RevPiLogfile.btn_clearapp"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.btn_clearapp</h3>
<b>btn_clearapp</b>(<i></i>)
<a NAME="RevPiLogfile.btn_clearplc" ID="RevPiLogfile.btn_clearplc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.btn_clearplc</h3>
<b>btn_clearplc</b>(<i></i>)
<a NAME="RevPiLogfile.get_applines" ID="RevPiLogfile.get_applines"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.get_applines</h3>
<b>get_applines</b>(<i></i>)
<a NAME="RevPiLogfile.get_applog" ID="RevPiLogfile.get_applog"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.get_applog</h3>
<b>get_applog</b>(<i></i>)
<a NAME="RevPiLogfile.get_plclines" ID="RevPiLogfile.get_plclines"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.get_plclines</h3>
<b>get_plclines</b>(<i></i>)
<a NAME="RevPiLogfile.get_plclog" ID="RevPiLogfile.get_plclog"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.get_plclog</h3>
<b>get_plclog</b>(<i></i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

100
doc/revpioption.html Normal file
View File

@@ -0,0 +1,100 @@
<!DOCTYPE html>
<html><head>
<title>revpioption</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpioption</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiOption">RevPiOption</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiOption" ID="RevPiOption"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiOption</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
tkinter.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiOption.__init__">RevPiOption</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._createwidgets">_createwidgets</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._loadappdata">_loadappdata</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._setappdata">_setappdata</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.xmlmods">xmlmods</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption (Constructor)</h3>
<b>RevPiOption</b>(<i>master, xmlcli, xmlmode</i>)
<a NAME="RevPiOption._createwidgets" ID="RevPiOption._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._loadappdata</h3>
<b>_loadappdata</b>(<i></i>)
<a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._setappdata</h3>
<b>_setappdata</b>(<i></i>)
<a NAME="RevPiOption.askxmlon" ID="RevPiOption.askxmlon"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.askxmlon</h3>
<b>askxmlon</b>(<i></i>)
<a NAME="RevPiOption.xmlmods" ID="RevPiOption.xmlmods"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmods</h3>
<b>xmlmods</b>(<i></i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

151
doc/revpiplclist.html Normal file
View File

@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html><head>
<title>revpiplclist</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpiplclist</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>savefile</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiPlcList">RevPiPlcList</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#get_connections">get_connections</a></td>
<td></td>
</tr>
</table>
<hr /><hr />
<a NAME="RevPiPlcList" ID="RevPiPlcList"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPlcList</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
tkinter.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>myapp</td></tr><tr><td>root</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.__init__">RevPiPlcList</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList._createwidgets">_createwidgets</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList._loadappdata">_loadappdata</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList._saveappdata">_saveappdata</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.build_listconn">build_listconn</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnadd">evt_btnadd</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnclose">evt_btnclose</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnnew">evt_btnnew</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnremove">evt_btnremove</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnsave">evt_btnsave</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_keypress">evt_keypress</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_listconn">evt_listconn</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiPlcList.__init__" ID="RevPiPlcList.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList (Constructor)</h3>
<b>RevPiPlcList</b>(<i>master</i>)
<a NAME="RevPiPlcList._createwidgets" ID="RevPiPlcList._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<a NAME="RevPiPlcList._loadappdata" ID="RevPiPlcList._loadappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList._loadappdata</h3>
<b>_loadappdata</b>(<i></i>)
<a NAME="RevPiPlcList._saveappdata" ID="RevPiPlcList._saveappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList._saveappdata</h3>
<b>_saveappdata</b>(<i></i>)
<a NAME="RevPiPlcList.build_listconn" ID="RevPiPlcList.build_listconn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.build_listconn</h3>
<b>build_listconn</b>(<i></i>)
<a NAME="RevPiPlcList.evt_btnadd" ID="RevPiPlcList.evt_btnadd"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnadd</h3>
<b>evt_btnadd</b>(<i></i>)
<a NAME="RevPiPlcList.evt_btnclose" ID="RevPiPlcList.evt_btnclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnclose</h3>
<b>evt_btnclose</b>(<i></i>)
<a NAME="RevPiPlcList.evt_btnnew" ID="RevPiPlcList.evt_btnnew"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnnew</h3>
<b>evt_btnnew</b>(<i></i>)
<a NAME="RevPiPlcList.evt_btnremove" ID="RevPiPlcList.evt_btnremove"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnremove</h3>
<b>evt_btnremove</b>(<i></i>)
<a NAME="RevPiPlcList.evt_btnsave" ID="RevPiPlcList.evt_btnsave"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnsave</h3>
<b>evt_btnsave</b>(<i></i>)
<a NAME="RevPiPlcList.evt_keypress" ID="RevPiPlcList.evt_keypress"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_keypress</h3>
<b>evt_keypress</b>(<i>evt=None</i>)
<a NAME="RevPiPlcList.evt_listconn" ID="RevPiPlcList.evt_listconn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_listconn</h3>
<b>evt_listconn</b>(<i>evt=None</i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="get_connections" ID="get_connections"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">get_connections</h2>
<b>get_connections</b>(<i></i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

187
doc/revpiprogram.html Normal file
View File

@@ -0,0 +1,187 @@
<!DOCTYPE html>
<html><head>
<title>revpiprogram</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpiprogram</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>savefile</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiProgram">RevPiProgram</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiProgram" ID="RevPiProgram"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiProgram</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
tkinter.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>myapp</td></tr><tr><td>root</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiProgram.__init__">RevPiProgram</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._createwidgets">_createwidgets</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._evt_optdown">_evt_optdown</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._evt_optup">_evt_optup</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._loaddefault">_loaddefault</a></td>
<td>Uebernimmt fuer den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._savedefaults">_savedefaults</a></td>
<td>Schreibt fuer den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.check_replacedir">check_replacedir</a></td>
<td>Gibt das rootdir von einem entpackten Verzeichnis zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.create_filelist">create_filelist</a></td>
<td>Erstellt eine Dateiliste von einem Verzeichnis.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.getpictoryrsc">getpictoryrsc</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.getprocimg">getprocimg</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.picontrolreset">picontrolreset</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.plcdownload">plcdownload</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.plcupload">plcupload</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.setpictoryrsc">setpictoryrsc</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiProgram.__init__" ID="RevPiProgram.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram (Constructor)</h3>
<b>RevPiProgram</b>(<i>master, xmlcli, xmlmode, revpi</i>)
<a NAME="RevPiProgram._createwidgets" ID="RevPiProgram._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<a NAME="RevPiProgram._evt_optdown" ID="RevPiProgram._evt_optdown"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._evt_optdown</h3>
<b>_evt_optdown</b>(<i>text=""</i>)
<a NAME="RevPiProgram._evt_optup" ID="RevPiProgram._evt_optup"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._evt_optup</h3>
<b>_evt_optup</b>(<i>text=""</i>)
<a NAME="RevPiProgram._loaddefault" ID="RevPiProgram._loaddefault"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._loaddefault</h3>
<b>_loaddefault</b>(<i>full=False</i>)
<p>
Uebernimmt fuer den Pi die letzen Pfade.
</p><a NAME="RevPiProgram._savedefaults" ID="RevPiProgram._savedefaults"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._savedefaults</h3>
<b>_savedefaults</b>(<i></i>)
<p>
Schreibt fuer den Pi die letzen Pfade.
</p><a NAME="RevPiProgram.check_replacedir" ID="RevPiProgram.check_replacedir"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.check_replacedir</h3>
<b>check_replacedir</b>(<i>rootdir</i>)
<p>
Gibt das rootdir von einem entpackten Verzeichnis zurueck.
</p><p>
Dabei wird geprueft, ob es sich um einen einzelnen Ordner handelt
und ob es eine piCtory Konfiguraiton im rootdir gibt.
</p><dl>
<dt><i>rootdir:</i></dt>
<dd>
Verzeichnis fuer Pruefung
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Abgeaendertes rootdir
</dd>
</dl><a NAME="RevPiProgram.create_filelist" ID="RevPiProgram.create_filelist"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.create_filelist</h3>
<b>create_filelist</b>(<i>rootdir</i>)
<p>
Erstellt eine Dateiliste von einem Verzeichnis.
</p><dl>
<dt><i>rootdir:</i></dt>
<dd>
Verzeichnis fuer das eine Liste erstellt werden soll
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Dateiliste
</dd>
</dl><a NAME="RevPiProgram.getpictoryrsc" ID="RevPiProgram.getpictoryrsc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.getpictoryrsc</h3>
<b>getpictoryrsc</b>(<i></i>)
<a NAME="RevPiProgram.getprocimg" ID="RevPiProgram.getprocimg"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.getprocimg</h3>
<b>getprocimg</b>(<i></i>)
<a NAME="RevPiProgram.picontrolreset" ID="RevPiProgram.picontrolreset"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.picontrolreset</h3>
<b>picontrolreset</b>(<i></i>)
<a NAME="RevPiProgram.plcdownload" ID="RevPiProgram.plcdownload"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.plcdownload</h3>
<b>plcdownload</b>(<i></i>)
<a NAME="RevPiProgram.plcupload" ID="RevPiProgram.plcupload"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.plcupload</h3>
<b>plcupload</b>(<i></i>)
<a NAME="RevPiProgram.setpictoryrsc" ID="RevPiProgram.setpictoryrsc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.setpictoryrsc</h3>
<b>setpictoryrsc</b>(<i>filename=None</i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

209
doc/revpipycontrol.html Normal file
View File

@@ -0,0 +1,209 @@
<!DOCTYPE html>
<html><head>
<title>revpipycontrol</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpipycontrol</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiPyControl">RevPiPyControl</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#addroot">addroot</a></td>
<td>H&#228;ngt root-dir der Anwendung vor Dateinamen.</td>
</tr>
</table>
<hr /><hr />
<a NAME="RevPiPyControl" ID="RevPiPyControl"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPyControl</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
tkinter.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>myapp</td></tr><tr><td>root</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.__init__">RevPiPyControl</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._btnstate">_btnstate</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._closeall">_closeall</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._createwidgets">_createwidgets</a></td>
<td>Erstellt den Fensterinhalt.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._fillconnbar">_fillconnbar</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._fillmbar">_fillmbar</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._opt_conn">_opt_conn</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plclist">plclist</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plclogs">plclogs</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcmonitor">plcmonitor</a></td>
<td>Startet das Monitorfenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcoptions">plcoptions</a></td>
<td>Startet das Optionsfenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcprogram">plcprogram</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcrestart">plcrestart</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcstart">plcstart</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcstop">plcstop</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.servererror">servererror</a></td>
<td>Setzt alles auf NULL.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.tmr_plcrunning">tmr_plcrunning</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiPyControl.__init__" ID="RevPiPyControl.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl (Constructor)</h3>
<b>RevPiPyControl</b>(<i>master=None</i>)
<a NAME="RevPiPyControl._btnstate" ID="RevPiPyControl._btnstate"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._btnstate</h3>
<b>_btnstate</b>(<i></i>)
<a NAME="RevPiPyControl._closeall" ID="RevPiPyControl._closeall"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._closeall</h3>
<b>_closeall</b>(<i></i>)
<a NAME="RevPiPyControl._createwidgets" ID="RevPiPyControl._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt den Fensterinhalt.
</p><a NAME="RevPiPyControl._fillconnbar" ID="RevPiPyControl._fillconnbar"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._fillconnbar</h3>
<b>_fillconnbar</b>(<i></i>)
<a NAME="RevPiPyControl._fillmbar" ID="RevPiPyControl._fillmbar"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._fillmbar</h3>
<b>_fillmbar</b>(<i></i>)
<a NAME="RevPiPyControl._opt_conn" ID="RevPiPyControl._opt_conn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._opt_conn</h3>
<b>_opt_conn</b>(<i>text</i>)
<a NAME="RevPiPyControl.plclist" ID="RevPiPyControl.plclist"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plclist</h3>
<b>plclist</b>(<i></i>)
<a NAME="RevPiPyControl.plclogs" ID="RevPiPyControl.plclogs"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plclogs</h3>
<b>plclogs</b>(<i></i>)
<a NAME="RevPiPyControl.plcmonitor" ID="RevPiPyControl.plcmonitor"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcmonitor</h3>
<b>plcmonitor</b>(<i></i>)
<p>
Startet das Monitorfenster.
</p><a NAME="RevPiPyControl.plcoptions" ID="RevPiPyControl.plcoptions"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcoptions</h3>
<b>plcoptions</b>(<i></i>)
<p>
Startet das Optionsfenster.
</p><a NAME="RevPiPyControl.plcprogram" ID="RevPiPyControl.plcprogram"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcprogram</h3>
<b>plcprogram</b>(<i></i>)
<a NAME="RevPiPyControl.plcrestart" ID="RevPiPyControl.plcrestart"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcrestart</h3>
<b>plcrestart</b>(<i></i>)
<a NAME="RevPiPyControl.plcstart" ID="RevPiPyControl.plcstart"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcstart</h3>
<b>plcstart</b>(<i></i>)
<a NAME="RevPiPyControl.plcstop" ID="RevPiPyControl.plcstop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcstop</h3>
<b>plcstop</b>(<i></i>)
<a NAME="RevPiPyControl.servererror" ID="RevPiPyControl.servererror"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.servererror</h3>
<b>servererror</b>(<i></i>)
<p>
Setzt alles auf NULL.
</p><a NAME="RevPiPyControl.tmr_plcrunning" ID="RevPiPyControl.tmr_plcrunning"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.tmr_plcrunning</h3>
<b>tmr_plcrunning</b>(<i></i>)
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="addroot" ID="addroot"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">addroot</h2>
<b>addroot</b>(<i>filename</i>)
<p>
H&#228;ngt root-dir der Anwendung vor Dateinamen.
</p><p>
Je nach Ausf&#252;hrungsart der Anwendung muss das root-dir &#252;ber
andere Arten abgerufen werden.
</p><dl>
<dt><i>filename:</i></dt>
<dd>
Datei oder Ordnername
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
root dir
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,15 +1,15 @@
revpicheckclient.RevPiCheckClient._autorw?5() revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None)
revpicheckclient.RevPiCheckClient.__showwin?6(win)
revpicheckclient.RevPiCheckClient._createiogroup?5(device, frame, iotype) revpicheckclient.RevPiCheckClient._createiogroup?5(device, frame, iotype)
revpicheckclient.RevPiCheckClient._createwidgets?5() revpicheckclient.RevPiCheckClient._createwidgets?5()
revpicheckclient.RevPiCheckClient._readvaluesdev?5(device, iotype) revpicheckclient.RevPiCheckClient._readvalues?5()
revpicheckclient.RevPiCheckClient._writevaluesdev?5(device) revpicheckclient.RevPiCheckClient.chval?4(device, io)
revpicheckclient.RevPiCheckClient.myapp?7 revpicheckclient.RevPiCheckClient.cli?7
revpicheckclient.RevPiCheckClient.onfrmconf?4(canvas) revpicheckclient.RevPiCheckClient.onfrmconf?4(canvas)
revpicheckclient.RevPiCheckClient.readvalues?4() revpicheckclient.RevPiCheckClient.readvalues?4()
revpicheckclient.RevPiCheckClient.root?7 revpicheckclient.RevPiCheckClient.tk?7
revpicheckclient.RevPiCheckClient.toggleauto?4() revpicheckclient.RevPiCheckClient.toggleauto?4()
revpicheckclient.RevPiCheckClient.writevalues?4() revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0)
revpicheckclient.RevPiCheckClient?1(master, xmlcli)
revpilogfile.RevPiLogfile._createwidgets?5() revpilogfile.RevPiLogfile._createwidgets?5()
revpilogfile.RevPiLogfile.btn_clearapp?4() revpilogfile.RevPiLogfile.btn_clearapp?4()
revpilogfile.RevPiLogfile.btn_clearplc?4() revpilogfile.RevPiLogfile.btn_clearplc?4()

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> <!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipycontrol --> <!-- eric project file for project revpipycontrol -->
<!-- Saved: 2017-04-11, 12:38:06 --> <!-- Saved: 2017-06-27, 16:07:48 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2017 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
@@ -9,7 +9,7 @@
<ProgLanguage mixed="0">Python3</ProgLanguage> <ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType> <ProjectType>Console</ProjectType>
<Description></Description> <Description></Description>
<Version>0.2.12</Version> <Version>0.4.0</Version>
<Author>Sven Sager</Author> <Author>Sven Sager</Author>
<Email>akira@narux.de</Email> <Email>akira@narux.de</Email>
<Eol index="-1"/> <Eol index="-1"/>
@@ -30,6 +30,7 @@
<Other>data</Other> <Other>data</Other>
<Other>doc</Other> <Other>doc</Other>
<Other>revpipycontrol.api</Other> <Other>revpipycontrol.api</Other>
<Other>stdeb.cfg</Other>
</Others> </Others>
<MainScript>revpipycontrol/revpipycontrol.py</MainScript> <MainScript>revpipycontrol/revpipycontrol.py</MainScript>
<Vcs> <Vcs>

View File

@@ -9,28 +9,29 @@
import pickle import pickle
import tkinter import tkinter
from argparse import ArgumentParser from threading import Lock
from concurrent.futures import ThreadPoolExecutor from xmlrpc.client import ServerProxy
from time import sleep
from xmlrpc.client import ServerProxy, Binary, MultiCall
class RevPiCheckClient(tkinter.Frame): class RevPiCheckClient(tkinter.Frame):
def __init__(self, master, xmlcli): def __init__(self, master, xmlcli, xmlmode=0):
"""Instantiiert MyApp-Klasse.""" """Instantiiert MyApp-Klasse."""
super().__init__(master) super().__init__(master)
self.pack(fill="both", expand=True) self.pack(fill="both", expand=True)
# XML-Daten abrufen
self.xmlmode = xmlmode
self.cli = xmlcli self.cli = xmlcli
self.cli.psstart()
self.lst_devices = self.cli.ps_devices()
self.dict_inps = pickle.loads(self.cli.ps_inps().data)
self.dict_outs = pickle.loads(self.cli.ps_outs().data)
self.lst_devices = self.cli.get_devicenames() self.lk = Lock()
self.lst_group = []
self.dict_inpvar = {}
self.dict_outvar = {}
self.autorw = tkinter.BooleanVar() self.autorw = tkinter.BooleanVar()
self.fut_autorw = None self.dowrite = tkinter.BooleanVar()
# Fenster aufbauen # Fenster aufbauen
self._createwidgets() self._createwidgets()
@@ -38,33 +39,6 @@ class RevPiCheckClient(tkinter.Frame):
# Aktuelle Werte einlesen # Aktuelle Werte einlesen
self.readvalues() self.readvalues()
def _autorw(self):
dict_inp = {}
dict_out = {}
while self.autorw.get():
for dev in self.lst_devices:
try:
dict_out[dev] = [
value[8].get() for value in self.dict_outvar[dev]
]
except:
print("lasse {} aus".format(dev))
dict_inp = self.cli.refreshvalues(
Binary(pickle.dumps(dict_out, 3))
)
dict_inp = pickle.loads(dict_inp.data)
for dev in dict_inp:
for io in self.dict_inpvar[dev]:
try:
io[8].set(dict_inp[dev].pop(0))
except:
print("lasse {} aus".format(io[0]))
sleep(0.1)
def onfrmconf(self, canvas): def onfrmconf(self, canvas):
canvas.configure(scrollregion=canvas.bbox("all")) canvas.configure(scrollregion=canvas.bbox("all"))
@@ -85,23 +59,34 @@ class RevPiCheckClient(tkinter.Frame):
) )
rowcount = 0 rowcount = 0
for io in self.cli.get_iolist(device, iotype):
# io = [name,default,anzbits,adressbyte,export,adressid,bmk,bitaddress,tkinter_var] if iotype == "inp":
lst_io = self.dict_inps[device]
else:
lst_io = self.dict_outs[device]
for io in lst_io:
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
tkinter.Label(s_frame, text=io[0]).grid( tkinter.Label(s_frame, text=io[0]).grid(
column=0, row=rowcount, sticky="w" column=0, row=rowcount, sticky="w"
) )
if io[7] >= 0: if io[4] >= 0:
var = tkinter.BooleanVar() var = tkinter.BooleanVar()
check = tkinter.Checkbutton(s_frame) check = tkinter.Checkbutton(s_frame)
check["command"] = \
lambda device=device, io=io: self.chval(device, io)
check["state"] = "disabled" if iotype == "inp" else "normal" check["state"] = "disabled" if iotype == "inp" else "normal"
check["text"] = "" check["text"] = ""
check["variable"] = var check["variable"] = var
check.grid(column=1, row=rowcount) check.grid(column=1, row=rowcount)
else: else:
var = tkinter.IntVar() var = tkinter.IntVar()
txt = tkinter.Spinbox(s_frame, to=256) # FIXME: Mehrere Bytes möglich
txt = tkinter.Spinbox(s_frame, to=255 * io[1])
txt["command"] = \
lambda device=device, io=io: self.chval(device, io)
txt["state"] = "disabled" if iotype == "inp" else "normal" txt["state"] = "disabled" if iotype == "inp" else "normal"
txt["width"] = 4 txt["width"] = 4
txt["textvariable"] = var txt["textvariable"] = var
@@ -109,116 +94,127 @@ class RevPiCheckClient(tkinter.Frame):
# Steuerelementvariable in IO übernehmen # Steuerelementvariable in IO übernehmen
io.append(var) io.append(var)
if iotype == "inp":
self.dict_inpvar[device].append(io)
elif iotype == "out":
self.dict_outvar[device].append(io)
rowcount += 1 rowcount += 1
def __hidewin(self, win, event=None):
win.withdraw()
def __showwin(self, win):
if win.winfo_viewable():
win.withdraw()
else:
win.deiconify()
def _createwidgets(self): def _createwidgets(self):
"""Erstellt den Fensterinhalt.""" """Erstellt den Fensterinhalt."""
# Hauptfenster # Hauptfenster
self.master.wm_title("RevPi Onlineview") self.master.wm_title("RevPi Onlineview")
devgrp = tkinter.LabelFrame(self)
devgrp["text"] = "Devices of RevPi"
devgrp.pack(fill="y", side="left")
for dev in self.lst_devices: for dev in self.lst_devices:
# Variablen vorbereiten win = tkinter.Toplevel(self)
self.dict_inpvar[dev] = [] win.wm_title(dev[1])
self.dict_outvar[dev] = [] win.protocol(
"WM_DELETE_WINDOW",
lambda win=win: self.__hidewin(win)
)
win.withdraw()
# Devicegruppe erstellen # Devicegruppe erstellen
group = tkinter.LabelFrame(self) group = tkinter.LabelFrame(win)
group["text"] = dev group["text"] = dev[1]
group.pack(side="left", fill="both", expand=True) group.pack(side="left", fill="both", expand=True)
self.lst_group.append(group)
for iotype in ["inp", "out"]: for iotype in ["inp", "out"]:
frame = tkinter.Frame(group) frame = tkinter.Frame(group)
frame.pack(side="left", fill="both", expand=True) frame.pack(side="left", fill="both", expand=True)
self._createiogroup(dev, frame, iotype) self._createiogroup(dev[0], frame, iotype)
# self.btn_update = tkinter.Button(self) # Button erstellen
# self.btn_update["text"] = "UPDATE" btn = tkinter.Button(devgrp)
# self.btn_update["command"] = self._autorw btn["command"] = lambda win=win: self.__showwin(win)
# self.btn_update.pack(anchor="s", side="bottom", fill="x") btn["text"] = dev[1]
btn.pack(fill="x", padx=10, pady=5)
self.btn_write = tkinter.Button(self) # Steuerungsfunktionen
self.btn_write["text"] = "SCHREIBEN" cntgrp = tkinter.LabelFrame(self)
self.btn_write["command"] = self.writevalues cntgrp["text"] = "Control"
self.btn_write.pack(side="bottom", fill="x") cntgrp.pack(fill="y", side="right")
self.btn_read = tkinter.Button(self) self.btn_read = tkinter.Button(cntgrp)
self.btn_read["text"] = "LESEN" self.btn_read["text"] = "LESEN"
self.btn_read["command"] = self.readvalues self.btn_read["command"] = self.readvalues
self.btn_read.pack(side="bottom", fill="x") self.btn_read.pack(fill="x")
check = tkinter.Checkbutton(self) check = tkinter.Checkbutton(cntgrp)
check["command"] = self.toggleauto check["command"] = self.toggleauto
check["text"] = "autoupdate" check["text"] = "autorefresh processimage"
check["variable"] = self.autorw check["variable"] = self.autorw
check.pack(side="bottom") check.pack(anchor="w")
def _readvaluesdev(self, device, iotype): check = tkinter.Checkbutton(cntgrp)
"""Ruft alle aktuellen Werte fuer das Device ab.""" check["state"] = "disabled" if self.xmlmode < 3 else "normal"
# Multicall vorbereiten check["text"] = "write values to processimage"
mc_values = MultiCall(self.cli) check["variable"] = self.dowrite
check.pack(anchor="w")
if iotype == "inp": def chval(self, device, io):
lst_ios = self.dict_inpvar[device] if self.dowrite.get():
elif iotype == "out": with self.lk:
lst_ios = self.dict_outvar[device] self.cli.ps_setvalue(device, io[0], io[5].get())
for io in lst_ios: # Alles neu einlesen wenn nicht AutoRW aktiv ist
mc_values.get_iovalue(device, io[0]) if not self.autorw.get():
self.readvalues()
i = 0 def _readvalues(self):
for value in mc_values():
value = pickle.loads(value.data)
if type(value) == bytes:
value = int.from_bytes(value, byteorder="little")
lst_ios[i][8].set(value)
i += 1
def _writevaluesdev(self, device):
"""Sendet Werte der Outputs fuer ein Device."""
# Multicall vorbereiten
mc_values = MultiCall(self.cli)
lst_ios = lst_ios = self.dict_outvar[device]
for io in lst_ios:
mc_values.set_iovalue(device, io[0], pickle.dumps(io[8].get(), 3))
# Multicall ausführen
mc_values()
def readvalues(self):
"""Alle Werte der Inputs und Outputs abrufen.""" """Alle Werte der Inputs und Outputs abrufen."""
# Werte aus Prozessabbild einlesen
self.cli.readprocimg() # Werte abrufen
with self.lk:
ba_values = bytearray(self.cli.ps_values().data)
for dev in self.lst_devices: for dev in self.lst_devices:
self._readvaluesdev(dev, "inp") # io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
self._readvaluesdev(dev, "out")
# IO Typ verarbeiten
for iotype in [self.dict_inps, self.dict_outs]:
# ios verarbeiten
for io in iotype[dev[0]]:
# Bytes umwandeln
int_byte = int.from_bytes(
ba_values[io[2]:io[2] + io[1]], byteorder="little"
)
if io[4] >= 0:
# Bit-IO
io[5].set(bool(int_byte & 1 << io[4]))
else:
# Byte-IO
io[5].set(int_byte)
if self.autorw.get():
self.master.after(200, self._readvalues)
def readvalues(self):
if not self.autorw.get():
self._readvalues()
def toggleauto(self): def toggleauto(self):
self.btn_read["state"] = "disabled" if self.autorw.get() else "normal" self.btn_read["state"] = "disabled" if self.autorw.get() else "normal"
self.btn_write["state"] = "disabled" if self.autorw.get() else "normal" if self.autorw.get():
if self.autorw.get() \ self._readvalues()
and (self.fut_autorw is None or self.fut_autorw.done()):
e = ThreadPoolExecutor(max_workers=1)
self.fut_autorw = e.submit(self._autorw)
def writevalues(self):
"""Alle Outputs senden."""
pass
#for dev in self.lst_devices:
#self._writevaluesdev(dev)
# Werte in Prozessabbild schreiben
#self.cli.writeprocimg()
# Testdrive
if __name__ == "__main__": if __name__ == "__main__":
root = tkinter.Tk() cli = ServerProxy("http://192.168.50.35:55123")
myapp = RevPiCheckClient(root) cli.psstart()
myapp.mainloop()
tk = tkinter.Tk()
RevPiCheckClient(tk, cli, 3)
tk.mainloop()

View File

@@ -17,7 +17,7 @@ from os import environ
from os import makedirs from os import makedirs
from shutil import rmtree from shutil import rmtree
from sys import platform from sys import platform
from tempfile import mktemp, mkdtemp from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary from xmlrpc.client import Binary
@@ -363,7 +363,7 @@ class RevPiProgram(tkinter.Frame):
message="Die Übertragung der piCtory Konfiguration " message="Die Übertragung der piCtory Konfiguration "
"wurde erfolgreich ausgeführt") "wurde erfolgreich ausgeführt")
#Einstellungen speichern # Einstellungen speichern
self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name) self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults() self._savedefaults()
elif ec < 0: elif ec < 0:
@@ -382,7 +382,7 @@ class RevPiProgram(tkinter.Frame):
def picontrolreset(self): def picontrolreset(self):
ask = tkmsg.askyesno( ask = tkmsg.askyesno(
parent=self.master, title="Frage...", parent=self.master, title="Frage...",
message="Soll piControlReset wirklich durchgeführt werden? \n" message="Soll piControlReset wirklich durchgeführt werden? \n"
"Das Prozessabbild und die Steuerung werden dann unterbrochen!!!" "Das Prozessabbild und die Steuerung werden dann unterbrochen!!!"
) )
@@ -415,7 +415,7 @@ class RevPiProgram(tkinter.Frame):
) )
if type(dirselect) == str and dirselect != "": if type(dirselect) == str and dirselect != "":
fh = open(mktemp(), "wb") fh = open(mkstemp(), "wb")
elif tdown == 1: elif tdown == 1:
# Zip # Zip

View File

@@ -1,12 +1,13 @@
#!/usr/bin/python3 #!/usr/bin/python3
# #
# RevPiPyControl # RevPiPyControl
# Version: 0.2.12 # Version: 0.4.0
# #
# Webpage: https://revpimodio.org/revpipyplc/ # Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3 # (c) Sven Sager, License: LGPLv3
# #
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import revpicheckclient
import revpilogfile import revpilogfile
import revpioption import revpioption
import revpiplclist import revpiplclist
@@ -50,6 +51,7 @@ class RevPiPyControl(tkinter.Frame):
self.xmlmode = 0 self.xmlmode = 0
# Globale Fenster # Globale Fenster
self.tkcheckclient = None
self.tklogs = None self.tklogs = None
self.tkoptions = None self.tkoptions = None
self.tkprogram = None self.tkprogram = None
@@ -124,7 +126,7 @@ class RevPiPyControl(tkinter.Frame):
# PLC Menü # PLC Menü
self.mplc = tkinter.Menu(self.mbar, tearoff=False) self.mplc = tkinter.Menu(self.mbar, tearoff=False)
self.mplc.add_command(label="PLC log...", command=self.plclogs) 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 options...", command=self.plcoptions)
self.mplc.add_command(label="PLC program...", command=self.plcprogram) self.mplc.add_command(label="PLC program...", command=self.plcprogram)
self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled") self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled")
@@ -167,6 +169,8 @@ class RevPiPyControl(tkinter.Frame):
self.mbar.entryconfig("PLC", state="normal") self.mbar.entryconfig("PLC", state="normal")
def _closeall(self): def _closeall(self):
if self.tkcheckclient is not None:
self.tkcheckclient.destroy()
if self.tklogs is not None: if self.tklogs is not None:
self.tklogs.master.destroy() self.tklogs.master.destroy()
if self.tkoptions is not None: if self.tkoptions is not None:
@@ -191,10 +195,17 @@ class RevPiPyControl(tkinter.Frame):
self.tklogs.focus_set() self.tklogs.focus_set()
def plcmonitor(self): def plcmonitor(self):
# TODO: Monitorfenster """Startet das Monitorfenster."""
pass if self.tkcheckclient is None or len(self.tkcheckclient.children) == 0:
win = tkinter.Toplevel(self)
self.tkcheckclient = revpicheckclient.RevPiCheckClient(
win, self.cli, self.xmlmode
)
else:
self.tkcheckclient.focus_set()
def plcoptions(self): def plcoptions(self):
"""Startet das Optionsfenster."""
if self.xmlmode < 2: if self.xmlmode < 2:
tkmsg.showwarning( tkmsg.showwarning(
parent=self.master, title="Warnung", parent=self.master, title="Warnung",

View File

@@ -23,7 +23,7 @@ globsetup = {
"author_email": "akira@narux.de", "author_email": "akira@narux.de",
"url": "https://revpimodio.org/revpipyplc/", "url": "https://revpimodio.org/revpipyplc/",
"license": "LGPLv3", "license": "LGPLv3",
"version": "0.2.12", "version": "0.4.0",
"name": "revpipycontrol", "name": "revpipycontrol",