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/*
dist/*
revpipycontrol.egg-info/*
doc/*
deb/*
.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._createwidgets?5()
revpicheckclient.RevPiCheckClient._readvaluesdev?5(device, iotype)
revpicheckclient.RevPiCheckClient._writevaluesdev?5(device)
revpicheckclient.RevPiCheckClient.myapp?7
revpicheckclient.RevPiCheckClient._readvalues?5()
revpicheckclient.RevPiCheckClient.chval?4(device, io)
revpicheckclient.RevPiCheckClient.cli?7
revpicheckclient.RevPiCheckClient.onfrmconf?4(canvas)
revpicheckclient.RevPiCheckClient.readvalues?4()
revpicheckclient.RevPiCheckClient.root?7
revpicheckclient.RevPiCheckClient.tk?7
revpicheckclient.RevPiCheckClient.toggleauto?4()
revpicheckclient.RevPiCheckClient.writevalues?4()
revpicheckclient.RevPiCheckClient?1(master, xmlcli)
revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0)
revpilogfile.RevPiLogfile._createwidgets?5()
revpilogfile.RevPiLogfile.btn_clearapp?4()
revpilogfile.RevPiLogfile.btn_clearplc?4()

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- 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 -->
<Project version="5.1">
<Language>en_US</Language>
@@ -9,7 +9,7 @@
<ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType>
<Description></Description>
<Version>0.2.12</Version>
<Version>0.4.0</Version>
<Author>Sven Sager</Author>
<Email>akira@narux.de</Email>
<Eol index="-1"/>
@@ -30,6 +30,7 @@
<Other>data</Other>
<Other>doc</Other>
<Other>revpipycontrol.api</Other>
<Other>stdeb.cfg</Other>
</Others>
<MainScript>revpipycontrol/revpipycontrol.py</MainScript>
<Vcs>

View File

@@ -9,28 +9,29 @@
import pickle
import tkinter
from argparse import ArgumentParser
from concurrent.futures import ThreadPoolExecutor
from time import sleep
from xmlrpc.client import ServerProxy, Binary, MultiCall
from threading import Lock
from xmlrpc.client import ServerProxy
class RevPiCheckClient(tkinter.Frame):
def __init__(self, master, xmlcli):
def __init__(self, master, xmlcli, xmlmode=0):
"""Instantiiert MyApp-Klasse."""
super().__init__(master)
self.pack(fill="both", expand=True)
# XML-Daten abrufen
self.xmlmode = xmlmode
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.lst_group = []
self.dict_inpvar = {}
self.dict_outvar = {}
self.lk = Lock()
self.autorw = tkinter.BooleanVar()
self.fut_autorw = None
self.dowrite = tkinter.BooleanVar()
# Fenster aufbauen
self._createwidgets()
@@ -38,33 +39,6 @@ class RevPiCheckClient(tkinter.Frame):
# Aktuelle Werte einlesen
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):
canvas.configure(scrollregion=canvas.bbox("all"))
@@ -85,23 +59,34 @@ class RevPiCheckClient(tkinter.Frame):
)
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(
column=0, row=rowcount, sticky="w"
)
if io[7] >= 0:
if io[4] >= 0:
var = tkinter.BooleanVar()
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["text"] = ""
check["variable"] = var
check.grid(column=1, row=rowcount)
else:
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["width"] = 4
txt["textvariable"] = var
@@ -109,116 +94,127 @@ class RevPiCheckClient(tkinter.Frame):
# Steuerelementvariable in IO übernehmen
io.append(var)
if iotype == "inp":
self.dict_inpvar[device].append(io)
elif iotype == "out":
self.dict_outvar[device].append(io)
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):
"""Erstellt den Fensterinhalt."""
# Hauptfenster
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:
# Variablen vorbereiten
self.dict_inpvar[dev] = []
self.dict_outvar[dev] = []
win = tkinter.Toplevel(self)
win.wm_title(dev[1])
win.protocol(
"WM_DELETE_WINDOW",
lambda win=win: self.__hidewin(win)
)
win.withdraw()
# Devicegruppe erstellen
group = tkinter.LabelFrame(self)
group["text"] = dev
group = tkinter.LabelFrame(win)
group["text"] = dev[1]
group.pack(side="left", fill="both", expand=True)
self.lst_group.append(group)
for iotype in ["inp", "out"]:
frame = tkinter.Frame(group)
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)
# self.btn_update["text"] = "UPDATE"
# self.btn_update["command"] = self._autorw
# self.btn_update.pack(anchor="s", side="bottom", fill="x")
# Button erstellen
btn = tkinter.Button(devgrp)
btn["command"] = lambda win=win: self.__showwin(win)
btn["text"] = dev[1]
btn.pack(fill="x", padx=10, pady=5)
self.btn_write = tkinter.Button(self)
self.btn_write["text"] = "SCHREIBEN"
self.btn_write["command"] = self.writevalues
self.btn_write.pack(side="bottom", fill="x")
# Steuerungsfunktionen
cntgrp = tkinter.LabelFrame(self)
cntgrp["text"] = "Control"
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["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["text"] = "autoupdate"
check["text"] = "autorefresh processimage"
check["variable"] = self.autorw
check.pack(side="bottom")
check.pack(anchor="w")
def _readvaluesdev(self, device, iotype):
"""Ruft alle aktuellen Werte fuer das Device ab."""
# Multicall vorbereiten
mc_values = MultiCall(self.cli)
check = tkinter.Checkbutton(cntgrp)
check["state"] = "disabled" if self.xmlmode < 3 else "normal"
check["text"] = "write values to processimage"
check["variable"] = self.dowrite
check.pack(anchor="w")
if iotype == "inp":
lst_ios = self.dict_inpvar[device]
elif iotype == "out":
lst_ios = self.dict_outvar[device]
def chval(self, device, io):
if self.dowrite.get():
with self.lk:
self.cli.ps_setvalue(device, io[0], io[5].get())
for io in lst_ios:
mc_values.get_iovalue(device, io[0])
# Alles neu einlesen wenn nicht AutoRW aktiv ist
if not self.autorw.get():
self.readvalues()
i = 0
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):
def _readvalues(self):
"""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:
self._readvaluesdev(dev, "inp")
self._readvaluesdev(dev, "out")
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
# 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):
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() \
and (self.fut_autorw is None or self.fut_autorw.done()):
e = ThreadPoolExecutor(max_workers=1)
self.fut_autorw = e.submit(self._autorw)
if self.autorw.get():
self._readvalues()
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__":
root = tkinter.Tk()
myapp = RevPiCheckClient(root)
myapp.mainloop()
cli = ServerProxy("http://192.168.50.35:55123")
cli.psstart()
tk = tkinter.Tk()
RevPiCheckClient(tk, cli, 3)
tk.mainloop()

View File

@@ -17,7 +17,7 @@ from os import environ
from os import makedirs
from shutil import rmtree
from sys import platform
from tempfile import mktemp, mkdtemp
from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary
@@ -415,7 +415,7 @@ class RevPiProgram(tkinter.Frame):
)
if type(dirselect) == str and dirselect != "":
fh = open(mktemp(), "wb")
fh = open(mkstemp(), "wb")
elif tdown == 1:
# Zip

View File

@@ -1,12 +1,13 @@
#!/usr/bin/python3
#
# RevPiPyControl
# Version: 0.2.12
# Version: 0.4.0
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
import revpicheckclient
import revpilogfile
import revpioption
import revpiplclist
@@ -50,6 +51,7 @@ class RevPiPyControl(tkinter.Frame):
self.xmlmode = 0
# Globale Fenster
self.tkcheckclient = None
self.tklogs = None
self.tkoptions = None
self.tkprogram = None
@@ -124,7 +126,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")
@@ -167,6 +169,8 @@ class RevPiPyControl(tkinter.Frame):
self.mbar.entryconfig("PLC", state="normal")
def _closeall(self):
if self.tkcheckclient is not None:
self.tkcheckclient.destroy()
if self.tklogs is not None:
self.tklogs.master.destroy()
if self.tkoptions is not None:
@@ -191,10 +195,17 @@ class RevPiPyControl(tkinter.Frame):
self.tklogs.focus_set()
def plcmonitor(self):
# TODO: Monitorfenster
pass
"""Startet das Monitorfenster."""
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):
"""Startet das Optionsfenster."""
if self.xmlmode < 2:
tkmsg.showwarning(
parent=self.master, title="Warnung",

View File

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