Mit replace_ios zusammenführen

.is_set() bearbeitet
This commit is contained in:
2019-08-17 19:03:23 +02:00
6 changed files with 171 additions and 62 deletions

View File

@@ -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>
@@ -231,19 +234,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>)
@@ -261,6 +272,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>

View File

@@ -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>
@@ -147,6 +147,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>
@@ -341,6 +344,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>
@@ -450,6 +464,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>
@@ -510,7 +527,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>)

View File

@@ -142,9 +142,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_debug?5() revpimodio2.modio.RevPiModIO._get_debug?5()
revpimodio2.modio.RevPiModIO._get_ioerrors?5() revpimodio2.modio.RevPiModIO._get_ioerrors?5()
@@ -198,6 +199,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.reconnecting?7 revpimodio2.netio.NetFH.reconnecting?7
revpimodio2.netio.NetFH.run?4() revpimodio2.netio.NetFH.run?4()
revpimodio2.netio.NetFH.seek?4(position) revpimodio2.netio.NetFH.seek?4(position)
@@ -208,6 +210,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.get_reconnecting?4() revpimodio2.netio.RevPiNetIO.get_reconnecting?4()
@@ -221,5 +224,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)

View File

@@ -1000,13 +1000,6 @@ class IntIOReplaceable(IntIO):
>Python3 struct</a> >Python3 struct</a>
""" """
# Sperre prüfen
if self._parentdevice._modio._lck_replace_io:
raise RuntimeError(
"can not use this function while using an external "
"replace_io_file"
)
# StructIO erzeugen # StructIO erzeugen
io_new = StructIO( io_new = StructIO(
self, self,

View File

@@ -37,7 +37,7 @@ class RevPiModIO(object):
"_maxioerrors", "_myfh", "_myfh_lck", "_monitoring", "_procimg", \ "_maxioerrors", "_myfh", "_myfh_lck", "_monitoring", "_procimg", \
"_simulator", "_syncoutputs", "_th_mainloop", "_waitexit", \ "_simulator", "_syncoutputs", "_th_mainloop", "_waitexit", \
"core", "app", "device", "exitsignal", "io", "summary", "_debug", \ "core", "app", "device", "exitsignal", "io", "summary", "_debug", \
"_lck_replace_io", "_replace_io_file", "_run_on_pi" "_replace_io_file", "_run_on_pi"
def __init__( def __init__(
self, autorefresh=False, monitoring=False, syncoutputs=True, self, autorefresh=False, monitoring=False, syncoutputs=True,
@@ -85,7 +85,6 @@ class RevPiModIO(object):
self._imgwriter = None self._imgwriter = None
self._ioerror = 0 self._ioerror = 0
self._length = 0 self._length = 0
self._lck_replace_io = False
self._looprunning = False self._looprunning = False
self._lst_devselect = [] self._lst_devselect = []
self._lst_refresh = [] self._lst_refresh = []
@@ -116,6 +115,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."""
@@ -138,7 +138,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:
@@ -262,11 +263,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)
@@ -301,76 +297,67 @@ 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() for io in creplaceio:
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 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:
@@ -392,6 +379,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"""
@@ -1141,6 +1147,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:

View File

@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3" __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 revpimodio2 import DeviceNotFoundError from revpimodio2 import DeviceNotFoundError
@@ -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'
@@ -358,19 +361,48 @@ class NetFH(Thread):
self._slavesock.send(_syspictory) self._slavesock.send(_syspictory)
byte_buff = bytearray() byte_buff = bytearray()
while not self.__sockend.is_set(): zero_byte = 0
data = self._slavesock.recv(256) while not self.__sockend.is_set() 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:
self.__trigger = True self.__trigger = True
# 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")
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.is_set(): while not self.__sockend.is_set():
@@ -592,15 +624,15 @@ 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,
direct_output direct_output=direct_output,
) )
# Netzwerkfilehandler anlegen # Netzwerkfilehandler anlegen
@@ -609,6 +641,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.
@@ -616,6 +649,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()
@@ -751,6 +805,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: