mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
replace_io_file nimmt nun Wert :network: und läd Konfiguration über RevPiPyLoad
._configure_replace_io ist eigenständige Funktion ._get_cpreplaceio für Überschreibungen bei Vererbung hinzugefügt
This commit is contained in:
@@ -86,6 +86,9 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiModIO._get_configrsc">_get_configrsc</a></td>
|
<td><a style="color:#0000FF" href="#RevPiModIO._get_configrsc">_get_configrsc</a></td>
|
||||||
<td>Getter function.</td>
|
<td>Getter function.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiModIO._get_cpreplaceio">_get_cpreplaceio</a></td>
|
||||||
|
<td>Laed die replace_io_file Konfiguration und verarbeitet sie.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td>
|
<td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td>
|
||||||
<td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td>
|
<td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -219,19 +222,27 @@ RevPiModIO._configure</h3>
|
|||||||
<b>_configure</b>(<i>jconfigrsc</i>)
|
<b>_configure</b>(<i>jconfigrsc</i>)
|
||||||
<p>
|
<p>
|
||||||
Verarbeitet die piCtory Konfigurationsdatei.
|
Verarbeitet die piCtory Konfigurationsdatei.
|
||||||
</p><a NAME="RevPiModIO._configure_replace_io" ID="RevPiModIO._configure_replace_io"></a>
|
</p><dl>
|
||||||
|
<dt><i>jconfigrsc:</i></dt>
|
||||||
|
<dd>
|
||||||
|
Data to build IOs as <class 'dict'> of JSON
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiModIO._configure_replace_io" ID="RevPiModIO._configure_replace_io"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO._configure_replace_io</h3>
|
RevPiModIO._configure_replace_io</h3>
|
||||||
<b>_configure_replace_io</b>(<i></i>)
|
<b>_configure_replace_io</b>(<i>creplaceio</i>)
|
||||||
<p>
|
<p>
|
||||||
Importiert ersetzte IOs in diese Instanz.
|
Importiert ersetzte IOs in diese Instanz.
|
||||||
</p><p>
|
</p><p>
|
||||||
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
||||||
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
||||||
Instanz wiederhergestellt.
|
Instanz wiederhergestellt.
|
||||||
</p><p>
|
</p><dl>
|
||||||
|
<dt><i>ireplaceio:</i></dt>
|
||||||
</p><a NAME="RevPiModIO._create_myfh" ID="RevPiModIO._create_myfh"></a>
|
<dd>
|
||||||
|
Data to replace ios as <class 'ConfigParser'>
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiModIO._create_myfh" ID="RevPiModIO._create_myfh"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO._create_myfh</h3>
|
RevPiModIO._create_myfh</h3>
|
||||||
<b>_create_myfh</b>(<i></i>)
|
<b>_create_myfh</b>(<i></i>)
|
||||||
@@ -249,6 +260,17 @@ Getter function.
|
|||||||
<dd>
|
<dd>
|
||||||
Pfad der verwendeten piCtory Konfiguration
|
Pfad der verwendeten piCtory Konfiguration
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="RevPiModIO._get_cpreplaceio" ID="RevPiModIO._get_cpreplaceio"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiModIO._get_cpreplaceio</h3>
|
||||||
|
<b>_get_cpreplaceio</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Laed die replace_io_file Konfiguration und verarbeitet sie.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
<class 'ConfigParser'> der replace io daten
|
||||||
|
</dd>
|
||||||
</dl><a NAME="RevPiModIO._get_cycletime" ID="RevPiModIO._get_cycletime"></a>
|
</dl><a NAME="RevPiModIO._get_cycletime" ID="RevPiModIO._get_cycletime"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO._get_cycletime</h3>
|
RevPiModIO._get_cycletime</h3>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ RevPiModIO Hauptklasse fuer Netzwerkzugriff.
|
|||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Global Attributes</h3>
|
Global Attributes</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>_sysdeldirty</td></tr><tr><td>_sysexit</td></tr><tr><td>_sysflush</td></tr><tr><td>_syspictory</td></tr><tr><td>_syssync</td></tr>
|
<tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>_sysdeldirty</td></tr><tr><td>_sysexit</td></tr><tr><td>_sysflush</td></tr><tr><td>_syspictory</td></tr><tr><td>_sysreplaceio</td></tr><tr><td>_syssync</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Classes</h3>
|
Classes</h3>
|
||||||
@@ -110,6 +110,9 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#NetFH.readpictory">readpictory</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.readpictory">readpictory</a></td>
|
||||||
<td>Ruft die piCtory Konfiguration ab.</td>
|
<td>Ruft die piCtory Konfiguration ab.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#NetFH.readreplaceio">readreplaceio</a></td>
|
||||||
|
<td>Ruft die replace_io Konfiguration ab.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#NetFH.run">run</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.run">run</a></td>
|
||||||
<td>Handler fuer Synchronisierung.</td>
|
<td>Handler fuer Synchronisierung.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -293,6 +296,17 @@ Ruft die piCtory Konfiguration ab.
|
|||||||
<dd>
|
<dd>
|
||||||
<class 'bytes'> piCtory Datei
|
<class 'bytes'> piCtory Datei
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="NetFH.readreplaceio" ID="NetFH.readreplaceio"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
NetFH.readreplaceio</h3>
|
||||||
|
<b>readreplaceio</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Ruft die replace_io Konfiguration ab.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
<class 'bytes'> replace_io_file
|
||||||
|
</dd>
|
||||||
</dl><a NAME="NetFH.run" ID="NetFH.run"></a>
|
</dl><a NAME="NetFH.run" ID="NetFH.run"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
NetFH.run</h3>
|
NetFH.run</h3>
|
||||||
@@ -402,6 +416,9 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiNetIO._create_myfh">_create_myfh</a></td>
|
<td><a style="color:#0000FF" href="#RevPiNetIO._create_myfh">_create_myfh</a></td>
|
||||||
<td>Erstellt NetworkFileObject.</td>
|
<td>Erstellt NetworkFileObject.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiNetIO._get_cpreplaceio">_get_cpreplaceio</a></td>
|
||||||
|
<td>Laed die replace_io Konfiguration ueber das Netzwerk.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiNetIO.disconnect">disconnect</a></td>
|
<td><a style="color:#0000FF" href="#RevPiNetIO.disconnect">disconnect</a></td>
|
||||||
<td>Trennt Verbindungen und beendet autorefresh inkl.</td>
|
<td>Trennt Verbindungen und beendet autorefresh inkl.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -456,7 +473,18 @@ RevPiNetIO._create_myfh</h3>
|
|||||||
<p>
|
<p>
|
||||||
Erstellt NetworkFileObject.
|
Erstellt NetworkFileObject.
|
||||||
return FileObject
|
return FileObject
|
||||||
</p><a NAME="RevPiNetIO.disconnect" ID="RevPiNetIO.disconnect"></a>
|
</p><a NAME="RevPiNetIO._get_cpreplaceio" ID="RevPiNetIO._get_cpreplaceio"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiNetIO._get_cpreplaceio</h3>
|
||||||
|
<b>_get_cpreplaceio</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Laed die replace_io Konfiguration ueber das Netzwerk.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
<class 'ConfigParser'> der replace io daten
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiNetIO.disconnect" ID="RevPiNetIO.disconnect"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiNetIO.disconnect</h3>
|
RevPiNetIO.disconnect</h3>
|
||||||
<b>disconnect</b>(<i></i>)
|
<b>disconnect</b>(<i></i>)
|
||||||
|
|||||||
@@ -141,9 +141,10 @@ revpimodio2.io.StructIO.signed?7
|
|||||||
revpimodio2.io.StructIO.value?7
|
revpimodio2.io.StructIO.value?7
|
||||||
revpimodio2.io.StructIO?1(parentio, name, frm, **kwargs)
|
revpimodio2.io.StructIO?1(parentio, name, frm, **kwargs)
|
||||||
revpimodio2.modio.RevPiModIO._configure?5(jconfigrsc)
|
revpimodio2.modio.RevPiModIO._configure?5(jconfigrsc)
|
||||||
revpimodio2.modio.RevPiModIO._configure_replace_io?5()
|
revpimodio2.modio.RevPiModIO._configure_replace_io?5(creplaceio)
|
||||||
revpimodio2.modio.RevPiModIO._create_myfh?5()
|
revpimodio2.modio.RevPiModIO._create_myfh?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_configrsc?5()
|
revpimodio2.modio.RevPiModIO._get_configrsc?5()
|
||||||
|
revpimodio2.modio.RevPiModIO._get_cpreplaceio?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_cycletime?5()
|
revpimodio2.modio.RevPiModIO._get_cycletime?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_ioerrors?5()
|
revpimodio2.modio.RevPiModIO._get_ioerrors?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_length?5()
|
revpimodio2.modio.RevPiModIO._get_length?5()
|
||||||
@@ -191,6 +192,7 @@ revpimodio2.netio.NetFH.ioctl?4(request, arg=b'')
|
|||||||
revpimodio2.netio.NetFH.name?7
|
revpimodio2.netio.NetFH.name?7
|
||||||
revpimodio2.netio.NetFH.read?4(length)
|
revpimodio2.netio.NetFH.read?4(length)
|
||||||
revpimodio2.netio.NetFH.readpictory?4()
|
revpimodio2.netio.NetFH.readpictory?4()
|
||||||
|
revpimodio2.netio.NetFH.readreplaceio?4()
|
||||||
revpimodio2.netio.NetFH.run?4()
|
revpimodio2.netio.NetFH.run?4()
|
||||||
revpimodio2.netio.NetFH.seek?4(position)
|
revpimodio2.netio.NetFH.seek?4(position)
|
||||||
revpimodio2.netio.NetFH.set_dirtybytes?4(position, dirtybytes)
|
revpimodio2.netio.NetFH.set_dirtybytes?4(position, dirtybytes)
|
||||||
@@ -200,6 +202,7 @@ revpimodio2.netio.NetFH.timeout?7
|
|||||||
revpimodio2.netio.NetFH.write?4(bytebuff)
|
revpimodio2.netio.NetFH.write?4(bytebuff)
|
||||||
revpimodio2.netio.NetFH?1(address, timeout=500)
|
revpimodio2.netio.NetFH?1(address, timeout=500)
|
||||||
revpimodio2.netio.RevPiNetIO._create_myfh?5()
|
revpimodio2.netio.RevPiNetIO._create_myfh?5()
|
||||||
|
revpimodio2.netio.RevPiNetIO._get_cpreplaceio?5()
|
||||||
revpimodio2.netio.RevPiNetIO.disconnect?4()
|
revpimodio2.netio.RevPiNetIO.disconnect?4()
|
||||||
revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4()
|
revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4()
|
||||||
revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None)
|
revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None)
|
||||||
@@ -211,5 +214,6 @@ revpimodio2.netio._sysdeldirty?8
|
|||||||
revpimodio2.netio._sysexit?8
|
revpimodio2.netio._sysexit?8
|
||||||
revpimodio2.netio._sysflush?8
|
revpimodio2.netio._sysflush?8
|
||||||
revpimodio2.netio._syspictory?8
|
revpimodio2.netio._syspictory?8
|
||||||
|
revpimodio2.netio._sysreplaceio?8
|
||||||
revpimodio2.netio._syssync?8
|
revpimodio2.netio._syssync?8
|
||||||
revpimodio2.summary.Summary?1(summary)
|
revpimodio2.summary.Summary?1(summary)
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ class RevPiModIO(object):
|
|||||||
# Nur Konfigurieren, wenn nicht vererbt
|
# Nur Konfigurieren, wenn nicht vererbt
|
||||||
if type(self) == RevPiModIO:
|
if type(self) == RevPiModIO:
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"""Zerstoert alle Klassen um aufzuraeumen."""
|
"""Zerstoert alle Klassen um aufzuraeumen."""
|
||||||
@@ -128,7 +129,8 @@ class RevPiModIO(object):
|
|||||||
self.writeprocimg()
|
self.writeprocimg()
|
||||||
|
|
||||||
def _configure(self, jconfigrsc):
|
def _configure(self, jconfigrsc):
|
||||||
"""Verarbeitet die piCtory Konfigurationsdatei."""
|
"""Verarbeitet die piCtory Konfigurationsdatei.
|
||||||
|
@param jconfigrsc: Data to build IOs as <class 'dict'> of JSON"""
|
||||||
|
|
||||||
# Filehandler konfigurieren, wenn er noch nicht existiert
|
# Filehandler konfigurieren, wenn er noch nicht existiert
|
||||||
if self._myfh is None:
|
if self._myfh is None:
|
||||||
@@ -252,11 +254,6 @@ class RevPiModIO(object):
|
|||||||
Warning
|
Warning
|
||||||
)
|
)
|
||||||
|
|
||||||
# Replace IO aus Datei verarbeiten
|
|
||||||
if self._replace_io_file is not None:
|
|
||||||
self._configure_replace_io()
|
|
||||||
self._lck_replace_io = True
|
|
||||||
|
|
||||||
# ImgWriter erstellen
|
# ImgWriter erstellen
|
||||||
self._imgwriter = helpermodule.ProcimgWriter(self)
|
self._imgwriter = helpermodule.ProcimgWriter(self)
|
||||||
|
|
||||||
@@ -291,88 +288,83 @@ class RevPiModIO(object):
|
|||||||
# Summary Klasse instantiieren
|
# Summary Klasse instantiieren
|
||||||
self.summary = summarymodule.Summary(jconfigrsc["Summary"])
|
self.summary = summarymodule.Summary(jconfigrsc["Summary"])
|
||||||
|
|
||||||
def _configure_replace_io(self):
|
def _configure_replace_io(self, creplaceio):
|
||||||
"""Importiert ersetzte IOs in diese Instanz.
|
"""Importiert ersetzte IOs in diese Instanz.
|
||||||
|
|
||||||
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
||||||
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
||||||
Instanz wiederhergestellt.
|
Instanz wiederhergestellt.
|
||||||
|
|
||||||
|
@param ireplaceio: Data to replace ios as <class 'ConfigParser'>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
cp = ConfigParser()
|
need_replace_lock = False
|
||||||
|
|
||||||
try:
|
for io in creplaceio:
|
||||||
with open(self._replace_io_file, "r") as fh:
|
|
||||||
cp.read_file(fh)
|
|
||||||
except Exception as e:
|
|
||||||
raise RuntimeError(
|
|
||||||
"replace_io_file: could not read file '{0}' | {1}"
|
|
||||||
"".format(self._replace_io_file, e)
|
|
||||||
)
|
|
||||||
|
|
||||||
for io in cp:
|
|
||||||
if io == "DEFAULT":
|
if io == "DEFAULT":
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# IO prüfen
|
# IO prüfen
|
||||||
parentio = cp[io].get("replace", "")
|
parentio = creplaceio[io].get("replace", "")
|
||||||
|
|
||||||
# Funktionsaufruf vorbereiten
|
# Funktionsaufruf vorbereiten
|
||||||
dict_replace = {
|
dict_replace = {
|
||||||
"frm": cp[io].get("frm"),
|
"frm": creplaceio[io].get("frm"),
|
||||||
}
|
}
|
||||||
|
|
||||||
# Convert defaultvalue from config file
|
# Convert defaultvalue from config file
|
||||||
if "defaultvalue" in cp[io]:
|
if "defaultvalue" in creplaceio[io]:
|
||||||
if dict_replace["frm"] == "?":
|
if dict_replace["frm"] == "?":
|
||||||
try:
|
try:
|
||||||
dict_replace["defaultvalue"] = \
|
dict_replace["defaultvalue"] = \
|
||||||
cp[io].getboolean("defaultvalue")
|
creplaceio[io].getboolean("defaultvalue")
|
||||||
except Exception:
|
except Exception:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"replace_io_file: could not convert '{0}' "
|
"replace_io_file: could not convert '{0}' "
|
||||||
"defaultvalue '{1}' to boolean"
|
"defaultvalue '{1}' to boolean"
|
||||||
"".format(io, cp[io].get("defaultvalue"))
|
"".format(io, creplaceio[io].get("defaultvalue"))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
dict_replace["defaultvalue"] = \
|
dict_replace["defaultvalue"] = \
|
||||||
cp[io].getint("defaultvalue")
|
creplaceio[io].getint("defaultvalue")
|
||||||
except Exception:
|
except Exception:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"replace_io_file: could not convert '{0}' "
|
"replace_io_file: could not convert '{0}' "
|
||||||
"defaultvalue '{1}' to integer"
|
"defaultvalue '{1}' to integer"
|
||||||
"".format(io, cp[io].get("bit"))
|
"".format(io, creplaceio[io].get("bit"))
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get bitaddress from config file
|
# Get bitaddress from config file
|
||||||
if "bit" in cp[io]:
|
if "bit" in creplaceio[io]:
|
||||||
try:
|
try:
|
||||||
dict_replace["bit"] = cp[io].getint("bit", 0)
|
dict_replace["bit"] = creplaceio[io].getint("bit", 0)
|
||||||
except Exception:
|
except Exception:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"replace_io_file: could not convert '{0}' "
|
"replace_io_file: could not convert '{0}' "
|
||||||
"bit '{1}' to integer"
|
"bit '{1}' to integer"
|
||||||
"".format(io, cp[io].get("bit"))
|
"".format(io, creplaceio[io].get("bit"))
|
||||||
)
|
)
|
||||||
|
|
||||||
# Sonstige Werte laden, wenn vorhanden
|
# Sonstige Werte laden, wenn vorhanden
|
||||||
if "bmk" in cp[io]:
|
if "bmk" in creplaceio[io]:
|
||||||
dict_replace["bmk"] = cp[io].get("bmk")
|
dict_replace["bmk"] = creplaceio[io].get("bmk")
|
||||||
if "byteorder" in cp[io]:
|
if "byteorder" in creplaceio[io]:
|
||||||
dict_replace["byteorder"] = cp[io].get("byteorder")
|
dict_replace["byteorder"] = creplaceio[io].get("byteorder")
|
||||||
|
|
||||||
# IO ersetzen
|
# IO ersetzen
|
||||||
try:
|
try:
|
||||||
self.io[parentio].replace_io(name=io, **dict_replace)
|
self.io[parentio].replace_io(name=io, **dict_replace)
|
||||||
|
need_replace_lock = True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
"replace_io_file: can not replace '{0}' with '{1}' "
|
"replace_io_file: can not replace '{0}' with '{1}' "
|
||||||
"| RevPiModIO message: {2}".format(
|
"| RevPiModIO message: {2}".format(parentio, io, e)
|
||||||
parentio, io, e
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Sperre für weiter .replace_io Aufrufe setzen
|
||||||
|
self._lck_replace_io = need_replace_lock
|
||||||
|
|
||||||
def _create_myfh(self):
|
def _create_myfh(self):
|
||||||
"""Erstellt FileObject mit Pfad zum procimg.
|
"""Erstellt FileObject mit Pfad zum procimg.
|
||||||
return FileObject"""
|
return FileObject"""
|
||||||
@@ -384,6 +376,25 @@ class RevPiModIO(object):
|
|||||||
@return Pfad der verwendeten piCtory Konfiguration"""
|
@return Pfad der verwendeten piCtory Konfiguration"""
|
||||||
return self._configrsc
|
return self._configrsc
|
||||||
|
|
||||||
|
def _get_cpreplaceio(self):
|
||||||
|
"""Laed die replace_io_file Konfiguration und verarbeitet sie.
|
||||||
|
@return <class 'ConfigParser'> der replace io daten"""
|
||||||
|
cp = ConfigParser()
|
||||||
|
|
||||||
|
# TODO: verfeinern!
|
||||||
|
|
||||||
|
if self._replace_io_file:
|
||||||
|
try:
|
||||||
|
with open(self._replace_io_file, "r") as fh:
|
||||||
|
cp.read_file(fh)
|
||||||
|
except Exception as e:
|
||||||
|
raise RuntimeError(
|
||||||
|
"replace_io_file: could not read/parse file '{0}' | {1}"
|
||||||
|
"".format(self._replace_io_file, e)
|
||||||
|
)
|
||||||
|
|
||||||
|
return cp
|
||||||
|
|
||||||
def _get_cycletime(self):
|
def _get_cycletime(self):
|
||||||
"""Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
|
"""Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
|
||||||
@return Millisekunden"""
|
@return Millisekunden"""
|
||||||
@@ -1049,6 +1060,7 @@ class RevPiModIOSelected(RevPiModIO):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
if len(self.device) == 0:
|
if len(self.device) == 0:
|
||||||
if type(self) == RevPiModIODriver:
|
if type(self) == RevPiModIODriver:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ __license__ = "LGPLv3"
|
|||||||
|
|
||||||
import socket
|
import socket
|
||||||
import warnings
|
import warnings
|
||||||
|
from configparser import ConfigParser
|
||||||
from json import loads as jloads
|
from json import loads as jloads
|
||||||
from re import compile
|
from re import compile
|
||||||
from threading import Thread, Event, Lock
|
from threading import Thread, Event, Lock
|
||||||
@@ -21,6 +22,8 @@ _sysexit = b'\x01EX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
|||||||
_sysdeldirty = b'\x01EY\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x17'
|
_sysdeldirty = b'\x01EY\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
# piCtory Konfiguration laden
|
# piCtory Konfiguration laden
|
||||||
_syspictory = b'\x01PI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
_syspictory = b'\x01PI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
|
# ReplaceIO Konfiguration laden
|
||||||
|
_sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
# Übertragene Bytes schreiben
|
# Übertragene Bytes schreiben
|
||||||
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
|
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
|
|
||||||
@@ -330,19 +333,48 @@ class NetFH(Thread):
|
|||||||
self._slavesock.send(_syspictory)
|
self._slavesock.send(_syspictory)
|
||||||
|
|
||||||
byte_buff = bytearray()
|
byte_buff = bytearray()
|
||||||
while not self.__sockend:
|
zero_byte = 0
|
||||||
data = self._slavesock.recv(1024)
|
while not self.__sockend and zero_byte < 100:
|
||||||
|
data = self._slavesock.recv(128)
|
||||||
|
if data == b'':
|
||||||
|
zero_byte += 1
|
||||||
|
|
||||||
byte_buff += data
|
byte_buff += data
|
||||||
if data.find(b'\x04') >= 0:
|
if data.find(b'\x04') >= 0:
|
||||||
# NOTE: Nur suchen oder Ende prüfen?
|
# NOTE: Nur suchen oder Ende prüfen?
|
||||||
return byte_buff[:-1]
|
return bytes(byte_buff[:-1])
|
||||||
|
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
raise IOError("readpictory error on network")
|
raise IOError("readpictory error on network")
|
||||||
|
|
||||||
self.__trigger = True
|
self.__trigger = True
|
||||||
|
|
||||||
|
def readreplaceio(self):
|
||||||
|
"""Ruft die replace_io Konfiguration ab.
|
||||||
|
@return <class 'bytes'> replace_io_file"""
|
||||||
|
if self.__sockend:
|
||||||
|
raise ValueError("read of closed file")
|
||||||
|
|
||||||
|
with self.__socklock:
|
||||||
|
self._slavesock.send(_sysreplaceio)
|
||||||
|
|
||||||
|
byte_buff = bytearray()
|
||||||
|
zero_byte = 0
|
||||||
|
while not self.__sockend and zero_byte < 100:
|
||||||
|
data = self._slavesock.recv(128)
|
||||||
|
if data == b'':
|
||||||
|
zero_byte += 1
|
||||||
|
|
||||||
|
byte_buff += data
|
||||||
|
if data.find(b'\x04') >= 0:
|
||||||
|
# NOTE: Nur suchen oder Ende prüfen?
|
||||||
|
return bytes(byte_buff[:-1])
|
||||||
|
|
||||||
|
self.__sockerr.set()
|
||||||
|
raise IOError("readreplaceio error on network")
|
||||||
|
|
||||||
|
self.__trigger = True
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Handler fuer Synchronisierung."""
|
"""Handler fuer Synchronisierung."""
|
||||||
while not self.__sockend:
|
while not self.__sockend:
|
||||||
@@ -542,14 +574,14 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
|
|
||||||
# Vererben
|
# Vererben
|
||||||
super().__init__(
|
super().__init__(
|
||||||
autorefresh,
|
autorefresh=autorefresh,
|
||||||
monitoring,
|
monitoring=monitoring,
|
||||||
syncoutputs,
|
syncoutputs=syncoutputs,
|
||||||
"{0}:{1}".format(*self._address),
|
procimg="{0}:{1}".format(*self._address),
|
||||||
None,
|
configrsc=None,
|
||||||
simulator,
|
simulator=simulator,
|
||||||
debug,
|
debug=debug,
|
||||||
replace_io_file
|
replace_io_file=replace_io_file
|
||||||
)
|
)
|
||||||
|
|
||||||
# Netzwerkfilehandler anlegen
|
# Netzwerkfilehandler anlegen
|
||||||
@@ -558,6 +590,7 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
# Nur Konfigurieren, wenn nicht vererbt
|
# Nur Konfigurieren, wenn nicht vererbt
|
||||||
if type(self) == RevPiNetIO:
|
if type(self) == RevPiNetIO:
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
def _create_myfh(self):
|
def _create_myfh(self):
|
||||||
"""Erstellt NetworkFileObject.
|
"""Erstellt NetworkFileObject.
|
||||||
@@ -565,6 +598,27 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
self._buffedwrite = True
|
self._buffedwrite = True
|
||||||
return NetFH(self._address)
|
return NetFH(self._address)
|
||||||
|
|
||||||
|
def _get_cpreplaceio(self):
|
||||||
|
"""Laed die replace_io Konfiguration ueber das Netzwerk.
|
||||||
|
@return <class 'ConfigParser'> der replace io daten"""
|
||||||
|
|
||||||
|
# Normale Verwendung über Elternklasse erledigen
|
||||||
|
if self._replace_io_file != ":network:":
|
||||||
|
return super()._get_cpreplaceio()
|
||||||
|
|
||||||
|
# Replace IO Daten über das Netzwerk beziehen
|
||||||
|
byte_buff = self._myfh.readreplaceio()
|
||||||
|
|
||||||
|
cp = ConfigParser()
|
||||||
|
try:
|
||||||
|
cp.read_string(byte_buff.decode("utf-8"))
|
||||||
|
except Exception as e:
|
||||||
|
raise RuntimeError(
|
||||||
|
"replace_io_file: could not read/parse network data | {0}"
|
||||||
|
"".format(e)
|
||||||
|
)
|
||||||
|
return cp
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
"""Trennt Verbindungen und beendet autorefresh inkl. alle Threads."""
|
"""Trennt Verbindungen und beendet autorefresh inkl. alle Threads."""
|
||||||
self.cleanup()
|
self.cleanup()
|
||||||
@@ -693,6 +747,7 @@ class RevPiNetIOSelected(RevPiNetIO):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
if len(self.device) == 0:
|
if len(self.device) == 0:
|
||||||
if type(self) == RevPiNetIODriver:
|
if type(self) == RevPiNetIODriver:
|
||||||
|
|||||||
Reference in New Issue
Block a user