From 07d6d0e848db7bbc300b91ef4722ba154676eeca Mon Sep 17 00:00:00 2001 From: NaruX Date: Wed, 1 Nov 2017 15:32:08 +0100 Subject: [PATCH] =?UTF-8?q?VirtualDevices=20in=20alter=20piCtory=20"adap."?= =?UTF-8?q?=20mit=2064=20beginnen=20(Kunbus=20Standard)=20Konstanten=20um?= =?UTF-8?q?=20INP,=20OUT,=20MEM=20erweitert=20und=20io.Type=20gel=C3=B6sch?= =?UTF-8?q?t=20=C3=84nderung=20der=20Klassen=20auf=20neue=20Konstanten=20d?= =?UTF-8?q?evice.=5F=5Fgetioiter=20angelegt=20f=C3=BCr=20R=C3=BCckgabe=20d?= =?UTF-8?q?er=20IOs=20ohne=20None=20bei=20BIT-Bytes=20device.=5F=5Fgetioit?= =?UTF-8?q?er=20in=20R=C3=BCckgabefunktionen=20eingebaut=20io.DeadIO=20mit?= =?UTF-8?q?=20=5Fparentdevice=20=3D=20None=20erweitert=20io.IOBase.=5F=5Fb?= =?UTF-8?q?ool=5F=5F=20gibt=20nun=20False=20bei=20leeren=20Bytes=20aus=20i?= =?UTF-8?q?o.StructIO.frm=20gibt=20nun=20nur=20einzelnen=20Zeichen=20aus?= =?UTF-8?q?=20(Byteorder=20=C3=BCber=20.byteorder)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpimodio2.__init__.html | 2 +- doc/revpimodio2.device.html | 41 +++++++++++++++- doc/revpimodio2.io.html | 44 ++--------------- eric-revpimodio2.api | 7 +-- revpimodio2.e4p | 13 ++--- revpimodio2/__init__.py | 11 ++++- revpimodio2/device.py | 91 ++++++++++++++++++++--------------- revpimodio2/io.py | 33 ++++++------- revpimodio2/modio.py | 8 +-- setup.py | 2 +- 10 files changed, 138 insertions(+), 114 deletions(-) diff --git a/doc/revpimodio2.__init__.html b/doc/revpimodio2.__init__.html index a4e3fc4..7b11ad7 100644 --- a/doc/revpimodio2.__init__.html +++ b/doc/revpimodio2.__init__.html @@ -20,7 +20,7 @@ fuehrt das Modul bei Datenaenderung aus.

Global Attributes

- +
BOTH
FALLING
GREEN
OFF
RED
RISING
__all__
__author__
__name__
__package__
__version__
BOTH
FALLING
GREEN
INP
MEM
OFF
OUT
RED
RISING
__all__
__author__
__name__
__package__
__version__

Classes

diff --git a/doc/revpimodio2.device.html b/doc/revpimodio2.device.html index b8a451f..278215b 100644 --- a/doc/revpimodio2.device.html +++ b/doc/revpimodio2.device.html @@ -378,6 +378,9 @@ Methods __contains__ Prueft ob IO auf diesem Device liegt. +__getioiter +Gibt mit allen IOs zurueck. + __int__ Gibt die Positon im RevPi Bus zurueck. @@ -479,6 +482,22 @@ IO-Name / IO-Bytenummer
True, wenn device vorhanden
+ +

+Device.__getioiter

+__getioiter(ioslc) +

+Gibt mit allen IOs zurueck. +

+
ioslc
+
+IO Abschnitt +
+
+
Returns:
+
+IOs als Iterator +

Device.__int__

@@ -535,7 +554,7 @@ Erstellt aus der piCtory-Liste die IOs fuer dieses Device. -Objekt aus piCtory Konfiguration
iotype
- Wert + Wert
Returns:
@@ -632,6 +651,11 @@ Device.readprocimg

Alle Inputs fuer dieses Device vom Prozessabbild einlesen.

+
Returns:
+
+True, wenn erfolgreich ausgefuehrt +
+
See Also:
RevPiModIO.readprocimg() @@ -643,6 +667,11 @@ Device.setdefaultvalues

