IO Zuordnung in Core-Klasse jetzt IOBase Objekt kein Index mehr

Watchdog und X2 in/out werden als IOBase Objekte über core angeboten
This commit is contained in:
2018-07-30 12:24:12 +02:00
parent 2ab799971f
commit c10f36001f
2 changed files with 60 additions and 87 deletions

View File

@@ -210,13 +210,13 @@ Static Methods</h3>
<a NAME="Core.__errorlimit" ID="Core.__errorlimit"></a> <a NAME="Core.__errorlimit" ID="Core.__errorlimit"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Core.__errorlimit</h3> Core.__errorlimit</h3>
<b>__errorlimit</b>(<i>io_id, errorlimit</i>) <b>__errorlimit</b>(<i>io, errorlimit</i>)
<p> <p>
Verwaltet das Lesen und Schreiben der ErrorLimits. Verwaltet das Lesen und Schreiben der ErrorLimits.
</p><dl> </p><dl>
<dt><i>io_id</i></dt> <dt><i>io</i></dt>
<dd> <dd>
Index des IOs fuer ErrorLimit IOs Objekt fuer ErrorLimit
</dd> </dd>
</dl><dl> </dl><dl>
<dt>Returns:</dt> <dt>Returns:</dt>

View File

@@ -402,59 +402,60 @@ class Core(Device):
def _devconfigure(self): def _devconfigure(self):
"""Core-Klasse vorbereiten.""" """Core-Klasse vorbereiten."""
# Eigene IO-Liste aufbauen
lst_io = [x for x in self.__iter__()]
self._iostatusbyte = lst_io[0]
self._iocycle = None self._iocycle = None
self._iotemperature = None self._iotemperature = None
self._iofrequency = None self._iofrequency = None
self._ioerrorcnt = None self._ioerrorcnt = None
self._ioled = 1 self._ioled = lst_io[1]
self._ioerrorlimit1 = None self._ioerrorlimit1 = None
self._ioerrorlimit2 = None self._ioerrorlimit2 = None
# Eigene IO-Liste aufbauen int_lenio = len(lst_io)
self.__lst_io = [x for x in self.__iter__()]
int_lenio = len(self.__lst_io)
if int_lenio == 6: if int_lenio == 6:
# Core 1.1 # Core 1.1
self._iocycle = 1 self._iocycle = lst_io[1]
self._ioerrorcnt = 2 self._ioerrorcnt = lst_io[2]
self._ioled = 3 self._ioled = lst_io[3]
self._ioerrorlimit1 = 4 self._ioerrorlimit1 = lst_io[4]
self._ioerrorlimit2 = 5 self._ioerrorlimit2 = lst_io[5]
elif int_lenio == 8: elif int_lenio == 8:
# Core 1.2 # Core 1.2
self._iocycle = 1 self._iocycle = lst_io[1]
self._ioerrorcnt = 2 self._ioerrorcnt = lst_io[2]
self._iotemperature = 3 self._iotemperature = lst_io[3]
self._iofrequency = 4 self._iofrequency = lst_io[4]
self._ioled = 5 self._ioled = lst_io[5]
self._ioerrorlimit1 = 6 self._ioerrorlimit1 = lst_io[6]
self._ioerrorlimit2 = 7 self._ioerrorlimit2 = lst_io[7]
if not (self._modio._monitoring or self._modio._simulator): if not (self._modio._monitoring or self._modio._simulator):
# Für RS485 errors defaults laden sollte procimg NULL sein # Für RS485 errors defaults laden sollte procimg NULL sein
if self._ioerrorlimit1 is not None: if self._ioerrorlimit1 is not None:
self.__lst_io[self._ioerrorlimit1].set_value( self._ioerrorlimit1.set_value(
self.__lst_io[self._ioerrorlimit1]._defaultvalue self._ioerrorlimit1._defaultvalue
) )
if self._ioerrorlimit2 is not None: if self._ioerrorlimit2 is not None:
self.__lst_io[self._ioerrorlimit2].set_value( self._ioerrorlimit2.set_value(
self.__lst_io[self._ioerrorlimit2]._defaultvalue self._ioerrorlimit2._defaultvalue
) )
# RS485 errors schreiben # RS485 errors schreiben
self._modio.writeprocimg(self) self._modio.writeprocimg(self)
def __errorlimit(self, io_id, errorlimit): def __errorlimit(self, io, errorlimit):
"""Verwaltet das Lesen und Schreiben der ErrorLimits. """Verwaltet das Lesen und Schreiben der ErrorLimits.
@param io_id Index des IOs fuer ErrorLimit @param io IOs Objekt fuer ErrorLimit
@return Aktuellen ErrorLimit oder None wenn nicht verfuegbar""" @return Aktuellen ErrorLimit oder None wenn nicht verfuegbar"""
if errorlimit is None: if errorlimit is None:
return None if io_id is None else int.from_bytes( return None if io is None else int.from_bytes(
self.__lst_io[io_id].get_value(), byteorder="little" io.get_value(), byteorder="little"
) )
else: else:
if 0 <= errorlimit <= 65535: if 0 <= errorlimit <= 65535:
self.__lst_io[io_id].set_value( io.set_value(
errorlimit.to_bytes(2, byteorder="little") errorlimit.to_bytes(2, byteorder="little")
) )
else: else:
@@ -466,14 +467,14 @@ class Core(Device):
"""Gibt den RevPi Core Status zurueck. """Gibt den RevPi Core Status zurueck.
@return Status als <class 'int'>""" @return Status als <class 'int'>"""
return int.from_bytes( return int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) )
def _get_leda1(self): def _get_leda1(self):
"""Gibt den Zustand der LED A1 vom Core zurueck. """Gibt den Zustand der LED A1 vom Core zurueck.
@return 0=aus, 1=gruen, 2=rot""" @return 0=aus, 1=gruen, 2=rot"""
int_led = int.from_bytes( int_led = int.from_bytes(
self.__lst_io[self._ioled].get_value(), byteorder="little" self._ioled.get_value(), byteorder="little"
) )
led = int_led & 1 led = int_led & 1
led += int_led & 2 led += int_led & 2
@@ -483,7 +484,7 @@ class Core(Device):
"""Gibt den Zustand der LED A2 vom Core zurueck. """Gibt den Zustand der LED A2 vom Core zurueck.
@return 0=aus, 1=gruen, 2=rot""" @return 0=aus, 1=gruen, 2=rot"""
int_led = int.from_bytes( int_led = int.from_bytes(
self.__lst_io[self._ioled].get_value(), byteorder="little" self._ioled.get_value(), byteorder="little"
) >> 2 ) >> 2
led = int_led & 1 led = int_led & 1
led += int_led & 2 led += int_led & 2
@@ -495,12 +496,12 @@ class Core(Device):
@param shifed_value Bits vergleichen""" @param shifed_value Bits vergleichen"""
# Byte als int holen # Byte als int holen
int_led = int.from_bytes( int_led = int.from_bytes(
self.__lst_io[self._ioled].get_value(), byteorder="little" self._ioled.get_value(), byteorder="little"
) )
for int_bit in addresslist: for int_bit in addresslist:
value = bool(shifted_value & int_bit) value = bool(shifted_value & int_bit)
if bool(int_led & 1) != value: if bool(int_led & int_bit) != value:
# Berechnen, wenn verändert # Berechnen, wenn verändert
if value: if value:
int_led += int_bit int_led += int_bit
@@ -508,9 +509,7 @@ class Core(Device):
int_led -= int_bit int_led -= int_bit
# Zurückschreiben wenn verändert # Zurückschreiben wenn verändert
self.__lst_io[self._ioled].set_value( self._ioled.set_value(int_led.to_bytes(length=1, byteorder="little"))
int_led.to_bytes(length=1, byteorder="little")
)
def _set_leda1(self, value): def _set_leda1(self, value):
"""Setzt den Zustand der LED A1 vom Core. """Setzt den Zustand der LED A1 vom Core.
@@ -537,7 +536,7 @@ class Core(Device):
"""Statusbit fuer piControl-Treiber laeuft. """Statusbit fuer piControl-Treiber laeuft.
@return True, wenn Treiber laeuft""" @return True, wenn Treiber laeuft"""
return bool(int.from_bytes( return bool(int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) & 1) ) & 1)
@property @property
@@ -545,7 +544,7 @@ class Core(Device):
"""Statusbit fuer ein IO-Modul nicht mit PiCtory konfiguriert. """Statusbit fuer ein IO-Modul nicht mit PiCtory konfiguriert.
@return True, wenn IO Modul nicht konfiguriert""" @return True, wenn IO Modul nicht konfiguriert"""
return bool(int.from_bytes( return bool(int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) & 2) ) & 2)
@property @property
@@ -553,7 +552,7 @@ class Core(Device):
"""Statusbit fuer ein IO-Modul fehlt oder piGate konfiguriert. """Statusbit fuer ein IO-Modul fehlt oder piGate konfiguriert.
@return True, wenn IO-Modul fehlt oder piGate konfiguriert""" @return True, wenn IO-Modul fehlt oder piGate konfiguriert"""
return bool(int.from_bytes( return bool(int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) & 4) ) & 4)
@property @property
@@ -561,7 +560,7 @@ class Core(Device):
"""Statusbit Modul belegt mehr oder weniger Speicher als konfiguriert. """Statusbit Modul belegt mehr oder weniger Speicher als konfiguriert.
@return True, wenn falscher Speicher belegt ist""" @return True, wenn falscher Speicher belegt ist"""
return bool(int.from_bytes( return bool(int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) & 8) ) & 8)
@property @property
@@ -569,7 +568,7 @@ class Core(Device):
"""Statusbit links vom RevPi ist ein piGate Modul angeschlossen. """Statusbit links vom RevPi ist ein piGate Modul angeschlossen.
@return True, wenn piGate links existiert""" @return True, wenn piGate links existiert"""
return bool(int.from_bytes( return bool(int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) & 16) ) & 16)
@property @property
@@ -577,7 +576,7 @@ class Core(Device):
"""Statusbit rechts vom RevPi ist ein piGate Modul angeschlossen. """Statusbit rechts vom RevPi ist ein piGate Modul angeschlossen.
@return True, wenn piGate rechts existiert""" @return True, wenn piGate rechts existiert"""
return bool(int.from_bytes( return bool(int.from_bytes(
self.__lst_io[0].get_value(), byteorder="little" self._iostatusbyte.get_value(), byteorder="little"
) & 32) ) & 32)
@property @property
@@ -585,7 +584,7 @@ class Core(Device):
"""Gibt Zykluszeit der Prozessabbildsynchronisierung zurueck. """Gibt Zykluszeit der Prozessabbildsynchronisierung zurueck.
@return Zykluszeit in ms""" @return Zykluszeit in ms"""
return None if self._iocycle is None else int.from_bytes( return None if self._iocycle is None else int.from_bytes(
self.__lst_io[self._iocycle].get_value(), byteorder="little" self._iocycle.get_value(), byteorder="little"
) )
@property @property
@@ -593,7 +592,7 @@ class Core(Device):
"""Gibt CPU-Temperatur zurueck. """Gibt CPU-Temperatur zurueck.
@return CPU-Temperatur in Celsius""" @return CPU-Temperatur in Celsius"""
return None if self._iotemperature is None else int.from_bytes( return None if self._iotemperature is None else int.from_bytes(
self.__lst_io[self._iotemperature].get_value(), byteorder="little" self._iotemperature.get_value(), byteorder="little"
) )
@property @property
@@ -601,7 +600,7 @@ class Core(Device):
"""Gibt CPU Taktfrequenz zurueck. """Gibt CPU Taktfrequenz zurueck.
@return CPU Taktfrequenz in MHz""" @return CPU Taktfrequenz in MHz"""
return None if self._iofrequency is None else int.from_bytes( return None if self._iofrequency is None else int.from_bytes(
self.__lst_io[self._iofrequency].get_value(), byteorder="little" self._iofrequency.get_value(), byteorder="little"
) * 10 ) * 10
@property @property
@@ -609,7 +608,7 @@ class Core(Device):
"""Gibt Fehleranzahl auf RS485 piBridge Bus zurueck. """Gibt Fehleranzahl auf RS485 piBridge Bus zurueck.
@return Fehleranzahl der piBridge""" @return Fehleranzahl der piBridge"""
return None if self._ioerrorcnt is None else int.from_bytes( return None if self._ioerrorcnt is None else int.from_bytes(
self.__lst_io[self._ioerrorcnt].get_value(), byteorder="little" self._ioerrorcnt.get_value(), byteorder="little"
) )
@property @property
@@ -649,37 +648,30 @@ class Connect(Core):
"""Connect-Klasse vorbereiten.""" """Connect-Klasse vorbereiten."""
super()._devconfigure() super()._devconfigure()
# TODO: IO Objekte für WD und X2 erzeugen # IO Objekte für WD und X2 in/out erzeugen
self.wd = None self.wd = IOBase(self, [
self.x2in = None "wd", 0, 1, self._ioled.address,
self.x2out = None False, None, "Connect_WatchDog", "6"
], OUT, "little", False)
self.x2in = IOBase(self, [
"x2in", 0, 1, self._iostatusbyte.address,
False, None, "Connect_X2_IN", "6"
], INP, "little", False)
self.x2out = IOBase(self, [
"x2out", 0, 1, self._ioled.address,
False, None, "Connect_X2_OUT", "7"
], OUT, "little", False)
def _get_leda3(self): def _get_leda3(self):
"""Gibt den Zustand der LED A3 vom Connect zurueck. """Gibt den Zustand der LED A3 vom Connect zurueck.
@return 0=aus, 1=gruen, 2=rot""" @return 0=aus, 1=gruen, 2=rot"""
int_led = int.from_bytes( int_led = int.from_bytes(
self.__lst_io[self._ioled].get_value(), byteorder="little" self._ioled.get_value(), byteorder="little"
) >> 4 ) >> 4
led = int_led & 1 led = int_led & 1
led += int_led & 2 led += int_led & 2
return led return led
# def _get_wd(self):
# """Gibt den Zustand des Watchdogs vom Connect zurueck.
# @return True / False muss getriggert werden"""
# int_led = int.from_bytes(
# self.__lst_io[self._ioled].get_value(), byteorder="little"
# )
# return bool(int_led & 64)
#
# def _get_x2out(self):
# """Gibt den Zustand des Relais X2 vom Connect zurueck.
# @return True, wenn Relais geschlossen"""
# int_led = int.from_bytes(
# self.__lst_io[self._ioled].get_value(), byteorder="little"
# )
# return bool(int_led & 128)
def _set_leda3(self, value): def _set_leda3(self, value):
"""Setzt den Zustand der LED A3 vom Connect. """Setzt den Zustand der LED A3 vom Connect.
@param value 0=aus, 1=gruen, 2=rot""" @param value 0=aus, 1=gruen, 2=rot"""
@@ -688,26 +680,7 @@ class Connect(Core):
else: else:
raise ValueError("led status must be between 0 and 3") raise ValueError("led status must be between 0 and 3")
# def _set_wd(self, value):
# """Setzt den Zustand des Watchdogs vom Connect.
# @param value True / False muss getriggert werden"""
# if isinstance(value, bool):
# self._set_calculatedled([128], 128)
# else:
# raise ValueError("value must be True / False")
#
# def _set_x2out(self, value):
# """Setzt den Zustand des Watchdogs vom Connect.
# @param value True / False muss getriggert werden"""
# if isinstance(value, bool):
# self._set_calculatedled([64], 64)
# else:
# raise ValueError("value must be True / False")
A3 = property(_get_leda3, _set_leda3) A3 = property(_get_leda3, _set_leda3)
# WD = property(_get_wd, _set_wd)
# X2IN = property(_get_x2in)
# X2OUT = property(_get_x2out, _set_x2out)
class Gateway(Device): class Gateway(Device):