Berechnung von Bit-IOs über mehr als 2 Bytes angepasst

wd und x2out Ansteuerung verbessert
Connect Funkscheiben werden als Devices ignoriert
Alle Cores werden bei syncoutputs nicht mehr mit \x00 vorbelegt
issubclass gegen isinstance getauscht
.exitsignal-Event für den Benutzer hinzugefügt
Bei Core-Klasse a*green / a*red als echte IOs hinzugefügt
This commit is contained in:
2018-08-01 12:43:49 +02:00
parent c10f36001f
commit 5cb806bbc5
5 changed files with 74 additions and 28 deletions

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpimodio2 -->
<!-- Saved: 2018-07-25, 14:56:58 -->
<!-- Saved: 2018-08-01, 12:41:53 -->
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1">
<Language>en_US</Language>
@@ -38,6 +38,7 @@
<Source>test/web_startseite.py</Source>
<Source>test/web_rpidaten.py</Source>
<Source>test/web_rpii2c.py</Source>
<Source>test/test_unit_fh.py</Source>
</Sources>
<Forms/>
<Translations/>

View File

@@ -55,7 +55,7 @@ class DeviceList(object):
def __delitem__(self, key):
"""Entfernt Device an angegebener Position.
@param key Deviceposition zum entfernen"""
if issubclass(type(key), Device):
if isinstance(key, Device):
key = key._position
self.__delattr__(key)
@@ -91,7 +91,7 @@ class DeviceList(object):
"""Setzt Attribute nur wenn Device.
@param key Attributname
@param value Attributobjekt"""
if issubclass(type(value), Device):
if isinstance(value, Device):
object.__setattr__(self, key, value)
self.__dict_position[value._position] = value
elif key == "_DeviceList__dict_position":
@@ -178,7 +178,7 @@ class Device(object):
"""Prueft ob IO auf diesem Device liegt.
@param key IO-Name <class 'str'> / IO-Bytenummer <class 'int'>
@return True, wenn IO auf Device vorhanden"""
if issubclass(type(key), IOBase):
if isinstance(key, IOBase):
# Umwandlung für key
key = key._name
@@ -432,18 +432,23 @@ class Core(Device):
self._ioerrorlimit1 = lst_io[6]
self._ioerrorlimit2 = lst_io[7]
if not (self._modio._monitoring or self._modio._simulator):
# Für RS485 errors defaults laden sollte procimg NULL sein
if self._ioerrorlimit1 is not None:
self._ioerrorlimit1.set_value(
self._ioerrorlimit1._defaultvalue
)
if self._ioerrorlimit2 is not None:
self._ioerrorlimit2.set_value(
self._ioerrorlimit2._defaultvalue
)
# RS485 errors schreiben
self._modio.writeprocimg(self)
# Echte IOs erzeugen
self.a1green = IOBase(self, [
"a1green", 0, 1, self._ioled.address,
False, None, "LED_A1_GREEN", "0"
], OUT, "little", False)
self.a1red = IOBase(self, [
"a1red", 0, 1, self._ioled.address,
False, None, "LED_A1_RED", "1"
], OUT, "little", False)
self.a2green = IOBase(self, [
"a2green", 0, 1, self._ioled.address,
False, None, "LED_A2_GREEN", "2"
], OUT, "little", False)
self.a2red = IOBase(self, [
"a2red", 0, 1, self._ioled.address,
False, None, "LED_A2_RED", "3"
], OUT, "little", False)
def __errorlimit(self, io, errorlimit):
"""Verwaltet das Lesen und Schreiben der ErrorLimits.
@@ -648,10 +653,20 @@ class Connect(Core):
"""Connect-Klasse vorbereiten."""
super()._devconfigure()
# Echte IOs erzeugen
self.a3green = IOBase(self, [
"a3green", 0, 1, self._ioled.address,
False, None, "LED_A3_GREEN", "4"
], OUT, "little", False)
self.a3red = IOBase(self, [
"a3red", 0, 1, self._ioled.address,
False, None, "LED_A3_RED", "5"
], OUT, "little", False)
# IO Objekte für WD und X2 in/out erzeugen
self.wd = IOBase(self, [
"wd", 0, 1, self._ioled.address,
False, None, "Connect_WatchDog", "6"
False, None, "Connect_WatchDog", "7"
], OUT, "little", False)
self.x2in = IOBase(self, [
"x2in", 0, 1, self._iostatusbyte.address,
@@ -659,7 +674,7 @@ class Connect(Core):
], INP, "little", False)
self.x2out = IOBase(self, [
"x2out", 0, 1, self._ioled.address,
False, None, "Connect_X2_OUT", "7"
False, None, "Connect_X2_OUT", "6"
], OUT, "little", False)
def _get_leda3(self):

View File

@@ -191,7 +191,7 @@ class IOList(object):
def _private_register_new_io_object(self, new_io):
"""Registriert neues IO Objekt unabhaenging von __setattr__.
@param new_io Neues IO Objekt"""
if issubclass(type(new_io), IOBase):
if isinstance(new_io, IOBase):
if hasattr(self, new_io._name):
raise AttributeError(
"attribute {} already exists - can not set io".format(
@@ -317,7 +317,7 @@ class IOBase(object):
else:
# Höhere Bits als 7 auf nächste Bytes umbrechen
int_startaddress += int((int(valuelist[7]) % 16) / 8)
int_startaddress += int(int(valuelist[7]) / 8)
self._slc_address = slice(
int_startaddress, int_startaddress + 1
)
@@ -519,7 +519,7 @@ class IOBase(object):
>Python3 struct</a>
"""
if not issubclass(type(self._parentdevice), Gateway):
if not isinstance(self._parentdevice, Gateway):
raise RuntimeError(
"this function can be used for ios on gatway or virtual "
"devices only"

View File

@@ -79,6 +79,9 @@ class RevPiModIO(object):
self.io = None
self.summary = None
# Event für Benutzeraktionen
self.exitsignal = Event()
# Nur Konfigurieren, wenn nicht vererbt
if type(self) == RevPiModIO:
self._configure(self.get_jconfigrsc())
@@ -177,6 +180,9 @@ class RevPiModIO(object):
dev_new = devicemodule.Gateway(
self, device, simulator=self._simulator
)
elif device["type"] == "RIGHT":
# Connectdevice
dev_new = None
else:
# Device-Type nicht gefunden
warnings.warn(
@@ -216,6 +222,20 @@ class RevPiModIO(object):
if self._syncoutputs:
self.syncoutputs()
# Für RS485 errors am core defaults laden sollte procimg NULL sein
if not (self.core is None or self._monitoring or self._simulator):
if self.core._ioerrorlimit1 is not None:
self.core._ioerrorlimit1.set_value(
self.core._ioerrorlimit1._defaultvalue
)
if self.core._ioerrorlimit2 is not None:
self.core._ioerrorlimit2.set_value(
self.core._ioerrorlimit2._defaultvalue
)
# RS485 errors schreiben
self.writeprocimg(self.core)
# Optional ins autorefresh aufnehmen
if self._autorefresh:
self.autorefresh_all()
@@ -374,6 +394,9 @@ class RevPiModIO(object):
# Zeitänderung in _imgwriter neuladen
self._imgwriter.newdata.clear()
# Benutzerevent
self.exitsignal.clear()
# Cycleloop starten
self._exit.clear()
self._looprunning = True
@@ -423,6 +446,10 @@ class RevPiModIO(object):
wird dann gestoppt und das Programm kann sauber beendet werden.
@param full Entfernt auch alle Devices aus autorefresh"""
# Benutzerevent
self.exitsignal.set()
self._exit.set()
self._waitexit.set()
@@ -544,6 +571,9 @@ class RevPiModIO(object):
self._th_mainloop.start()
return
# Benutzerevent
self.exitsignal.clear()
# Event säubern vor Eintritt in Mainloop
self._exit.clear()
self._looprunning = True
@@ -592,7 +622,7 @@ class RevPiModIO(object):
if device is None:
mylist = self.device
else:
dev = device if issubclass(type(device), devicemodule.Device) \
dev = device if isinstance(device, devicemodule.Device) \
else self.device.__getitem__(device)
if dev._selfupdate:
@@ -647,7 +677,7 @@ class RevPiModIO(object):
if device is None:
mylist = self.device
else:
dev = device if issubclass(type(device), devicemodule.Device) \
dev = device if isinstance(device, devicemodule.Device) \
else self.device.__getitem__(device)
mylist = [dev]
@@ -667,12 +697,12 @@ class RevPiModIO(object):
if device is None:
mylist = self.device
else:
dev = device if issubclass(type(device), devicemodule.Device) \
dev = device if isinstance(device, devicemodule.Device) \
else self.device.__getitem__(device)
if dev._selfupdate:
raise RuntimeError(
"can not sync process image, while device '{}|{}'"
"can not sync outputs, while device '{}|{}'"
"is in autorefresh mode".format(dev._position, dev._name)
)
mylist = [dev]
@@ -710,7 +740,7 @@ class RevPiModIO(object):
if device is None:
mylist = self.device
else:
dev = device if issubclass(type(device), devicemodule.Device) \
dev = device if isinstance(device, devicemodule.Device) \
else self.device.__getitem__(device)
if dev._selfupdate:

View File

@@ -466,7 +466,7 @@ class RevPiNetIO(_RevPiModIO):
if device is None:
self._myfh.clear_dirtybytes()
else:
dev = device if issubclass(type(device), Device) \
dev = device if isinstance(device, Device) \
else self.device.__getitem__(device)
mylist = [dev]
@@ -486,7 +486,7 @@ class RevPiNetIO(_RevPiModIO):
if device is None:
mylist = self.device
else:
dev = device if issubclass(type(device), Device) \
dev = device if isinstance(device, Device) \
else self.device.__getitem__(device)
mylist = [dev]