Alle Outputbuffer fuer dieses Device auf default Werte setzen.

+
Returns:
+
+True, wenn erfolgreich ausgefuehrt +
+
See Also:
RevPiModIO.setdefaultvalues() @@ -654,6 +683,11 @@ Device.syncoutputs

Lesen aller Outputs im Prozessabbild fuer dieses Device.

+
Returns:
+
+True, wenn erfolgreich ausgefuehrt +
+
See Also:
RevPiModIO.syncoutputs() @@ -665,6 +699,11 @@ Device.writeprocimg

Schreiben aller Outputs dieses Devices ins Prozessabbild.

+
Returns:
+
+True, wenn erfolgreich ausgefuehrt +
+
See Also:
RevPiModIO.writeprocimg() diff --git a/doc/revpimodio2.io.html b/doc/revpimodio2.io.html index 8e17215..c6e9766 100644 --- a/doc/revpimodio2.io.html +++ b/doc/revpimodio2.io.html @@ -32,9 +32,6 @@ Classes StructIO Klasse fuer den Zugriff auf Daten ueber ein definierten struct. - -Type -IO Typen.

@@ -54,7 +51,7 @@ object

Class Attributes

- +
None
_parentdevice

Class Methods

@@ -154,7 +151,7 @@ Methods Gibt konfigurierte Byteorder zurueck. _get_iotype -Gibt io.Type zurueck. +Gibt io type zurueck. get_defaultvalue Gibt die Defaultvalue von piCtory zurueck. @@ -201,7 +198,7 @@ Parentdevice auf dem der IO liegt Datenliste fuer Instantiierung
iotype
- Wert + Wert
byteorder
Byteorder 'little'/'big' fuer Berechnung @@ -269,11 +266,11 @@ Gibt konfigurierte Byteorder zurueck. IOBase._get_iotype _get_iotype()

-Gibt io.Type zurueck. +Gibt io type zurueck.

Returns:
- io.Type + io type

@@ -926,37 +923,6 @@ Setzt den Wert mit struct Formatierung. Wert vom Typ der struct-Formatierung

- -

- -

Type

-

-IO Typen. -

-

-Derived from

-object -

-Class Attributes

- - -
INP
MEM
OUT
-

-Class Methods

- - -
None
-

-Methods

- - -
None
-

-Static Methods

