_defaultvalue kann String aufnehmen muss aber über _defaultvalue erfragt werden

_defaultvalue kann niemals None sein, außer bei StructIO zur Berechnung
Fehlerabfang komischer piCtory JSON Datei für _defaultvalue ('null' statt null)
This commit is contained in:
2018-04-17 13:13:12 +02:00
parent 9a1084ad7d
commit ca2a610119
5 changed files with 31 additions and 7 deletions

View File

@@ -202,6 +202,7 @@ Parentdevice auf dem der IO liegt
</dd><dt><i>valuelist</i></dt> </dd><dt><i>valuelist</i></dt>
<dd> <dd>
Datenliste fuer Instantiierung Datenliste fuer Instantiierung
["name","defval","bitlen","startaddr",exp,"idx","bmk","bitaddr"]
</dd><dt><i>iotype</i></dt> </dd><dt><i>iotype</i></dt>
<dd> <dd>
<class 'int'> Wert <class 'int'> Wert

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> <!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpimodio2 --> <!-- eric project file for project revpimodio2 -->
<!-- Saved: 2018-04-05, 16:01:15 --> <!-- Saved: 2018-04-17, 08:56:16 -->
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
@@ -9,7 +9,7 @@
<ProgLanguage mixed="0">Python3</ProgLanguage> <ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType> <ProjectType>Console</ProjectType>
<Description>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.</Description> <Description>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.</Description>
<Version>2.1.4</Version> <Version>2.1.5</Version>
<Author>Sven Sager</Author> <Author>Sven Sager</Author>
<Email>akira@narux.de</Email> <Email>akira@narux.de</Email>
<Eol index="1"/> <Eol index="1"/>

View File

@@ -25,7 +25,7 @@ __all__ = [
__author__ = "Sven Sager <akira@revpimodio.org>" __author__ = "Sven Sager <akira@revpimodio.org>"
__name__ = "revpimodio2" __name__ = "revpimodio2"
__package__ = "revpimodio2" __package__ = "revpimodio2"
__version__ = "2.1.4" __version__ = "2.1.5"
# Global package values # Global package values
OFF = 0 OFF = 0

View File

@@ -180,6 +180,7 @@ class IOList(object):
delattr(self, oldio._name) delattr(self, oldio._name)
if io._defaultvalue is None: if io._defaultvalue is None:
# Nur bei StructIO und keiner gegebenen defaultvalue übernehmen
if io._bitaddress < 0: if io._bitaddress < 0:
io._defaultvalue = calc_defaultvalue io._defaultvalue = calc_defaultvalue
else: else:
@@ -254,11 +255,14 @@ class IOBase(object):
@param parentdevice Parentdevice auf dem der IO liegt @param parentdevice Parentdevice auf dem der IO liegt
@param valuelist Datenliste fuer Instantiierung @param valuelist Datenliste fuer Instantiierung
["name","defval","bitlen","startaddr",exp,"idx","bmk","bitaddr"]
@param iotype <class 'int'> Wert @param iotype <class 'int'> Wert
@param byteorder Byteorder 'little'/'big' fuer <class 'int'> Berechnung @param byteorder Byteorder 'little'/'big' fuer <class 'int'> Berechnung
@param sigend Intberechnung mit Vorzeichen durchfuehren @param sigend Intberechnung mit Vorzeichen durchfuehren
""" """
# ["name","defval","bitlen","startaddr",exp,"idx","bmk","bitaddr"]
# [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ]
self._parentdevice = parentdevice self._parentdevice = parentdevice
# Bitadressen auf Bytes aufbrechen und umrechnen # Bitadressen auf Bytes aufbrechen und umrechnen
@@ -279,12 +283,13 @@ class IOBase(object):
self._slc_address = slice( self._slc_address = slice(
int_startaddress, int_startaddress + self._length int_startaddress, int_startaddress + self._length
) )
# Defaultvalue aus Zahl in Bytes umrechnen
if str(valuelist[1]).isdigit(): if str(valuelist[1]).isdigit():
# Defaultvalue aus Zahl in Bytes umrechnen
self._defaultvalue = int(valuelist[1]).to_bytes( self._defaultvalue = int(valuelist[1]).to_bytes(
self._length, byteorder=self._byteorder self._length, byteorder=self._byteorder
) )
elif valuelist[1] is None and type(self) == StructIO: elif valuelist[1] is None and type(self) == StructIO:
# Auf None setzen um später berechnete Werte zu übernehmen
self._defaultvalue = None self._defaultvalue = None
elif type(valuelist[1]) == bytes: elif type(valuelist[1]) == bytes:
# Defaultvalue direkt von bytes übernehmen # Defaultvalue direkt von bytes übernehmen
@@ -297,16 +302,34 @@ class IOBase(object):
"".format(self._length, len(valuelist[1])) "".format(self._length, len(valuelist[1]))
) )
else: else:
# Defaultvalue mit leeren Bytes füllen
self._defaultvalue = bytes(self._length) self._defaultvalue = bytes(self._length)
# Versuchen String in ASCII Bytes zu wandeln
if type(valuelist[1]) == str:
try:
buff = valuelist[1].encode("ASCII")
if len(buff) <= self._length:
self._defaultvalue = \
buff + bytes(self._length - len(buff))
except:
pass
else: else:
# Höhere Bits als 7 auf nächste Bytes umbrechen # Höhere Bits als 7 auf nächste Bytes umbrechen
int_startaddress += int((int(valuelist[7]) % 16) / 8) int_startaddress += int((int(valuelist[7]) % 16) / 8)
self._slc_address = slice( self._slc_address = slice(
int_startaddress, int_startaddress + 1 int_startaddress, int_startaddress + 1
) )
self._defaultvalue = None if valuelist[1] is None \
else bool(int(valuelist[1])) # Defaultvalue ermitteln, sonst False
if valuelist[1] is None and type(self) == StructIO:
self._defaultvalue = None
else:
try:
self._defaultvalue = bool(int(valuelist[1]))
except:
self._defaultvalue = False
def __bool__(self): def __bool__(self):
"""<class 'bool'>-Wert der Klasse. """<class 'bool'>-Wert der Klasse.

View File

@@ -16,7 +16,7 @@ setup(
license="LGPLv3", license="LGPLv3",
name="revpimodio2", name="revpimodio2",
version="2.1.4", version="2.1.5",
packages=["revpimodio2"], packages=["revpimodio2"],
python_requires="~=3.2", python_requires="~=3.2",