- - -
None
-
\ No newline at end of file diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index 4e096fa..6288d91 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -1,7 +1,10 @@ revpimodio2.BOTH?7 revpimodio2.FALLING?7 revpimodio2.GREEN?7 +revpimodio2.INP?7 +revpimodio2.MEM?7 revpimodio2.OFF?7 +revpimodio2.OUT?7 revpimodio2.RED?7 revpimodio2.RISING?7 revpimodio2.app.App?1(app) @@ -79,6 +82,7 @@ revpimodio2.helper.ProcimgWriter.set_maxioerrors?4(value) revpimodio2.helper.ProcimgWriter.set_refresh?4(value) revpimodio2.helper.ProcimgWriter.stop?4() revpimodio2.helper.ProcimgWriter?1(parentmodio) +revpimodio2.io.DeadIO._parentdevice?8 revpimodio2.io.DeadIO.replace_io?4(name, frm, **kwargs) revpimodio2.io.DeadIO?1(deadio) revpimodio2.io.IOBase._get_address?5() @@ -122,9 +126,6 @@ revpimodio2.io.StructIO.set_structvalue?4(value) revpimodio2.io.StructIO.signed?7 revpimodio2.io.StructIO.value?7 revpimodio2.io.StructIO?1(parentio, name, frm, **kwargs) -revpimodio2.io.Type.INP?7 -revpimodio2.io.Type.MEM?7 -revpimodio2.io.Type.OUT?7 revpimodio2.modio.RevPiModIO._configure?5(jconfigrsc) revpimodio2.modio.RevPiModIO._create_myfh?5() revpimodio2.modio.RevPiModIO._get_configrsc?5() diff --git a/revpimodio2.e4p b/revpimodio2.e4p index 7b69064..0d6bbb2 100644 --- a/revpimodio2.e4p +++ b/revpimodio2.e4p @@ -1,7 +1,7 @@ - + en_US @@ -9,7 +9,7 @@ Python3 Console Das Modul stellt alle Devices und IOs aus der piCtory Konfiguration in Python3 zur Verfügung. Es ermöglicht den direkten Zugriff auf die Werte über deren vergebenen Namen. Lese- und Schreibaktionen mit dem Prozessabbild werden von dem Modul selbst verwaltet, ohne dass sich der Programmierer um Offsets und Adressen kümmern muss. Für die Gatewaymodule wie ModbusTCP oder Profinet sind eigene 'Inputs' und 'Outputs' über einen bestimmten Adressbereich definierbar. Auf diese IOs kann mit Python3 über den Namen direkt auf die Werte zugegriffen werden. - 2.0.5 + 2.0.6 Sven Sager akira@narux.de @@ -31,7 +31,7 @@ test/web_virtdevdriver.py test/web_benniesrun.py test/web_benniesrunxxl.py - test_trace.py + test_unit.py @@ -43,6 +43,7 @@ MANIFEST.in eric-revpimodio2.api + test_unit.py Mercurial @@ -181,7 +182,7 @@ setup.py - test_trace.py + test_unit.py @@ -228,7 +229,7 @@ setup.py - test_trace.py + test_unit.py @@ -280,7 +281,7 @@ ExcludeFiles - */test_trace.py + */test_unit.py ExcludeMessages diff --git a/revpimodio2/__init__.py b/revpimodio2/__init__.py index 159e980..3892fcd 100644 --- a/revpimodio2/__init__.py +++ b/revpimodio2/__init__.py @@ -24,7 +24,7 @@ __all__ = [ __author__ = "Sven Sager " __name__ = "revpimodio2" __package__ = "revpimodio2" -__version__ = "2.0.5" +__version__ = "2.0.6" # Global package values OFF = 0 @@ -33,6 +33,9 @@ RED = 2 RISING = 31 FALLING = 32 BOTH = 33 +INP = 300 +OUT = 301 +MEM = 302 warnings.simplefilter(action="always") @@ -58,6 +61,12 @@ def consttostr(value): return "FALLING" elif value == 33: return "BOTH" + elif value == 300: + return "INP" + elif value == 301: + return "OUT" + elif value == 302: + return "MEM" else: return "" diff --git a/revpimodio2/device.py b/revpimodio2/device.py index 0ac7836..e039eec 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -114,16 +114,16 @@ class Device(object): # IOM-Objekte erstellen und Adressen in SLCs speichern if simulator: self._slc_inp = self._buildio( - dict_device.pop("out"), iomodule.Type.INP) + dict_device.pop("out"), INP) self._slc_out = self._buildio( - dict_device.pop("inp"), iomodule.Type.OUT) + dict_device.pop("inp"), OUT) else: self._slc_inp = self._buildio( - dict_device.pop("inp"), iomodule.Type.INP) + dict_device.pop("inp"), INP) self._slc_out = self._buildio( - dict_device.pop("out"), iomodule.Type.OUT) + dict_device.pop("out"), OUT) self._slc_mem = self._buildio( - dict_device.pop("mem"), iomodule.Type.MEM + dict_device.pop("mem"), MEM ) # SLCs mit offset berechnen @@ -180,9 +180,7 @@ class Device(object): def __iter__(self): """Gibt Iterator aller IOs zurueck. @return aller IOs""" - for lst_io in self._modio.io[self._slc_devoff]: - for io in lst_io: - yield io + return self.__getioiter(self._slc_devoff) def __len__(self): """Gibt Anzahl der Bytes zurueck, die dieses Device belegt. @@ -194,11 +192,20 @@ class Device(object): @return Devicename""" return self._name + def __getioiter(self, ioslc): + """Gibt mit allen IOs zurueck. + @param ioslc IO Abschnitt + @return IOs als Iterator""" + for lst_io in self._modio.io[ioslc]: + for io in lst_io: + if io is not None: + yield io + def _buildio(self, dict_io, iotype): """Erstellt aus der piCtory-Liste die IOs fuer dieses Device. @param dict_io -Objekt aus piCtory Konfiguration - @param iotype Wert + @param iotype Wert @return mit Start und Stop Position dieser IOs """ @@ -211,11 +218,11 @@ class Device(object): # Neuen IO anlegen if bool(dict_io[key][7]) or self._producttype == 95: # Bei Bitwerten oder Core RevPiIOBase verwenden - io_new = iomodule.IOBase( + io_new = IOBase( self, dict_io[key], iotype, "little", False ) else: - io_new = iomodule.IntIO( + io_new = IntIO( self, dict_io[key], iotype, "little", @@ -295,59 +302,64 @@ class Device(object): def get_allios(self): """Gibt eine Liste aller Inputs und Outputs zurueck, keine MEMs. @return Input und Output, keine MEMs""" - lst_return = [] - for lst_io in self._modio.io[ - self._slc_inpoff.start:self._slc_outoff.stop]: - lst_return += lst_io - return lst_return + return list(self.__getioiter( + slice(self._slc_inpoff.start, self._slc_outoff.stop) + )) def get_inputs(self): """Gibt eine Liste aller Inputs zurueck. @return Inputs""" - lst_return = [] - for lst_io in self._modio.io[self._slc_inpoff]: - lst_return += lst_io - return lst_return + return list(self.__getioiter(self._slc_inpoff)) def get_outputs(self): """Gibt eine Liste aller Outputs zurueck. @return Outputs""" - lst_return = [] - for lst_io in self._modio.io[self._slc_outoff]: - lst_return += lst_io - return lst_return + return list(self.__getioiter(self._slc_outoff)) def get_memories(self): """Gibt eine Liste aller mems zurueck. @return Mems""" - lst_return = [] - for lst_io in self._modio.io[self._slc_memoff]: - lst_return += lst_io - return lst_return + return list(self.__getioiter(self._slc_memoff)) def readprocimg(self): """Alle Inputs fuer dieses Device vom Prozessabbild einlesen. + + @return True, wenn erfolgreich ausgefuehrt @see revpimodio2.modio#RevPiModIO.readprocimg - RevPiModIO.readprocimg()""" - self._modio.readprocimg(self) + RevPiModIO.readprocimg() + + """ + return self._modio.readprocimg(self) def setdefaultvalues(self): """Alle Outputbuffer fuer dieses Device auf default Werte setzen. + + @return True, wenn erfolgreich ausgefuehrt @see revpimodio2.modio#RevPiModIO.setdefaultvalues - RevPiModIO.setdefaultvalues()""" + RevPiModIO.setdefaultvalues() + + """ self._modio.setdefaultvalues(self) def syncoutputs(self): """Lesen aller Outputs im Prozessabbild fuer dieses Device. + + @return True, wenn erfolgreich ausgefuehrt @see revpimodio2.modio#RevPiModIO.syncoutputs - RevPiModIO.syncoutputs()""" - self._modio.syncoutputs(self) + RevPiModIO.syncoutputs() + + """ + return self._modio.syncoutputs(self) def writeprocimg(self): """Schreiben aller Outputs dieses Devices ins Prozessabbild. + + @return True, wenn erfolgreich ausgefuehrt @see revpimodio2.modio#RevPiModIO.writeprocimg - RevPiModIO.writeprocimg()""" - self._modio.writeprocimg(self) + RevPiModIO.writeprocimg() + + """ + return self._modio.writeprocimg(self) length = property(__len__) name = property(__str__) @@ -616,9 +628,9 @@ class Gateway(Device): super().__init__(parent, dict_device, simulator) self._dict_slc = { - iomodule.Type.INP: self._slc_inp, - iomodule.Type.OUT: self._slc_out, - iomodule.Type.MEM: self._slc_mem + INP: self._slc_inp, + OUT: self._slc_out, + MEM: self._slc_mem } def get_rawbytes(self): @@ -678,4 +690,5 @@ class Virtual(Gateway): # Nachträglicher Import -from . import io as iomodule +from .io import IOBase, IntIO +from revpimodio2 import INP, OUT, MEM diff --git a/revpimodio2/io.py b/revpimodio2/io.py index 51c9ac5..833e9de 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -8,16 +8,7 @@ """RevPiModIO Modul fuer die Verwaltung der IOs.""" import struct from threading import Event -from revpimodio2 import RISING, FALLING, BOTH, consttostr - - -class Type(object): - - """IO Typen.""" - - INP = 300 - OUT = 301 - MEM = 302 +from revpimodio2 import RISING, FALLING, BOTH, INP, OUT, MEM, consttostr class IOList(object): @@ -120,7 +111,7 @@ class IOList(object): ]: object.__setattr__(self, key, value) else: - raise TypeError( + raise ValueError( "direct assignment is not supported - use .value Attribute" ) @@ -227,6 +218,8 @@ class DeadIO(object): @see #IOBase.replace_io replace_io(...)""" self.__deadio.replace_io(name, frm, **kwargs) + _parentdevice = property(lambda self: None) + class IOBase(object): @@ -248,7 +241,7 @@ class IOBase(object): @param parentdevice Parentdevice auf dem der IO liegt @param valuelist Datenliste fuer Instantiierung - @param iotype Wert + @param iotype Wert @param byteorder Byteorder 'little'/'big' fuer Berechnung @param sigend Intberechnung mit Vorzeichen durchfuehren @@ -312,7 +305,8 @@ class IOBase(object): ) return bool(int_byte & 1 << self._bitaddress) else: - return bool(self._parentdevice._ba_devdata[self._slc_address]) + return self._parentdevice._ba_devdata[self._slc_address] != \ + bytearray(self._length) def __len__(self): """Gibt die Bytelaenge des IO zurueck. @@ -335,8 +329,8 @@ class IOBase(object): return self._byteorder def _get_iotype(self): - """Gibt io.Type zurueck. - @return io.Type""" + """Gibt io type zurueck. + @return io type""" return self._iotype def get_defaultvalue(self): @@ -549,7 +543,7 @@ class IOBase(object): def set_value(self, value): """Setzt den Wert des IOs. @param value IO-Wert als oder """ - if self._iotype == Type.OUT: + if self._iotype == OUT: if self._bitaddress >= 0: # Versuchen egal welchen Typ in Bool zu konvertieren value = bool(value) @@ -591,7 +585,7 @@ class IOBase(object): "".format(self._name, type(value)) ) - elif self._iotype == Type.INP: + elif self._iotype == INP: if self._parentdevice._modio._simulator: raise AttributeError( "can not write to output '{}' in simulator mode" @@ -601,7 +595,8 @@ class IOBase(object): raise AttributeError( "can not write to input '{}'".format(self._name) ) - elif self._iotype == Type.MEM: + + elif self._iotype == MEM: raise AttributeError( "can not write to memory '{}'".format(self._name) ) @@ -906,7 +901,7 @@ class StructIO(IOBase): def _get_frm(self): """Ruft die struct Formatierung ab. @return struct Formatierung""" - return self.__frm + return self.__frm[1] def _get_signed(self): """Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll. diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index 049d979..8b60ea4 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -142,11 +142,11 @@ class RevPiModIO(object): err_names = [] for device in sorted(lst_devices, key=lambda x: x["position"]): - # Bei VDev in alter piCtory Version, Position eindeutig machen + # VDev alter piCtory Versionen auf Kunbus-Standard ändern if device["position"] == "adap.": - device["position"] = -1 + device["position"] = 64 while device["position"] in self.device: - device["position"] -= 1 + device["position"] += 1 if device["type"] == "BASE": # Core @@ -275,7 +275,7 @@ class RevPiModIO(object): ) warnings.warn( "got io error during {} and count {} errors now".format( - self._ioerror, self._ioerror + action, self._ioerror ), RuntimeWarning ) diff --git a/setup.py b/setup.py index 0ce3547..4d6ad7d 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( license="LGPLv3", name="revpimodio2", - version="2.0.5", + version="2.0.6", packages=["revpimodio2"], python_requires="~=3.2",