diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5114a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +/test/ +/make.conf diff --git a/.hgignore b/.hgignore deleted file mode 100644 index daf4e13..0000000 --- a/.hgignore +++ /dev/null @@ -1,23 +0,0 @@ -glob:.eric6project -glob:_eric6project -glob:.eric5project -glob:_eric5project -glob:.eric4project -glob:_eric4project -glob:.ropeproject -glob:_ropeproject -glob:.directory -glob:**.pyc -glob:**.pyo -glob:**.orig -glob:**.bak -glob:**.rej -glob:**~ -glob:cur -glob:tmp -glob:__pycache__ -glob:**.DS_Store -syntax: glob -test/* -deb/* -dist/* diff --git a/.idea/$CACHE_FILE$ b/.idea/$CACHE_FILE$ new file mode 100644 index 0000000..3a1e22c --- /dev/null +++ b/.idea/$CACHE_FILE$ @@ -0,0 +1,17 @@ + + + + + + + + + + + Angular + + + + + + \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3999087 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..bedb953 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/revpimodio2.iml b/.idea/revpimodio2.iml new file mode 100644 index 0000000..c8efcbb --- /dev/null +++ b/.idea/revpimodio2.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/doc/index-revpimodio2.html b/doc/index-revpimodio2.html deleted file mode 100644 index f3bc051..0000000 --- a/doc/index-revpimodio2.html +++ /dev/null @@ -1,53 +0,0 @@ - - -revpimodio2 - - - -

-revpimodio2

-

-Stellt alle Klassen fuer den RevolutionPi zur Verfuegung. -

-Webpage: https://revpimodio.org/ -

-Stellt Klassen fuer die einfache Verwendung des Revolution Pis der -Kunbus GmbH (https://revolution.kunbus.de/) zur Verfuegung. Alle I/Os werden -aus der piCtory Konfiguration eingelesen und mit deren Namen direkt zugreifbar -gemacht. Fuer Gateways sind eigene IOs ueber mehrere Bytes konfigurierbar -Mit den definierten Namen greift man direkt auf die gewuenschten Daten zu. -Auf alle IOs kann der Benutzer Funktionen als Events registrieren. Diese -fuehrt das Modul bei Datenaenderung aus. -

- - -

-Modules

- - - - - - - - - - - - - - - - - - - - - - - - - - -
revpimodio2Stellt alle Klassen fuer den RevolutionPi zur Verfuegung.
appBildet die App Sektion von piCtory ab.
deviceModul fuer die Verwaltung der Devices.
helperRevPiModIO Helperklassen und Tools.
ioRevPiModIO Modul fuer die Verwaltung der IOs.
modioRevPiModIO Hauptklasse fuer piControl0 Zugriff.
netioRevPiModIO Hauptklasse fuer Netzwerkzugriff.
summaryBildet die Summary-Sektion von piCtory ab.
- \ No newline at end of file diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index 2e6711c..0000000 --- a/doc/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - -Table of contents - - - -

-Table of contents

- - -

-Packages

- - - - - -
revpimodio2Stellt alle Klassen fuer den RevolutionPi zur Verfuegung.
- - \ No newline at end of file diff --git a/doc/revpimodio2.__init__.html b/doc/revpimodio2.__init__.html deleted file mode 100644 index 1554d3c..0000000 --- a/doc/revpimodio2.__init__.html +++ /dev/null @@ -1,116 +0,0 @@ - - -revpimodio2.__init__ - - - -

-revpimodio2.__init__

-

-Stellt alle Klassen fuer den RevolutionPi zur Verfuegung. -

-Webpage: https://revpimodio.org/ -

-Stellt Klassen fuer die einfache Verwendung des Revolution Pis der -Kunbus GmbH (https://revolution.kunbus.de/) zur Verfuegung. Alle I/Os werden -aus der piCtory Konfiguration eingelesen und mit deren Namen direkt zugreifbar -gemacht. Fuer Gateways sind eigene IOs ueber mehrere Bytes konfigurierbar -Mit den definierten Namen greift man direkt auf die gewuenschten Daten zu. -Auf alle IOs kann der Benutzer Funktionen als Events registrieren. Diese -fuehrt das Modul bei Datenaenderung aus. -

-

-Global Attributes

- - -
BOTH
FALLING
GREEN
INP
MEM
OFF
OUT
RED
RISING
__all__
__author__
__copyright__
__license__
__name__
__version__
-

-Classes

- - - - - -
DeviceNotFoundErrorFehler wenn ein Device nicht gefunden wird.
-

-Functions

- - - - - - - - -
acheckCheck type of given arguments.
consttostrGibt fuer Konstanten zurueck.
-

- -

DeviceNotFoundError

-

-Fehler wenn ein Device nicht gefunden wird. -

-

-Derived from

-Exception -

-Class Attributes

- - -
None
-

-Class Methods

- - -
None
-

-Methods

- - -
None
-

-Static Methods

- - -
None
- -
Up
-

- -

acheck

-acheck(check_type, **kwargs) -

-Check type of given arguments. -

- Use the argument name as keyword and the argument itself as value. -

-
check_type
-
-Type to check -
kwargs
-
-Arguments to check -
-
-
Up
-

- -

consttostr

-consttostr(value) -

-Gibt fuer Konstanten zurueck. -

- Diese Funktion ist erforderlich, da enum in Python 3.2 nicht existiert. -

-
value
-
-Konstantenwert -
-
-
Returns:
-
- Name der Konstanten -
-
-
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.app.html b/doc/revpimodio2.app.html deleted file mode 100644 index e96c636..0000000 --- a/doc/revpimodio2.app.html +++ /dev/null @@ -1,76 +0,0 @@ - - -revpimodio2.app - - - -

-revpimodio2.app

-

-Bildet die App Sektion von piCtory ab. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
-

-Classes

- - - - - -
AppBildet die App Sektion der config.rsc ab.
-

-Functions

- - -
None
-

- -

App

-

-Bildet die App Sektion der config.rsc ab. -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
AppInstantiiert die App-Klasse.
-

-Static Methods

- - -
None
- -

-App (Constructor)

-App(app) -

-Instantiiert die App-Klasse. -

-
app
-
-piCtory Appinformationen -
-
-
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.device.html b/doc/revpimodio2.device.html deleted file mode 100644 index 0753f3b..0000000 --- a/doc/revpimodio2.device.html +++ /dev/null @@ -1,1286 +0,0 @@ - - -revpimodio2.device - - - -

-revpimodio2.device

-

-Modul fuer die Verwaltung der Devices. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
-

-Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - -
BaseKlasse fuer alle Base-Devices wie Core / Connect usw.
ConnectKlasse fuer den RevPi Connect.
CoreKlasse fuer den RevPi Core.
DeviceBasisklasse fuer alle Device-Objekte.
DeviceListBasisklasse fuer direkten Zugriff auf Device Objekte.
DioModuleStellt ein DIO / DI / DO Modul dar.
GatewayKlasse fuer die RevPi Gateway-Devices.
VirtualKlasse fuer die RevPi Virtual-Devices.
-

-Functions

- - -
None
-

- -

Base

-

-Klasse fuer alle Base-Devices wie Core / Connect usw. -

-

-Derived from

-Device -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - -
None
-

-Static Methods

- - -
None
- -
Up
-

- -

Connect

-

-Klasse fuer den RevPi Connect. -

- Stellt Funktionen fuer die LEDs, Watchdog und den Status zur Verfuegung. -

- -

-

-Derived from

-Core -

-Class Attributes

- - -
A3
__slots__
wdautotoggle
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - -
__wdtoggleWD Ausgang alle 10 Sekunden automatisch toggeln.
_devconfigureConnect-Klasse vorbereiten.
_get_leda3Gibt den Zustand der LED A3 vom Connect zurueck.
_get_wdtoggleRuft den Wert fuer Autowatchdog ab.
_set_leda3Setzt den Zustand der LED A3 vom Connect.
_set_wdtoggleSetzt den Wert fuer Autowatchdog.
-

-Static Methods

- - -
None
- -

-Connect.__wdtoggle

-__wdtoggle() -

-WD Ausgang alle 10 Sekunden automatisch toggeln. -

-

-Connect._devconfigure

-_devconfigure() -

-Connect-Klasse vorbereiten. -

-

-Connect._get_leda3

-_get_leda3() -

-Gibt den Zustand der LED A3 vom Connect zurueck. -

-
Returns:
-
-0=aus, 1=gruen, 2=rot -
-
-

-Connect._get_wdtoggle

-_get_wdtoggle() -

-Ruft den Wert fuer Autowatchdog ab. -

-
Returns:
-
-True, wenn Autowatchdog aktiv ist -
-
-

-Connect._set_leda3

-_set_leda3(value) -

-Setzt den Zustand der LED A3 vom Connect. -

-
value
-
-0=aus, 1=gruen, 2=rot -
-
-

-Connect._set_wdtoggle

-_set_wdtoggle(value) -

-Setzt den Wert fuer Autowatchdog. -

- Wird dieser Wert auf True gesetzt, wechselt im Hintergrund das noetige - Bit zum toggeln des Watchdogs alle 10 Sekunden zwichen True und False. - Dieses Bit wird bei autorefresh=True natuerlich automatisch in das - Prozessabbild geschrieben. -

- WICHTIG: Sollte autorefresh=False sein, muss zyklisch - .writeprocimg() aufgerufen werden, um den Wert in das - Prozessabbild zu schreiben!!! -

-
value
-
-True zum aktivieren, Fals zum beenden -
-
-
Up
-

- -

Core

-

-Klasse fuer den RevPi Core. -

- Stellt Funktionen fuer die LEDs und den Status zur Verfuegung. -

- -

-

-Derived from

-Base -

-Class Attributes

- - -
A1
A2
__slots__
status
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
__errorlimitVerwaltet das Schreiben der ErrorLimits.
_devconfigureCore-Klasse vorbereiten.
_get_leda1Gibt den Zustand der LED A1 vom Core zurueck.
_get_leda2Gibt den Zustand der LED A2 vom Core zurueck.
_get_statusGibt den RevPi Core Status zurueck.
_set_calculatedledBerechnet und setzt neuen Bytewert fuer LED byte.
_set_leda1Setzt den Zustand der LED A1 vom Core.
_set_leda2Setzt den Zustand der LED A2 vom Core.
errorlimit1Setzt RS485 ErrorLimit1 auf neuen Wert.
errorlimit2Setzt RS485 ErrorLimit2 auf neuen Wert.
frequencyGibt CPU Taktfrequenz zurueck.
iocycleGibt Zykluszeit der Prozessabbildsynchronisierung zurueck.
ioerrorcountGibt Fehleranzahl auf RS485 piBridge Bus zurueck.
leftgateStatusbit links vom RevPi ist ein piGate Modul angeschlossen.
missingdeviceorgateStatusbit fuer ein IO-Modul fehlt oder piGate konfiguriert.
overunderflowStatusbit Modul belegt mehr oder weniger Speicher als konfiguriert.
picontrolrunningStatusbit fuer piControl-Treiber laeuft.
rightgateStatusbit rechts vom RevPi ist ein piGate Modul angeschlossen.
temperatureGibt CPU-Temperatur zurueck.
unconfdeviceStatusbit fuer ein IO-Modul nicht mit PiCtory konfiguriert.
-

-Static Methods

- - -
None
- -

-Core.__errorlimit

-__errorlimit(slc_io, errorlimit) -

-Verwaltet das Schreiben der ErrorLimits. -

-
slc_io
-
-Byte Slice vom ErrorLimit -
-
-
Returns:
-
-Aktuellen ErrorLimit oder None wenn nicht verfuegbar -
-
-

-Core._devconfigure

-_devconfigure() -

-Core-Klasse vorbereiten. -

-

-Core._get_leda1

-_get_leda1() -

-Gibt den Zustand der LED A1 vom Core zurueck. -

-
Returns:
-
-0=aus, 1=gruen, 2=rot -
-
-

-Core._get_leda2

-_get_leda2() -

-Gibt den Zustand der LED A2 vom Core zurueck. -

-
Returns:
-
-0=aus, 1=gruen, 2=rot -
-
-

-Core._get_status

-_get_status() -

-Gibt den RevPi Core Status zurueck. -

-
Returns:
-
-Status als -
-
-

-Core._set_calculatedled

-_set_calculatedled(addresslist, shifted_value) -

-Berechnet und setzt neuen Bytewert fuer LED byte. -

-
addresslist
-
-Liste der Vergleicher -
shifed_value
-
-Bits vergleichen -
-
-

-Core._set_leda1

-_set_leda1(value) -

-Setzt den Zustand der LED A1 vom Core. -

-
value
-
-0=aus, 1=gruen, 2=rot -
-
-

-Core._set_leda2

-_set_leda2(value) -

-Setzt den Zustand der LED A2 vom Core. -

-
value
-
-0=aus, 1=gruen, 2=rot -
-
-

-Core.errorlimit1

-errorlimit1(value) -

-Setzt RS485 ErrorLimit1 auf neuen Wert. -

-
value
-
-Neuer ErrorLimit1 Wert -
-
-

-Core.errorlimit2

-errorlimit2(value) -

-Setzt RS485 ErrorLimit2 auf neuen Wert. -

-
value
-
-Neuer ErrorLimit2 Wert -
-
-

-Core.frequency

-frequency() -

-Gibt CPU Taktfrequenz zurueck. -

-
Returns:
-
-CPU Taktfrequenz in MHz -
-
-

-Core.iocycle

-iocycle() -

-Gibt Zykluszeit der Prozessabbildsynchronisierung zurueck. -

-
Returns:
-
-Zykluszeit in ms -
-
-

-Core.ioerrorcount

-ioerrorcount() -

-Gibt Fehleranzahl auf RS485 piBridge Bus zurueck. -

-
Returns:
-
-Fehleranzahl der piBridge -
-
-

-Core.leftgate

-leftgate() -

-Statusbit links vom RevPi ist ein piGate Modul angeschlossen. -

-
Returns:
-
-True, wenn piGate links existiert -
-
-

-Core.missingdeviceorgate

-missingdeviceorgate() -

-Statusbit fuer ein IO-Modul fehlt oder piGate konfiguriert. -

-
Returns:
-
-True, wenn IO-Modul fehlt oder piGate konfiguriert -
-
-

-Core.overunderflow

-overunderflow() -

-Statusbit Modul belegt mehr oder weniger Speicher als konfiguriert. -

-
Returns:
-
-True, wenn falscher Speicher belegt ist -
-
-

-Core.picontrolrunning

-picontrolrunning() -

-Statusbit fuer piControl-Treiber laeuft. -

-
Returns:
-
-True, wenn Treiber laeuft -
-
-

-Core.rightgate

-rightgate() -

-Statusbit rechts vom RevPi ist ein piGate Modul angeschlossen. -

-
Returns:
-
-True, wenn piGate rechts existiert -
-
-

-Core.temperature

-temperature() -

-Gibt CPU-Temperatur zurueck. -

-
Returns:
-
-CPU-Temperatur in Celsius -
-
-

-Core.unconfdevice

-unconfdevice() -

-Statusbit fuer ein IO-Modul nicht mit PiCtory konfiguriert. -

-
Returns:
-
-True, wenn IO Modul nicht konfiguriert -
-
-
Up
-

- -

Device

-

-Basisklasse fuer alle Device-Objekte. -

- Die Basisfunktionalitaet generiert bei Instantiierung alle IOs und - erweitert den Prozessabbildpuffer um die benoetigten Bytes. Sie verwaltet - ihren Prozessabbildpuffer und sorgt fuer die Aktualisierung der IO-Werte. -

- -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
length
name
offset
position
producttype
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DeviceInstantiierung der Device-Klasse.
__bytes__Gibt alle Daten des Devices als zurueck.
__contains__Prueft ob IO auf diesem Device liegt.
__getioiterGibt mit allen IOs zurueck.
__getitem__Gibt IO an angegebener Stelle zurueck.
__int__Gibt die Positon im RevPi Bus zurueck.
__iter__Gibt Iterator aller IOs zurueck.
__len__Gibt Anzahl der Bytes zurueck, die dieses Device belegt.
__str__Gibt den Namen des Devices zurueck.
_buildioErstellt aus der piCtory-Liste die IOs fuer dieses Device.
_devconfigureFunktion zum ueberschreiben von abgeleiteten Klassen.
_get_offsetGibt den Deviceoffset im Prozessabbild zurueck.
_get_producttypeGibt den Produkttypen des device zurueck.
_update_my_io_listErzeugt eine neue IO Liste fuer schnellen Zugriff.
autorefreshRegistriert dieses Device fuer die automatische Synchronisierung.
get_alliosGibt eine Liste aller Inputs und Outputs zurueck, keine MEMs.
get_inputsGibt eine Liste aller Inputs zurueck.
get_memoriesGibt eine Liste aller Memoryobjekte zurueck.
get_outputsGibt eine Liste aller Outputs zurueck.
readprocimgAlle Inputs fuer dieses Device vom Prozessabbild einlesen.
setdefaultvaluesAlle Outputbuffer fuer dieses Device auf default Werte setzen.
syncoutputsLesen aller Outputs im Prozessabbild fuer dieses Device.
writeprocimgSchreiben aller Outputs dieses Devices ins Prozessabbild.
-

-Static Methods

- - -
None
- -

-Device (Constructor)

-Device(parentmodio, dict_device, simulator=False) -

-Instantiierung der Device-Klasse. -

-
parent
-
-RevpiModIO parent object -
dict_device
-
- fuer dieses Device aus piCotry -
simulator:
-
-Laedt das Modul als Simulator und vertauscht IOs -
-
-

-Device.__bytes__

-__bytes__() -

-Gibt alle Daten des Devices als zurueck. -

-
Returns:
-
-Devicedaten als -
-
-

-Device.__contains__

-__contains__(key) -

-Prueft ob IO auf diesem Device liegt. -

-
key
-
-IO-Name / IO-Bytenummer -
-
-
Returns:
-
-True, wenn IO auf Device vorhanden -
-
-

-Device.__getioiter

-__getioiter(ioslc, export) -

-Gibt mit allen IOs zurueck. -

-
ioslc
-
-IO Abschnitt -
export
-
-Filter fuer 'Export' Flag in piCtory -
-
-
Returns:
-
-IOs als Iterator -
-
-

-Device.__getitem__

-__getitem__(key) -

-Gibt IO an angegebener Stelle zurueck. -

-
key
-
-Index des IOs auf dem device als -
-
-
Returns:
-
-Gefundenes IO-Objekt -
-
-

-Device.__int__

-__int__() -

-Gibt die Positon im RevPi Bus zurueck. -

-
Returns:
-
-Positionsnummer -
-
-

-Device.__iter__

-__iter__() -

-Gibt Iterator aller IOs zurueck. -

-
Returns:
-
- aller IOs -
-
-

-Device.__len__

-__len__() -

-Gibt Anzahl der Bytes zurueck, die dieses Device belegt. -

-
Returns:
-
- -
-
-

-Device.__str__

-__str__() -

-Gibt den Namen des Devices zurueck. -

-
Returns:
-
-Devicename -
-
-

-Device._buildio

-_buildio(dict_io, iotype) -

-Erstellt aus der piCtory-Liste die IOs fuer dieses Device. -

-
dict_io
-
--Objekt aus piCtory Konfiguration -
iotype
-
- Wert -
-
-
Returns:
-
- mit Start und Stop Position dieser IOs -
-
-

-Device._devconfigure

-_devconfigure() -

-Funktion zum ueberschreiben von abgeleiteten Klassen. -

-

-Device._get_offset

-_get_offset() -

-Gibt den Deviceoffset im Prozessabbild zurueck. -

-
Returns:
-
-Deviceoffset -
-
-

-Device._get_producttype

-_get_producttype() -

-Gibt den Produkttypen des device zurueck. -

-
Returns:
-
-Deviceprodukttyp -
-
-

-Device._update_my_io_list

-_update_my_io_list() -

-Erzeugt eine neue IO Liste fuer schnellen Zugriff. -

-

-Device.autorefresh

-autorefresh(activate=True) -

-Registriert dieses Device fuer die automatische Synchronisierung. -

-
activate
-
-Default True fuegt Device zur Synchronisierung hinzu -
-
-

-Device.get_allios

-get_allios(export=None) -

-Gibt eine Liste aller Inputs und Outputs zurueck, keine MEMs. -

- Bleibt Parameter 'export' auf None werden alle Inputs und Outputs - zurueckgegeben. Wird 'export' auf True/False gesetzt, werden nur Inputs - und Outputs zurueckgegeben, bei denen der Wert 'Export' in piCtory - uebereinstimmt. -

-
export
-
-Nur In-/Outputs mit angegebenen 'Export' Wert in piCtory -
-
-
Returns:
-
- Input und Output, keine MEMs -
-
-

-Device.get_inputs

-get_inputs(export=None) -

-Gibt eine Liste aller Inputs zurueck. -

- Bleibt Parameter 'export' auf None werden alle Inputs zurueckgegeben. - Wird 'export' auf True/False gesetzt, werden nur Inputs zurueckgegeben, - bei denen der Wert 'Export' in piCtory uebereinstimmt. -

-
export
-
-Nur Inputs mit angegebenen 'Export' Wert in piCtory -
-
-
Returns:
-
- Inputs -
-
-

-Device.get_memories

-get_memories(export=None) -

-Gibt eine Liste aller Memoryobjekte zurueck. -

- Bleibt Parameter 'export' auf None werden alle Mems zurueckgegeben. - Wird 'export' auf True/False gesetzt, werden nur Mems zurueckgegeben, - bei denen der Wert 'Export' in piCtory uebereinstimmt. -

-
export
-
-Nur Mems mit angegebenen 'Export' Wert in piCtory -
-
-
Returns:
-
- Mems -
-
-

-Device.get_outputs

-get_outputs(export=None) -

-Gibt eine Liste aller Outputs zurueck. -

- Bleibt Parameter 'export' auf None werden alle Outputs zurueckgegeben. - Wird 'export' auf True/False gesetzt, werden nur Outputs - zurueckgegeben, bei denen der Wert 'Export' in piCtory uebereinstimmt. -

-
export
-
-Nur Outputs mit angegebenen 'Export' Wert in piCtory -
-
-
Returns:
-
- Outputs -
-
-

-Device.readprocimg

-readprocimg() -

-Alle Inputs fuer dieses Device vom Prozessabbild einlesen. -

-
Returns:
-
-True, wenn erfolgreich ausgefuehrt -
-
-
See Also:
-
-RevPiModIO.readprocimg() -
-
-

-Device.setdefaultvalues

-setdefaultvalues() -

-Alle Outputbuffer fuer dieses Device auf default Werte setzen. -

-
Returns:
-
-True, wenn erfolgreich ausgefuehrt -
-
-
See Also:
-
-RevPiModIO.setdefaultvalues() -
-
-

-Device.syncoutputs

-syncoutputs() -

-Lesen aller Outputs im Prozessabbild fuer dieses Device. -

-
Returns:
-
-True, wenn erfolgreich ausgefuehrt -
-
-
See Also:
-
-RevPiModIO.syncoutputs() -
-
-

-Device.writeprocimg

-writeprocimg() -

-Schreiben aller Outputs dieses Devices ins Prozessabbild. -

-
Returns:
-
-True, wenn erfolgreich ausgefuehrt -
-
-
See Also:
-
-RevPiModIO.writeprocimg() -
-
-
Up
-

- -

DeviceList

-

-Basisklasse fuer direkten Zugriff auf Device Objekte. -

-

-Derived from

-object -

-Class Attributes

- - -
None
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - -
DeviceListInit DeviceList class.
__contains__Prueft ob Device existiert.
__delattr__Entfernt angegebenes Device.
__delitem__Entfernt Device an angegebener Position.
__getitem__Gibt angegebenes Device zurueck.
__iter__Gibt Iterator aller Devices zurueck.
__len__Gibt Anzahl der Devices zurueck.
__setattr__Setzt Attribute nur wenn Device.
-

-Static Methods

- - -
None
- -

-DeviceList (Constructor)

-DeviceList() -

-Init DeviceList class. -

-

-DeviceList.__contains__

-__contains__(key) -

-Prueft ob Device existiert. -

-
key
-
-DeviceName / Positionsnummer -
-
-
Returns:
-
-True, wenn Device vorhanden -
-
-

-DeviceList.__delattr__

-__delattr__(key, delcomplete=True) -

-Entfernt angegebenes Device. -

-
key
-
-Device zum entfernen -
delcomplete
-
-Wenn True wird Device komplett entfernt -
-
-

-DeviceList.__delitem__

-__delitem__(key) -

-Entfernt Device an angegebener Position. -

-
key
-
-Deviceposition zum entfernen -
-
-

-DeviceList.__getitem__

-__getitem__(key) -

-Gibt angegebenes Device zurueck. -

-
key
-
-DeviceName / Positionsnummer -
-
-
Returns:
-
-Gefundenes -Objekt -
-
-

-DeviceList.__iter__

-__iter__() -

-Gibt Iterator aller Devices zurueck. -

- Die Reihenfolge ist nach Position im Prozessabbild sortiert und nicht - nach Positionsnummer (Dies entspricht der Positionierung aus piCtory)! -

-
Returns:
-
- aller Devices -
-
-

-DeviceList.__len__

-__len__() -

-Gibt Anzahl der Devices zurueck. - return Anzahl der Devices -

-

-DeviceList.__setattr__

-__setattr__(key, value) -

-Setzt Attribute nur wenn Device. -

-
key
-
-Attributname -
value
-
-Attributobjekt -
-
-
Up
-

- -

DioModule

-

-Stellt ein DIO / DI / DO Modul dar. -

-

-Derived from

-Device -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
DioModuleErweitert Device-Klasse zum Erkennen von IntIOCounter.
-

-Static Methods

- - -
None
- -

-DioModule (Constructor)

-DioModule(parentmodio, dict_device, simulator=False) -

-Erweitert Device-Klasse zum Erkennen von IntIOCounter. -

-
See Also:
-
-Device.__init__(...) -
-
-
Up
-

- -

Gateway

-

-Klasse fuer die RevPi Gateway-Devices. -

- Stellt neben den Funktionen von RevPiDevice weitere Funktionen fuer die - Gateways bereit. IOs auf diesem Device stellen die replace_io Funktion - zur verfuegung, ueber die eigene IOs definiert werden, die ein - RevPiStructIO-Objekt abbilden. - Dieser IO-Typ kann Werte ueber mehrere Bytes verarbeiten und zurueckgeben. -

-
See Also:
-
-replace_io(...) -
-
-

-Derived from

-Device -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - -
GatewayErweitert Device-Klasse um get_rawbytes-Funktionen.
get_rawbytesGibt die Bytes aus, die dieses Device verwendet.
-

-Static Methods

- - -
None
- -

-Gateway (Constructor)

-Gateway(parent, dict_device, simulator=False) -

-Erweitert Device-Klasse um get_rawbytes-Funktionen. -

-
See Also:
-
-Device.__init__(...) -
-
-

-Gateway.get_rawbytes

-get_rawbytes() -

-Gibt die Bytes aus, die dieses Device verwendet. -

-
Returns:
-
- des Devices -
-
-
Up
-

- -

Virtual

-

-Klasse fuer die RevPi Virtual-Devices. -

- Stellt die selben Funktionen wie Gateway zur Verfuegung. Es koennen - ueber die reg_*-Funktionen eigene IOs definiert werden, die ein - RevPiStructIO-Objekt abbilden. - Dieser IO-Typ kann Werte ueber mehrere Bytes verarbeiten und zurueckgeben. -

-
See Also:
-
-Gateway -
-
-

-Derived from

-Gateway -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
writeinputdefaultsSchreibt fuer ein virtuelles Device piCtory Defaultinputwerte.
-

-Static Methods

- - -
None
- -

-Virtual.writeinputdefaults

-writeinputdefaults() -

-Schreibt fuer ein virtuelles Device piCtory Defaultinputwerte. -

- Sollten in piCtory Defaultwerte fuer Inputs eines virtuellen Devices - angegeben sein, werden diese nur beim Systemstart oder einem piControl - Reset gesetzt. Sollte danach das Prozessabbild mit NULL ueberschrieben, - gehen diese Werte verloren. - Diese Funktion kann nur auf virtuelle Devices angewendet werden! -

-
Returns:
-
-True, wenn Arbeiten am virtuellen Device erfolgreich waren -
-
-
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.helper.html b/doc/revpimodio2.helper.html deleted file mode 100644 index 0224b20..0000000 --- a/doc/revpimodio2.helper.html +++ /dev/null @@ -1,634 +0,0 @@ - - -revpimodio2.helper - - - -

-revpimodio2.helper

-

-RevPiModIO Helperklassen und Tools. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
-

-Classes

- - - - - - - - - - - - - - -
CycletoolsWerkzeugkasten fuer Cycleloop-Funktion.
EventCallbackThread fuer das interne Aufrufen von Event-Funktionen.
ProcimgWriterKlasse fuer Synchroniseriungs-Thread.
Var
-

-Functions

- - -
None
-

- -

Cycletools

-

-Werkzeugkasten fuer Cycleloop-Funktion. -

- Diese Klasse enthaelt Werkzeuge fuer Zyklusfunktionen, wie Taktmerker - und Flankenmerker. - Zu beachten ist, dass die Flankenmerker beim ersten Zyklus alle den Wert - True haben! Ueber den Merker Cycletools.first kann ermittelt werden, - ob es sich um den ersten Zyklus handelt. -

- Taktmerker flag1c, flag5c, flag10c, usw. haben den als Zahl angegebenen - Wert an Zyklen jeweils False und True. - Beispiel: flag5c hat 5 Zyklen den Wert False und in den naechsten 5 Zyklen - den Wert True. -

- Flankenmerker flank5c, flank10c, usw. haben immer im, als Zahl angebenen - Zyklus fuer einen Zyklusdurchlauf den Wert True, sonst False. - Beispiel: flank5c hat immer alle 5 Zyklen den Wert True. -

- Diese Merker koennen z.B. verwendet werden um, an Outputs angeschlossene, - Lampen synchron blinken zu lassen. -

- -

-

-Derived from

-None -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CycletoolsInit Cycletools class.
_docycleZyklusarbeiten.
get_tofWert der Ausschaltverzoegerung.
get_tofcWert der Ausschaltverzoegerung.
get_tonEinschaltverzoegerung.
get_toncEinschaltverzoegerung.
get_tpImpulstimer.
get_tpcImpulstimer.
set_tofStartet bei Aufruf einen ausschaltverzoegerten Timer.
set_tofcStartet bei Aufruf einen ausschaltverzoegerten Timer.
set_tonStartet einen einschaltverzoegerten Timer.
set_toncStartet einen einschaltverzoegerten Timer.
set_tpStartet einen Impuls Timer.
set_tpcStartet einen Impuls Timer.
-

-Static Methods

- - -
None
- -

-Cycletools (Constructor)

-Cycletools(cycletime) -

-Init Cycletools class. -

-

-Cycletools._docycle

-_docycle() -

-Zyklusarbeiten. -

-

-Cycletools.get_tof

-get_tof(name) -

-Wert der Ausschaltverzoegerung. -

-
name
-
-Eindeutiger Name des Timers -
-
-
Returns:
-
-Wert der Ausschaltverzoegerung -
-
-

-Cycletools.get_tofc

-get_tofc(name) -

-Wert der Ausschaltverzoegerung. -

-
name
-
-Eindeutiger Name des Timers -
-
-
Returns:
-
-Wert der Ausschaltverzoegerung -
-
-

-Cycletools.get_ton

-get_ton(name) -

-Einschaltverzoegerung. -

-
name
-
-Eindeutiger Name des Timers -
-
-
Returns:
-
-Wert der Einschaltverzoegerung -
-
-

-Cycletools.get_tonc

-get_tonc(name) -

-Einschaltverzoegerung. -

-
name
-
-Eindeutiger Name des Timers -
-
-
Returns:
-
-Wert der Einschaltverzoegerung -
-
-

-Cycletools.get_tp

-get_tp(name) -

-Impulstimer. -

-
name
-
-Eindeutiger Name des Timers -
-
-
Returns:
-
-Wert des Impulses -
-
-

-Cycletools.get_tpc

-get_tpc(name) -

-Impulstimer. -

-
name
-
-Eindeutiger Name des Timers -
-
-
Returns:
-
-Wert des Impulses -
-
-

-Cycletools.set_tof

-set_tof(name, milliseconds) -

-Startet bei Aufruf einen ausschaltverzoegerten Timer. -

-
name
-
-Eindeutiger Name fuer Zugriff auf Timer -
milliseconds
-
-Verzoegerung in Millisekunden -
-
-

-Cycletools.set_tofc

-set_tofc(name, cycles) -

-Startet bei Aufruf einen ausschaltverzoegerten Timer. -

-
name
-
-Eindeutiger Name fuer Zugriff auf Timer -
cycles
-
-Zyklusanzahl, der Verzoegerung wenn nicht neu gestartet -
-
-

-Cycletools.set_ton

-set_ton(name, milliseconds) -

-Startet einen einschaltverzoegerten Timer. -

-
name
-
-Eindeutiger Name fuer Zugriff auf Timer -
milliseconds
-
-Millisekunden, der Verzoegerung wenn neu gestartet -
-
-

-Cycletools.set_tonc

-set_tonc(name, cycles) -

-Startet einen einschaltverzoegerten Timer. -

-
name
-
-Eindeutiger Name fuer Zugriff auf Timer -
cycles
-
-Zyklusanzahl, der Verzoegerung wenn neu gestartet -
-
-

-Cycletools.set_tp

-set_tp(name, milliseconds) -

-Startet einen Impuls Timer. -

-
name
-
-Eindeutiger Name fuer Zugriff auf Timer -
milliseconds
-
-Millisekunden, die der Impuls anstehen soll -
-
-

-Cycletools.set_tpc

-set_tpc(name, cycles) -

-Startet einen Impuls Timer. -

-
name
-
-Eindeutiger Name fuer Zugriff auf Timer -
cycles
-
-Zyklusanzahl, die der Impuls anstehen soll -
-
-
Up
-

- -

EventCallback

-

-Thread fuer das interne Aufrufen von Event-Funktionen. -

- Der Eventfunktion, welche dieser Thread aufruft, wird der Thread selber - als Parameter uebergeben. Darauf muss bei der definition der Funktion - geachtet werden z.B. "def event(th):". Bei umfangreichen Funktionen kann - dieser ausgewertet werden um z.B. doppeltes Starten zu verhindern. - Ueber EventCallback.ioname kann der Name des IO-Objekts abgerufen werden, - welches das Event ausgeloest hast. EventCallback.iovalue gibt den Wert des - IO-Objekts zum Ausloesezeitpunkt zurueck. - Der Thread stellt das EventCallback.exit Event als Abbruchbedingung fuer - die aufgerufene Funktion zur Verfuegung. - Durch Aufruf der Funktion EventCallback.stop() wird das exit-Event gesetzt - und kann bei Schleifen zum Abbrechen verwendet werden. - Mit dem .exit() Event auch eine Wartefunktion realisiert - werden: "th.exit.wait(0.5)" - Wartet 500ms oder bricht sofort ab, wenn - fuer den Thread .stop() aufgerufen wird. -

- while not th.exit.is_set(): - # IO-Arbeiten - th.exit.wait(0.5) -

- -

-

-Derived from

-Thread -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - -
EventCallbackInit EventCallback class.
runRuft die registrierte Funktion auf.
stopSetzt das exit-Event mit dem die Funktion beendet werden kann.
-

-Static Methods

- - -
None
- -

-EventCallback (Constructor)

-EventCallback(func, name, value) -

-Init EventCallback class. -

-
func
-
-Funktion die beim Start aufgerufen werden soll -
name
-
-IO-Name -
value
-
-IO-Value zum Zeitpunkt des Events -
-
-

-EventCallback.run

-run() -

-Ruft die registrierte Funktion auf. -

-

-EventCallback.stop

-stop() -

-Setzt das exit-Event mit dem die Funktion beendet werden kann. -

-
Up
-

- -

ProcimgWriter

-

-Klasse fuer Synchroniseriungs-Thread. -

- Diese Klasse wird als Thread gestartet, wenn das Prozessabbild zyklisch - synchronisiert werden soll. Diese Funktion wird hauptsaechlich fuer das - Event-Handling verwendet. -

- -

-

-Derived from

-Thread -

-Class Attributes

- - -
__slots__
ioerrors
maxioerrors
refresh
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ProcimgWriterInit ProcimgWriter class.
__check_changeFindet Aenderungen fuer die Eventueberwachung.
__exec_thLaeuft als Thread, der Events als Thread startet.
_collect_eventsAktiviert oder Deaktiviert die Eventueberwachung.
_get_ioerrorsRuft aktuelle Anzahl der Fehler ab.
_gotioerrorIOError Verwaltung fuer autorefresh.
get_maxioerrorsGibt die Anzahl der maximal erlaubten Fehler zurueck.
get_refreshGibt Zykluszeit zurueck.
runStartet die automatische Prozessabbildsynchronisierung.
set_maxioerrorsSetzt die Anzahl der maximal erlaubten Fehler.
set_refreshSetzt die Zykluszeit in Millisekunden.
stopBeendet die automatische Prozessabbildsynchronisierung.
-

-Static Methods

- - -
None
- -

-ProcimgWriter (Constructor)

-ProcimgWriter(parentmodio) -

-Init ProcimgWriter class. -

-
parentmodio
-
-Parent Object -
-
-

-ProcimgWriter.__check_change

-__check_change(dev) -

-Findet Aenderungen fuer die Eventueberwachung. -

-

-ProcimgWriter.__exec_th

-__exec_th() -

-Laeuft als Thread, der Events als Thread startet. -

-

-ProcimgWriter._collect_events

-_collect_events(value) -

-Aktiviert oder Deaktiviert die Eventueberwachung. -

-
value
-
-True aktiviert / False deaktiviert -
-
-
Returns:
-
-True, wenn Anforderung erfolgreich war -
-
-

-ProcimgWriter._get_ioerrors

-_get_ioerrors() -

-Ruft aktuelle Anzahl der Fehler ab. -

-
Returns:
-
-Aktuelle Fehleranzahl -
-
-

-ProcimgWriter._gotioerror

-_gotioerror(e=None) -

-IOError Verwaltung fuer autorefresh. -

-
e
-
-Exception to log if debug is enabled -
-
-

-ProcimgWriter.get_maxioerrors

-get_maxioerrors() -

-Gibt die Anzahl der maximal erlaubten Fehler zurueck. -

-
Returns:
-
-Anzahl erlaubte Fehler -
-
-

-ProcimgWriter.get_refresh

-get_refresh() -

-Gibt Zykluszeit zurueck. -

-
Returns:
-
- Zykluszeit in Millisekunden -
-
-

-ProcimgWriter.run

-run() -

-Startet die automatische Prozessabbildsynchronisierung. -

-

-ProcimgWriter.set_maxioerrors

-set_maxioerrors(value) -

-Setzt die Anzahl der maximal erlaubten Fehler. -

-
value
-
-Anzahl erlaubte Fehler -
-
-

-ProcimgWriter.set_refresh

-set_refresh(value) -

-Setzt die Zykluszeit in Millisekunden. -

-
value
-
- Millisekunden -
-
-

-ProcimgWriter.stop

-stop() -

-Beendet die automatische Prozessabbildsynchronisierung. -

-
Up
-

- -

Var

- -

-Derived from

-None -

-Class Attributes

- - -
None
-

-Class Methods

- - -
None
-

-Methods

- - -
None
-

-Static Methods

- - -
None
- -
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.io.html b/doc/revpimodio2.io.html deleted file mode 100644 index a83171d..0000000 --- a/doc/revpimodio2.io.html +++ /dev/null @@ -1,1115 +0,0 @@ - - -revpimodio2.io - - - -

-revpimodio2.io

-

-RevPiModIO Modul fuer die Verwaltung der IOs. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
-

-Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - -
DeadIOKlasse, mit der ersetzte IOs verwaltet werden.
IOBaseBasisklasse fuer alle IO-Objekte.
IOEventBasisklasse fuer IO-Events.
IOListBasisklasse fuer direkten Zugriff auf IO Objekte.
IntIOKlasse fuer den Zugriff auf die Daten mit Konvertierung in int.
IntIOCounterErweitert die IntIO-Klasse um die .reset() Funktion fuer Counter.
IntIOReplaceableErweitert die IntIO-Klasse um die .replace_io Funktion.
StructIOKlasse fuer den Zugriff auf Daten ueber ein definierten struct.
-

-Functions

- - -
None
-

- -

DeadIO

-

-Klasse, mit der ersetzte IOs verwaltet werden. -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
_parentdevice
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - -
DeadIOInstantiierung der DeadIO-Klasse.
replace_ioStellt Funktion fuer weiter Bit-Ersetzungen bereit.
-

-Static Methods

- - -
None
- -

-DeadIO (Constructor)

-DeadIO(deadio) -

-Instantiierung der DeadIO-Klasse. -

-
deadio
-
-IO, der ersetzt wurde -
-
-

-DeadIO.replace_io

-replace_io(name, frm, **kwargs) -

-Stellt Funktion fuer weiter Bit-Ersetzungen bereit. -

-
See Also:
-
-replace_io(...) -
-
-
Up
-

- -

IOBase

-

-Basisklasse fuer alle IO-Objekte. -

- Die Basisfunktionalitaet ermoeglicht das Lesen und Schreiben der Werte - als oder . Dies entscheidet sich bei der - Instantiierung. - Wenn eine Bittadresse angegeben wird, werden -Werte erwartet - und zurueckgegeben, ansonsten . -

- Diese Klasse dient als Basis fuer andere IO-Klassen mit denen die Werte - auch als verwendet werden koennen. -

- -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
address
byteorder
defaultvalue
length
name
type
value
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IOBaseInstantiierung der IOBase-Klasse.
__bool__-Wert der Klasse.
__len__Gibt die Bytelaenge des IO zurueck.
__reg_xeventVerwaltet reg_event und reg_timerevent.
__str__-Wert der Klasse.
_get_addressGibt die absolute Byteadresse im Prozessabbild zurueck.
_get_byteorderGibt konfigurierte Byteorder zurueck.
_get_iotypeGibt io type zurueck.
get_defaultvalueGibt die Defaultvalue von piCtory zurueck.
get_valueGibt den Wert des IOs zurueck.
reg_eventRegistriert fuer IO ein Event bei der Eventueberwachung.
reg_timereventRegistriert fuer IO einen Timer, welcher nach delay func ausfuehrt.
set_valueSetzt den Wert des IOs.
unreg_eventEntfernt ein Event aus der Eventueberwachung.
waitWartet auf Wertaenderung eines IOs.
-

-Static Methods

- - -
None
- -

-IOBase (Constructor)

-IOBase(parentdevice, valuelist, iotype, byteorder, signed) -

-Instantiierung der IOBase-Klasse. -

-
parentdevice
-
-Parentdevice auf dem der IO liegt -
valuelist
-
-Datenliste fuer Instantiierung - ["name","defval","bitlen","startaddrdev",exp,"idx","bmk","bitaddr"] -
iotype
-
- Wert -
byteorder
-
-Byteorder 'little'/'big' fuer Berechnung -
sigend
-
-Intberechnung mit Vorzeichen durchfuehren -
-
-

-IOBase.__bool__

-__bool__() -

--Wert der Klasse. -

-
Returns:
-
- Nur False wenn False oder 0 sonst True -
-
-

-IOBase.__len__

-__len__() -

-Gibt die Bytelaenge des IO zurueck. -

-
Returns:
-
-Bytelaenge des IO - 0 bei BITs -
-
-

-IOBase.__reg_xevent

-__reg_xevent(func, delay, edge, as_thread, overwrite, prefire) -

-Verwaltet reg_event und reg_timerevent. -

-
func
-
-Funktion die bei Aenderung aufgerufen werden soll -
delay
-
-Verzoegerung in ms zum Ausloesen - auch bei Wertaenderung -
edge
-
-Ausfuehren bei RISING, FALLING or BOTH Wertaenderung -
as_thread
-
-Bei True, Funktion als EventCallback-Thread ausfuehren -
overwrite
-
-Wenn True, wird Event bei ueberschrieben -
prefire
-
-Ausloesen mit aktuellem Wert, wenn mainloop startet -
-
-

-IOBase.__str__

-__str__() -

--Wert der Klasse. -

-
Returns:
-
-Namen des IOs -
-
-

-IOBase._get_address

-_get_address() -

-Gibt die absolute Byteadresse im Prozessabbild zurueck. -

-
Returns:
-
-Absolute Byteadresse -
-
-

-IOBase._get_byteorder

-_get_byteorder() -

-Gibt konfigurierte Byteorder zurueck. -

-
Returns:
-
- Byteorder -
-
-

-IOBase._get_iotype

-_get_iotype() -

-Gibt io type zurueck. -

-
Returns:
-
- io type -
-
-

-IOBase.get_defaultvalue

-get_defaultvalue() -

-Gibt die Defaultvalue von piCtory zurueck. -

-
Returns:
-
-Defaultvalue als oder -
-
-

-IOBase.get_value

-get_value() -

-Gibt den Wert des IOs zurueck. -

-
Returns:
-
-IO-Wert als oder -
-
-

-IOBase.reg_event

-reg_event(func, delay=0, edge=BOTH, as_thread=False, prefire=False) -

-Registriert fuer IO ein Event bei der Eventueberwachung. -

- Die uebergebene Funktion wird ausgefuehrt, wenn sich der IO Wert - aendert. Mit Angabe von optionalen Parametern kann das - Ausloeseverhalten gesteuert werden. -

- HINWEIS: Die delay-Zeit muss in die .cycletime passen, ist dies nicht - der Fall, wird IMMER aufgerundet! -

-
func
-
-Funktion die bei Aenderung aufgerufen werden soll -
delay
-
-Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt -
edge
-
-Ausfuehren bei RISING, FALLING or BOTH Wertaenderung -
as_thread
-
-Bei True, Funktion als EventCallback-Thread ausfuehren -
prefire
-
-Ausloesen mit aktuellem Wert, wenn mainloop startet -
-
-

-IOBase.reg_timerevent

-reg_timerevent(func, delay, edge=BOTH, as_thread=False) -

-Registriert fuer IO einen Timer, welcher nach delay func ausfuehrt. -

- Der Timer wird gestartet, wenn sich der IO Wert aendert und fuehrt die - uebergebene Funktion aus - auch wenn sich der IO Wert in der - zwischenzeit geaendert hat. Sollte der Timer nicht abelaufen sein und - die Bedingugn erneut zutreffen, wird der Timer NICHT auf den delay Wert - zurueckgesetzt oder ein zweites Mal gestartet. Fuer dieses Verhalten - kann .reg_event(..., delay=wert) verwendet werden. -

- HINWEIS: Die delay-Zeit muss in die .cycletime passen, ist dies nicht - der Fall, wird IMMER aufgerundet! -

-
func
-
-Funktion die bei Aenderung aufgerufen werden soll -
delay
-
-Verzoegerung in ms zum Ausloesen - auch bei Wertaenderung -
edge
-
-Ausfuehren bei RISING, FALLING or BOTH Wertaenderung -
as_thread
-
-Bei True, Funktion als EventCallback-Thread ausfuehren -
-
-

-IOBase.set_value

-set_value(value) -

-Setzt den Wert des IOs. -

-
value
-
-IO-Wert als oder -
-
-

-IOBase.unreg_event

-unreg_event(func=None, edge=None) -

-Entfernt ein Event aus der Eventueberwachung. -

-
func
-
-Nur Events mit angegebener Funktion -
edge
-
-Nur Events mit angegebener Funktion und angegebener Edge -
-
-

-IOBase.wait

-wait(edge=BOTH, exitevent=None, okvalue=None, timeout=0) -

-Wartet auf Wertaenderung eines IOs. -

- Die Wertaenderung wird immer uerberprueft, wenn fuer Devices - mit aktiviertem autorefresh neue Daten gelesen wurden. -

- Bei Wertaenderung, wird das Warten mit 0 als Rueckgabewert beendet. -

- HINWEIS: Wenn keine neuen Daten liefert, wird - bis in die Ewigkeit gewartet (nicht bei Angabe von "timeout"). -

- Wenn edge mit RISING oder FALLING angegeben wird, muss diese Flanke - ausgeloest werden. Sollte der Wert 1 sein beim Eintritt mit Flanke - RISING, wird das Warten erst bei Aenderung von 0 auf 1 beendet. -

- Als exitevent kann ein -Objekt uebergeben - werden, welches das Warten bei is_set() sofort mit 1 als Rueckgabewert - beendet. -

- Wenn der Wert okvalue an dem IO fuer das Warten anliegt, wird - das Warten sofort mit -1 als Rueckgabewert beendet. -

- Der Timeoutwert bricht beim Erreichen das Warten sofort mit - Wert 2 Rueckgabewert ab. (Das Timeout wird ueber die Zykluszeit - der autorefresh Funktion berechnet, entspricht also nicht exakt den - angegeben Millisekunden! Es wird immer nach oben gerundet!) -

-
edge
-
-Flanke RISING, FALLING, BOTH die eintreten muss -
exitevent
-
- fuer vorzeitiges Beenden -
okvalue
-
-IO-Wert, bei dem das Warten sofort beendet wird -
timeout
-
-Zeit in ms nach der abgebrochen wird -
-
-
Returns:
-
- erfolgreich Werte <= 0 - - Erfolgreich gewartet - Wert 0: IO hat den Wert gewechselt - Wert -1: okvalue stimmte mit IO ueberein - - Fehlerhaft gewartet - Wert 1: exitevent wurde gesetzt - Wert 2: timeout abgelaufen - Wert 100: Devicelist.exit() wurde aufgerufen -
-
-
Up
-

- -

IOEvent

-

-Basisklasse fuer IO-Events. -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
IOEventInit IOEvent class.
-

-Static Methods

- - -
None
- -

-IOEvent (Constructor)

-IOEvent(func, edge, as_thread, delay, overwrite, prefire) -

-Init IOEvent class. -

-
Up
-

- -

IOList

-

-Basisklasse fuer direkten Zugriff auf IO Objekte. -

-

-Derived from

-object -

-Class Attributes

- - -
None
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IOListInit IOList class.
__contains__Prueft ob IO existiert.
__delattr__Entfernt angegebenen IO.
__getattr__Verwaltet geloeschte IOs (Attribute, die nicht existieren).
__getitem__Ruft angegebenen IO ab.
__iter__Gibt Iterator aller IOs zurueck.
__len__Gibt die Anzahl aller IOs zurueck.
__private_replace_oldio_with_newioErsetzt bestehende IOs durch den neu Registrierten.
__setattr__Verbietet aus Leistungsguenden das direkte Setzen von Attributen.
_private_register_new_io_objectRegistriert neues IO Objekt unabhaenging von __setattr__.
-

-Static Methods

- - -
None
- -

-IOList (Constructor)

-IOList() -

-Init IOList class. -

-

-IOList.__contains__

-__contains__(key) -

-Prueft ob IO existiert. -

-
key
-
-IO-Name oder Bytenummer -
-
-
Returns:
-
-True, wenn IO vorhanden / Byte belegt -
-
-

-IOList.__delattr__

-__delattr__(key) -

-Entfernt angegebenen IO. -

-
key
-
-IO zum entfernen -
-
-

-IOList.__getattr__

-__getattr__(key) -

-Verwaltet geloeschte IOs (Attribute, die nicht existieren). -

-
key
-
-Name oder Byte eines alten IOs -
-
-
Returns:
-
-Alten IO, wenn in Ref-Listen -
-
-

-IOList.__getitem__

-__getitem__(key) -

-Ruft angegebenen IO ab. -

- Wenn der Key ist, wird ein einzelner IO geliefert. Wird - der Key als uebergeben, wird eine - geliefert mit 0, 1 oder 8 Eintraegen. - Wird als Key gegeben, werden die Listen in einer Liste - zurueckgegeben. -

-
key
-
-IO Name als oder Byte als . -
-
-
Returns:
-
-IO Objekt oder Liste der IOs -
-
-

-IOList.__iter__

-__iter__() -

-Gibt Iterator aller IOs zurueck. -

-
Returns:
-
-Iterator aller IOs -
-
-

-IOList.__len__

-__len__() -

-Gibt die Anzahl aller IOs zurueck. -

-
Returns:
-
-Anzahl aller IOs -
-
-

-IOList.__private_replace_oldio_with_newio

-__private_replace_oldio_with_newio(io) -

-Ersetzt bestehende IOs durch den neu Registrierten. -

-
io
-
-Neuer IO der eingefuegt werden soll -
-
-

-IOList.__setattr__

-__setattr__(key, value) -

-Verbietet aus Leistungsguenden das direkte Setzen von Attributen. -

-

-IOList._private_register_new_io_object

-_private_register_new_io_object(new_io) -

-Registriert neues IO Objekt unabhaenging von __setattr__. -

-
new_io
-
-Neues IO Objekt -
-
-
Up
-

- -

IntIO

-

-Klasse fuer den Zugriff auf die Daten mit Konvertierung in int. -

- Diese Klasse erweitert die Funktion von um Funktionen, - ueber die mit Werten gearbeitet werden kann. Fuer die - Umwandlung koennen 'Byteorder' (Default 'little') und 'signed' (Default - False) als Parameter gesetzt werden. -

-
See Also:
-
-IOBase -
-
-

-Derived from

-IOBase -

-Class Attributes

- - -
__slots__
byteorder
defaultvalue
signed
value
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - -
__int__Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
_get_signedRuft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll.
_set_byteorderSetzt Byteorder fuer Umwandlung.
_set_signedLeft fest, ob der Wert Vorzeichenbehaftet behandelt werden soll.
get_intdefaultvalueGibt die Defaultvalue als zurueck.
get_intvalueGibt IO-Wert zurueck mit Beachtung byteorder/signed.
set_intvalueSetzt IO mit Beachtung byteorder/signed.
-

-Static Methods

- - -
None
- -

-IntIO.__int__

-__int__() -

-Gibt IO-Wert zurueck mit Beachtung byteorder/signed. -

-
Returns:
-
-IO-Wert als -
-
-

-IntIO._get_signed

-_get_signed() -

-Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll. -

-
Returns:
-
-True, wenn Vorzeichenbehaftet -
-
-

-IntIO._set_byteorder

-_set_byteorder(value) -

-Setzt Byteorder fuer Umwandlung. -

-
value
-
- 'little' or 'big' -
-
-

-IntIO._set_signed

-_set_signed(value) -

-Left fest, ob der Wert Vorzeichenbehaftet behandelt werden soll. -

-
value
-
-True, wenn mit Vorzeichen behandel -
-
-

-IntIO.get_intdefaultvalue

-get_intdefaultvalue() -

-Gibt die Defaultvalue als zurueck. -

-
Returns:
-
- Defaultvalue -
-
-

-IntIO.get_intvalue

-get_intvalue() -

-Gibt IO-Wert zurueck mit Beachtung byteorder/signed. -

-
Returns:
-
-IO-Wert als -
-
-

-IntIO.set_intvalue

-set_intvalue(value) -

-Setzt IO mit Beachtung byteorder/signed. -

-
value
-
- Wert -
-
-
Up
-

- -

IntIOCounter

-

-Erweitert die IntIO-Klasse um die .reset() Funktion fuer Counter. -

-

-Derived from

-IntIO -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - -
IntIOCounterInstantiierung der IntIOCounter-Klasse.
resetSetzt den Counter des Inputs zurueck.
-

-Static Methods

- - -
None
- -

-IntIOCounter (Constructor)

-IntIOCounter(counter_id, parentdevice, valuelist, iotype, byteorder, signed) -

-Instantiierung der IntIOCounter-Klasse. -

-
counter_id
-
-ID fuer den Counter, zu dem der IO gehoert (0-15) -
-
-
See Also:
-
-IOBase.__init__(...) -
-
-

-IntIOCounter.reset

-reset() -

-Setzt den Counter des Inputs zurueck. -

-
Up
-

- -

IntIOReplaceable

-

-Erweitert die IntIO-Klasse um die .replace_io Funktion. -

-

-Derived from

-IntIO -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
replace_ioErsetzt bestehenden IO mit Neuem.
-

-Static Methods

- - -
None
- -

-IntIOReplaceable.replace_io

-replace_io(name, frm, **kwargs) -

-Ersetzt bestehenden IO mit Neuem. -

- Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden, - uebernimmt das System die Daten aus dem ersetzten IO. -

- Es darf nur ein einzelnes Formatzeichen 'frm' uebergeben werden. Daraus - wird dann die benoetigte Laenge an Bytes berechnet und der Datentyp - festgelegt. Moeglich sind: - Bits / Bytes: ?, c, s - Integer : bB, hH, iI, lL, qQ - Float : e, f, d -

- Eine Ausnahme ist die Formatierung 's'. Hier koennen mehrere Bytes - zu einem langen IO zusammengefasst werden. Die Formatierung muss - '8s' fuer z.B. 8 Bytes sein - NICHT 'ssssssss'! -

- Wenn durch die Formatierung mehr Bytes benoetigt werden, als - der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls - verwendet und entfernt. -

-
name
-
-Name des neuen Inputs -
frm
-
-struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s' -
kwargs
-
-Weitere Parameter: - - bmk: interne Bezeichnung fuer IO - - bit: Registriert IO als am angegebenen Bit im Byte - - byteorder: Byteorder fuer den IO, Standardwert=little - - defaultvalue: Standardwert fuer IO - - event: Funktion fuer Eventhandling registrieren - - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt - - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung - - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus -
-
-
See Also:
-
-Python3 struct -
-
-
Up
-

- -

StructIO

-

-Klasse fuer den Zugriff auf Daten ueber ein definierten struct. -

- Sie stellt ueber struct die Werte in der gewuenschten Formatierung - bereit. Der struct-Formatwert wird bei der Instantiierung festgelegt. -

-
See Also:
-
-IOBase -
-
-

-Derived from

-IOBase -

-Class Attributes

- - -
__slots__
defaultvalue
frm
signed
value
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - -
StructIOErstellt einen IO mit struct-Formatierung.
_get_frmRuft die struct Formatierung ab.
_get_signedRuft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll.
get_structdefaultvalueGibt die Defaultvalue mit struct Formatierung zurueck.
get_structvalueGibt den Wert mit struct Formatierung zurueck.
set_structvalueSetzt den Wert mit struct Formatierung.
-

-Static Methods

- - -
None
- -

-StructIO (Constructor)

-StructIO(parentio, name, frm, **kwargs) -

-Erstellt einen IO mit struct-Formatierung. -

-
parentio
-
-ParentIO Objekt, welches ersetzt wird -
name
-
-Name des neuen IO -
frm
-
-struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s' -
kwargs
-
-Weitere Parameter: - - bmk: Bezeichnung fuer IO - - bit: Registriert IO als am angegebenen Bit im Byte - - byteorder: Byteorder fuer IO, Standardwert vom ersetzten IO - - defaultvalue: Standardwert fuer IO, Standard vom ersetzten IO -
-
-

-StructIO._get_frm

-_get_frm() -

-Ruft die struct Formatierung ab. -

-
Returns:
-
-struct Formatierung -
-
-

-StructIO._get_signed

-_get_signed() -

-Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll. -

-
Returns:
-
-True, wenn Vorzeichenbehaftet -
-
-

-StructIO.get_structdefaultvalue

-get_structdefaultvalue() -

-Gibt die Defaultvalue mit struct Formatierung zurueck. -

-
Returns:
-
-Defaultvalue vom Typ der struct-Formatierung -
-
-

-StructIO.get_structvalue

-get_structvalue() -

-Gibt den Wert mit struct Formatierung zurueck. -

-
Returns:
-
-Wert vom Typ der struct-Formatierung -
-
-

-StructIO.set_structvalue

-set_structvalue(value) -

-Setzt den Wert mit struct Formatierung. -

-
value
-
-Wert vom Typ der struct-Formatierung -
-
-
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.modio.html b/doc/revpimodio2.modio.html deleted file mode 100644 index b3e68b9..0000000 --- a/doc/revpimodio2.modio.html +++ /dev/null @@ -1,763 +0,0 @@ - - -revpimodio2.modio - - - -

-revpimodio2.modio

-

-RevPiModIO Hauptklasse fuer piControl0 Zugriff. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
-

-Classes

- - - - - - - - - - - -
RevPiModIOKlasse fuer die Verwaltung der piCtory Konfiguration.
RevPiModIODriverKlasse um eigene Treiber fuer die virtuellen Devices zu erstellen.
RevPiModIOSelectedKlasse fuer die Verwaltung einzelner Devices aus piCtory.
-

-Functions

- - -
None
-

- -

RevPiModIO

-

-Klasse fuer die Verwaltung der piCtory Konfiguration. -

- Diese Klasse uebernimmt die gesamte Konfiguration aus piCtory und bilded - die Devices und IOs ab. Sie uebernimmt die exklusive Verwaltung des - Prozessabbilds und stellt sicher, dass die Daten synchron sind. - Sollten nur einzelne Devices gesteuert werden, verwendet man - RevPiModIOSelected() und uebergibt bei Instantiierung eine Liste mit - Device Positionen oder Device Namen. -

- -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
configrsc
cycletime
debug
ioerrors
length
maxioerrors
monitoring
procimg
replace_io_file
simulator
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RevPiModIOInstantiiert die Grundfunktionen.
__del__Zerstoert alle Klassen um aufzuraeumen.
__evt_exitEventhandler fuer Programmende.
_configureVerarbeitet die piCtory Konfigurationsdatei.
_configure_replace_ioImportiert ersetzte IOs in diese Instanz.
_create_myfhErstellt FileObject mit Pfad zum procimg.
_get_configrscGetter function.
_get_cycletimeGibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
_get_debugGibt Status des Debugflags zurueck.
_get_ioerrorsGetter function.
_get_lengthGetter function.
_get_maxioerrorsGetter function.
_get_monitoringGetter function.
_get_procimgGetter function.
_get_replace_io_fileGibt Pfad zur verwendeten replace IO Datei aus.
_get_simulatorGetter function.
_gotioerrorIOError Verwaltung fuer Prozessabbildzugriff.
_set_cycletimeSetzt Aktualisierungsrate der Prozessabbild-Synchronisierung.
_set_maxioerrorsSetzt Anzahl der maximal erlaubten Fehler bei Prozessabbildzugriff.
_simulate_ioctlSimuliert IOCTL Funktionen auf procimg Datei.
autorefresh_allSetzt alle Devices in autorefresh Funktion.
cleanupBeendet autorefresh und alle Threads.
cycleloopStartet den Cycleloop.
exitBeendet mainloop() und optional autorefresh.
export_replaced_iosExportiert ersetzte IOs dieser Instanz.
get_jconfigrscLaedt die piCtory Konfiguration und erstellt ein .
handlesignalendSignalhandler fuer Programmende verwalten.
mainloopStartet den Mainloop mit Eventueberwachung.
readprocimgEinlesen aller Inputs aller/eines Devices vom Prozessabbild.
resetioerrorsSetzt aktuellen IOError-Zaehler auf 0 zurueck.
setdefaultvaluesAlle Outputbuffer werden auf die piCtory default Werte gesetzt.
syncoutputsLesen aller aktuell gesetzten Outputs im Prozessabbild.
writeprocimgSchreiben aller Outputs aller Devices ins Prozessabbild.
-

-Static Methods

- - -
None
- -

-RevPiModIO (Constructor)

-RevPiModIO(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) -

-Instantiiert die Grundfunktionen. -

-
autorefresh
-
-Wenn True, alle Devices zu autorefresh hinzufuegen -
monitoring
-
-In- und Outputs werden gelesen, niemals geschrieben -
syncoutputs
-
-Aktuell gesetzte Outputs vom Prozessabbild einlesen -
procimg
-
-Abweichender Pfad zum Prozessabbild -
configrsc
-
-Abweichender Pfad zur piCtory Konfigurationsdatei -
simulator
-
-Laedt das Modul als Simulator und vertauscht IOs -
debug
-
-Gibt bei allen Fehlern komplette Meldungen aus -
replace_io_file
-
-Replace IO Konfiguration aus Datei laden -
direct_output
-
-Write outputs immediately to process image (slow) -
-
-

-RevPiModIO.__del__

-__del__() -

-Zerstoert alle Klassen um aufzuraeumen. -

-

-RevPiModIO.__evt_exit

-__evt_exit(signum, sigframe) -

-Eventhandler fuer Programmende. -

-
signum
-
-Signalnummer -
sigframe
-
-Signalframe -
-
-

-RevPiModIO._configure

-_configure(jconfigrsc) -

-Verarbeitet die piCtory Konfigurationsdatei. -

-

-RevPiModIO._configure_replace_io

-_configure_replace_io() -

-Importiert ersetzte IOs in diese Instanz. -

- Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...) - in eine Datei exportiert worden sind. Diese IOs werden in dieser - Instanz wiederhergestellt. -

- -

-

-RevPiModIO._create_myfh

-_create_myfh() -

-Erstellt FileObject mit Pfad zum procimg. - return FileObject -

-

-RevPiModIO._get_configrsc

-_get_configrsc() -

-Getter function. -

-
Returns:
-
-Pfad der verwendeten piCtory Konfiguration -
-
-

-RevPiModIO._get_cycletime

-_get_cycletime() -

-Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus. -

-
Returns:
-
-Millisekunden -
-
-

-RevPiModIO._get_debug

-_get_debug() -

-Gibt Status des Debugflags zurueck. -

-
Returns:
-
-Status des Debugflags -
-
-

-RevPiModIO._get_ioerrors

-_get_ioerrors() -

-Getter function. -

-
Returns:
-
-Aktuelle Anzahl gezaehlter Fehler -
-
-

-RevPiModIO._get_length

-_get_length() -

-Getter function. -

-
Returns:
-
-Laenge in Bytes der Devices -
-
-

-RevPiModIO._get_maxioerrors

-_get_maxioerrors() -

-Getter function. -

-
Returns:
-
-Anzahl erlaubte Fehler -
-
-

-RevPiModIO._get_monitoring

-_get_monitoring() -

-Getter function. -

-
Returns:
-
-True, wenn als Monitoring gestartet -
-
-

-RevPiModIO._get_procimg

-_get_procimg() -

-Getter function. -

-
Returns:
-
-Pfad des verwendeten Prozessabbilds -
-
-

-RevPiModIO._get_replace_io_file

-_get_replace_io_file() -

-Gibt Pfad zur verwendeten replace IO Datei aus. -

-
Returns:
-
-Pfad zur replace IO Datei -
-
-

-RevPiModIO._get_simulator

-_get_simulator() -

-Getter function. -

-
Returns:
-
-True, wenn als Simulator gestartet -
-
-

-RevPiModIO._gotioerror

-_gotioerror(action, e=None) -

-IOError Verwaltung fuer Prozessabbildzugriff. -

-
action
-
-Zusatzinformationen zum loggen -
e
-
-Exception to log if debug is enabled -
-
-

-RevPiModIO._set_cycletime

-_set_cycletime(milliseconds) -

-Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung. -

-
milliseconds
-
- in Millisekunden -
-
-

-RevPiModIO._set_maxioerrors

-_set_maxioerrors(value) -

-Setzt Anzahl der maximal erlaubten Fehler bei Prozessabbildzugriff. -

-
value
-
-Anzahl erlaubte Fehler -
-
-

-RevPiModIO._simulate_ioctl

-_simulate_ioctl(request, arg=b'') -

-Simuliert IOCTL Funktionen auf procimg Datei. -

-
request
-
-IO Request -
arg:
-
-Request argument -
-
-

-RevPiModIO.autorefresh_all

-autorefresh_all() -

-Setzt alle Devices in autorefresh Funktion. -

-

-RevPiModIO.cleanup

-cleanup() -

-Beendet autorefresh und alle Threads. -

-

-RevPiModIO.cycleloop

-cycleloop(func, cycletime=50) -

-Startet den Cycleloop. -

- Der aktuelle Programmthread wird hier bis Aufruf von - .exit() "gefangen". Er fuehrt nach jeder Aktualisierung - des Prozessabbilds die uebergebene Funktion "func" aus und arbeitet sie - ab. Waehrend der Ausfuehrung der Funktion wird das Prozessabbild nicht - weiter aktualisiert. Die Inputs behalten bis zum Ende den aktuellen - Wert. Gesetzte Outputs werden nach Ende des Funktionsdurchlaufs in das - Prozessabbild geschrieben. -

- Verlassen wird der Cycleloop, wenn die aufgerufene Funktion einen - Rueckgabewert nicht gleich None liefert (z.B. return True), oder durch - Aufruf von .exit(). -

- HINWEIS: Die Aktualisierungszeit und die Laufzeit der Funktion duerfen - die eingestellte autorefresh Zeit, bzw. uebergebene cycletime nicht - ueberschreiten! -

- Ueber den Parameter cycletime wird die gewuenschte Zukluszeit der - uebergebenen Funktion gesetzt. Der Standardwert betraegt - 50 Millisekunden, in denen das Prozessabild eingelesen, die uebergebene - Funktion ausgefuert und das Prozessabbild geschrieben wird. -

-
func
-
-Funktion, die ausgefuehrt werden soll -
cycletime
-
-Zykluszeit in Millisekunden - Standardwert 50 ms -
-
-
Returns:
-
-None -
-
-

-RevPiModIO.exit

-exit(full=True) -

-Beendet mainloop() und optional autorefresh. -

- Wenn sich das Programm im mainloop() befindet, wird durch Aufruf - von exit() die Kontrolle wieder an das Hauptprogramm zurueckgegeben. -

- Der Parameter full ist mit True vorbelegt und entfernt alle Devices aus - dem autorefresh. Der Thread fuer die Prozessabbildsynchronisierung - wird dann gestoppt und das Programm kann sauber beendet werden. -

-
full
-
-Entfernt auch alle Devices aus autorefresh -
-
-

-RevPiModIO.export_replaced_ios

-export_replaced_ios(filename) -

-Exportiert ersetzte IOs dieser Instanz. -

- Exportiert alle ersetzten IOs, welche mit .replace_io(...) angelegt - wurden. Die Datei kann z.B. fuer RevPiPyLoad verwndet werden um Daten - in den neuen Formaten per MQTT zu uebertragen oder mit RevPiPyControl - anzusehen. -

-
filename
-
-Dateiname fuer Exportdatei -
-
-

-RevPiModIO.get_jconfigrsc

-get_jconfigrsc() -

-Laedt die piCtory Konfiguration und erstellt ein . -

-
Returns:
-
- der piCtory Konfiguration -
-
-

-RevPiModIO.handlesignalend

-handlesignalend(cleanupfunc=None) -

-Signalhandler fuer Programmende verwalten. -

- Wird diese Funktion aufgerufen, uebernimmt RevPiModIO die SignalHandler - fuer SIGINT und SIGTERM. Diese werden Empfangen, wenn das - Betriebssystem oder der Benutzer das Steuerungsprogramm sauber beenden - will. -

- Die optionale Funktion "cleanupfunc" wird als letztes nach dem letzten - Einlesen der Inputs ausgefuehrt. Dort gesetzte Outputs werden nach - Ablauf der Funktion ein letztes Mal geschrieben. - Gedacht ist dies fuer Aufraeumarbeiten, wie z.B. das abschalten der - LEDs am RevPi-Core. -

- Nach einmaligem Empfangen eines der Signale und dem Beenden der - RevPiModIO Thrads / Funktionen werden die SignalHandler wieder - freigegeben. -

-
cleanupfunc
-
-Funktion wird nach dem letzten Lesen der Inputs - ausgefuehrt, gefolgt vom letzten Schreiben der Outputs -
-
-

-RevPiModIO.mainloop

-mainloop(blocking=True, no_warn=False) -

-Startet den Mainloop mit Eventueberwachung. -

- Der aktuelle Programmthread wird hier bis Aufruf von - RevPiDevicelist.exit() "gefangen" (es sei denn blocking=False). Er - durchlaeuft die Eventueberwachung und prueft Aenderungen der, mit - einem Event registrierten, IOs. Wird eine Veraenderung erkannt, - fuert das Programm die dazugehoerigen Funktionen der Reihe nach aus. -

- Wenn der Parameter "blocking" mit False angegeben wird, aktiviert - dies die Eventueberwachung und blockiert das Programm NICHT an der - Stelle des Aufrufs. Eignet sich gut fuer die GUI Programmierung, wenn - Events vom RevPi benoetigt werden, aber das Programm weiter ausgefuehrt - werden soll. -

-
blocking
-
-Wenn False, blockiert das Programm NICHT -
no_warn
-
-Keine Warnungen bei langsamen Funktionen ausgeben -
-
-
Returns:
-
-None -
-
-

-RevPiModIO.readprocimg

-readprocimg(device=None) -

-Einlesen aller Inputs aller/eines Devices vom Prozessabbild. -

- Devices mit aktiverem autorefresh werden ausgenommen! -

-
device
-
-nur auf einzelnes Device anwenden -
-
-
Returns:
-
-True, wenn Arbeiten an allen Devices erfolgreich waren -
-
-

-RevPiModIO.resetioerrors

-resetioerrors() -

-Setzt aktuellen IOError-Zaehler auf 0 zurueck. -

-

-RevPiModIO.setdefaultvalues

-setdefaultvalues(device=None) -

-Alle Outputbuffer werden auf die piCtory default Werte gesetzt. -

-
device
-
-nur auf einzelnes Device anwenden -
-
-

-RevPiModIO.syncoutputs

-syncoutputs(device=None) -

-Lesen aller aktuell gesetzten Outputs im Prozessabbild. -

- Devices mit aktiverem autorefresh werden ausgenommen! -

-
device
-
-nur auf einzelnes Device anwenden -
-
-
Returns:
-
-True, wenn Arbeiten an allen Devices erfolgreich waren -
-
-

-RevPiModIO.writeprocimg

-writeprocimg(device=None) -

-Schreiben aller Outputs aller Devices ins Prozessabbild. -

- Devices mit aktiverem autorefresh werden ausgenommen! -

-
device
-
-nur auf einzelnes Device anwenden -
-
-
Returns:
-
-True, wenn Arbeiten an allen Devices erfolgreich waren -
-
-
Up
-

- -

RevPiModIODriver

-

-Klasse um eigene Treiber fuer die virtuellen Devices zu erstellen. -

- Mit dieser Klasse werden nur angegebene Virtuelle Devices mit RevPiModIO - verwaltet. Bei Instantiierung werden automatisch die Inputs und Outputs - verdreht, um das Schreiben der Inputs zu ermoeglichen. Die Daten koennen - dann ueber logiCAD an den Devices abgerufen werden. -

- -

-

-Derived from

-RevPiModIOSelected -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
RevPiModIODriverInstantiiert die Grundfunktionen.
-

-Static Methods

- - -
None
- -

-RevPiModIODriver (Constructor)

-RevPiModIODriver(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=False, replace_io_file=None, direct_output=False) -

-Instantiiert die Grundfunktionen. -

- Parameter 'monitoring' und 'simulator' stehen hier nicht zur - Verfuegung, da diese automatisch gesetzt werden. -

-
virtdev
-
-Virtuelles Device oder mehrere als -
-
-
See Also:
-
-RevPiModIO.__init__(...) -
-
-
Up
-

- -

RevPiModIOSelected

-

-Klasse fuer die Verwaltung einzelner Devices aus piCtory. -

- Diese Klasse uebernimmt nur angegebene Devices der piCtory Konfiguration - und bilded sie inkl. IOs ab. Sie uebernimmt die exklusive Verwaltung des - Adressbereichs im Prozessabbild an dem sich die angegebenen Devices - befinden und stellt sicher, dass die Daten synchron sind. -

- -

-

-Derived from

-RevPiModIO -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
RevPiModIOSelectedInstantiiert nur fuer angegebene Devices die Grundfunktionen.
-

-Static Methods

- - -
None
- -

-RevPiModIOSelected (Constructor)

-RevPiModIOSelected(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) -

-Instantiiert nur fuer angegebene Devices die Grundfunktionen. -

- Der Parameter deviceselection kann eine einzelne - Device Position / einzelner Device Name sein oder eine Liste mit - mehreren Positionen / Namen -

-
deviceselection
-
-Positionsnummer oder Devicename -
-
-
See Also:
-
-RevPiModIO.__init__(...) -
-
-
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.netio.html b/doc/revpimodio2.netio.html deleted file mode 100644 index 48b8224..0000000 --- a/doc/revpimodio2.netio.html +++ /dev/null @@ -1,631 +0,0 @@ - - -revpimodio2.netio - - - -

-revpimodio2.netio

-

-RevPiModIO Hauptklasse fuer Netzwerkzugriff. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
_sysdeldirty
_sysexit
_sysflush
_syspictory
_syssync
-

-Classes

- - - - - - - - - - - - - - -
NetFHNetzwerk File Handler fuer das Prozessabbild.
RevPiNetIOKlasse fuer die Verwaltung der piCtory Konfiguration ueber das Netzwerk.
RevPiNetIODriverKlasse um eigene Treiber fuer die virtuellen Devices zu erstellen.
RevPiNetIOSelectedKlasse fuer die Verwaltung einzelner Devices aus piCtory.
-

-Functions

- - -
None
-

- -

NetFH

-

-Netzwerk File Handler fuer das Prozessabbild. -

- Dieses FileObject-like Object verwaltet das Lesen und Schriben des - Prozessabbilds ueber das Netzwerk. Ein entfernter Revolution Pi kann - so gesteuert werden. -

- -

-

-Derived from

-Thread -

-Class Attributes

- - -
__slots__
closed
name
timeout
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NetFHInit NetFH-class.
__check_aclPueft ob ACL auf RevPi den Vorgang erlaubt oder wirft exception.
__del__NetworkFileHandler beenden.
__set_systimeoutSystemfunktion fuer Timeoutberechnung.
_connectStellt die Verbindung zu einem RevPiSlave her.
_direct_sendFuer debugging direktes Senden von Daten.
clear_dirtybytesEntfernt die konfigurierten Dirtybytes vom RevPi Slave.
closeVerbindung trennen.
flushSchreibpuffer senden.
get_closedPruefen ob Verbindung geschlossen ist.
get_nameVerbindugnsnamen zurueckgeben.
get_timeoutGibt aktuellen Timeout zurueck.
ioctlIOCTL Befehle ueber das Netzwerk senden.
readDaten ueber das Netzwerk lesen.
readpictoryRuft die piCtory Konfiguration ab.
runHandler fuer Synchronisierung.
seekSpringt an angegebene Position.
set_dirtybytesKonfiguriert Dirtybytes fuer Prozessabbild bei Verbindungsfehler.
set_timeoutSetzt Timeoutwert fuer Verbindung.
tellGibt aktuelle Position zurueck.
writeDaten ueber das Netzwerk schreiben.
-

-Static Methods

- - -
None
- -

-NetFH (Constructor)

-NetFH(address, timeout=500) -

-Init NetFH-class. -

-
address
-
-IP Adresse, Port des RevPi als -
timeout
-
-Timeout in Millisekunden der Verbindung -
-
-

-NetFH.__check_acl

-__check_acl(bytecode) -

-Pueft ob ACL auf RevPi den Vorgang erlaubt oder wirft exception. -

-

-NetFH.__del__

-__del__() -

-NetworkFileHandler beenden. -

-

-NetFH.__set_systimeout

-__set_systimeout(value) -

-Systemfunktion fuer Timeoutberechnung. -

-
value
-
-Timeout in Millisekunden 100 - 60000 -
-
-

-NetFH._connect

-_connect() -

-Stellt die Verbindung zu einem RevPiSlave her. -

-

-NetFH._direct_send

-_direct_send(send_bytes, recv_count) -

-Fuer debugging direktes Senden von Daten. -

-
send_bytes
-
-Bytes, die gesendet werden sollen -
recv_count
-
-Anzahl der Empfangsbytes -
-
-
Returns:
-
-Empfangende Bytes -
-
-

-NetFH.clear_dirtybytes

-clear_dirtybytes(position=None) -

-Entfernt die konfigurierten Dirtybytes vom RevPi Slave. -

-
position
-
-Startposition der Dirtybytes -
-
-

-NetFH.close

-close() -

-Verbindung trennen. -

-

-NetFH.flush

-flush() -

-Schreibpuffer senden. -

-

-NetFH.get_closed

-get_closed() -

-Pruefen ob Verbindung geschlossen ist. -

-
Returns:
-
-True, wenn Verbindung geschlossen ist -
-
-

-NetFH.get_name

-get_name() -

-Verbindugnsnamen zurueckgeben. -

-
Returns:
-
- IP:PORT -
-
-

-NetFH.get_timeout

-get_timeout() -

-Gibt aktuellen Timeout zurueck. -

-
Returns:
-
- in Millisekunden -
-
-

-NetFH.ioctl

-ioctl(request, arg=b'') -

-IOCTL Befehle ueber das Netzwerk senden. -

-
request
-
-Request as -
arg
-
-Argument as -
-
-

-NetFH.read

-read(length) -

-Daten ueber das Netzwerk lesen. -

-
length
-
-Anzahl der Bytes -
-
-
Returns:
-
-Gelesene -
-
-

-NetFH.readpictory

-readpictory() -

-Ruft die piCtory Konfiguration ab. -

-
Returns:
-
- piCtory Datei -
-
-

-NetFH.run

-run() -

-Handler fuer Synchronisierung. -

-

-NetFH.seek

-seek(position) -

-Springt an angegebene Position. -

-
position
-
-An diese Position springen -
-
-

-NetFH.set_dirtybytes

-set_dirtybytes(position, dirtybytes) -

-Konfiguriert Dirtybytes fuer Prozessabbild bei Verbindungsfehler. -

-
positon
-
-Startposition zum Schreiben -
dirtybytes
-
- die geschrieben werden sollen -
-
-

-NetFH.set_timeout

-set_timeout(value) -

-Setzt Timeoutwert fuer Verbindung. -

-
value
-
-Timeout in Millisekunden -
-
-

-NetFH.tell

-tell() -

-Gibt aktuelle Position zurueck. -

-
Returns:
-
-int aktuelle Position -
-
-

-NetFH.write

-write(bytebuff) -

-Daten ueber das Netzwerk schreiben. -

-
bytebuff
-
-Bytes zum schreiben -
-
-
Returns:
-
- Anzahl geschriebener bytes -
-
-
Up
-

- -

RevPiNetIO

-

-Klasse fuer die Verwaltung der piCtory Konfiguration ueber das Netzwerk. -

- Diese Klasse uebernimmt die gesamte Konfiguration aus piCtory und bilded - die Devices und IOs ab. Sie uebernimmt die exklusive Verwaltung des - Prozessabbilds und stellt sicher, dass die Daten synchron sind. - Sollten nur einzelne Devices gesteuert werden, verwendet man - RevPiModIOSelected() und uebergibt bei Instantiierung eine Liste mit - Device Positionen oder Device Namen. -

- -

-

-Derived from

-_RevPiModIO -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - - - - - - - - - - - - - - - - -
RevPiNetIOInstantiiert die Grundfunktionen.
_create_myfhErstellt NetworkFileObject.
disconnectTrennt Verbindungen und beendet autorefresh inkl.
get_jconfigrscLaedt die piCotry Konfiguration und erstellt ein .
net_cleardefaultvaluesLoescht Defaultwerte vom PLC Slave.
net_setdefaultvaluesKonfiguriert den PLC Slave mit den piCtory Defaultwerten.
-

-Static Methods

- - -
None
- -

-RevPiNetIO (Constructor)

-RevPiNetIO(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) -

-Instantiiert die Grundfunktionen. -

-
address:
-
-IP-Adresse / (IP, Port) -
autorefresh
-
-Wenn True, alle Devices zu autorefresh hinzufuegen -
monitoring
-
-In- und Outputs werden gelesen, niemals geschrieben -
syncoutputs
-
-Aktuell gesetzte Outputs vom Prozessabbild einlesen -
simulator
-
-Laedt das Modul als Simulator und vertauscht IOs -
debug
-
-Gibt bei allen Fehlern komplette Meldungen aus -
replace_io_file
-
-Replace IO Konfiguration aus Datei laden -
direct_output
-
-Write outputs immediately to process image (slow) -
-
-

-RevPiNetIO._create_myfh

-_create_myfh() -

-Erstellt NetworkFileObject. - return FileObject -

-

-RevPiNetIO.disconnect

-disconnect() -

-Trennt Verbindungen und beendet autorefresh inkl. alle Threads. -

-

-RevPiNetIO.get_jconfigrsc

-get_jconfigrsc() -

-Laedt die piCotry Konfiguration und erstellt ein . -

-
Returns:
-
- der piCtory Konfiguration -
-
-

-RevPiNetIO.net_cleardefaultvalues

-net_cleardefaultvalues(device=None) -

-Loescht Defaultwerte vom PLC Slave. -

-
device
-
-nur auf einzelnes Device anwenden, sonst auf Alle -
-
-

-RevPiNetIO.net_setdefaultvalues

-net_setdefaultvalues(device=None) -

-Konfiguriert den PLC Slave mit den piCtory Defaultwerten. -

-
device
-
-nur auf einzelnes Device anwenden, sonst auf Alle -
-
-
Up
-

- -

RevPiNetIODriver

-

-Klasse um eigene Treiber fuer die virtuellen Devices zu erstellen. -

- Mit dieser Klasse werden nur angegebene Virtuelle Devices mit RevPiModIO - verwaltet. Bei Instantiierung werden automatisch die Inputs und Outputs - verdreht, um das Schreiben der Inputs zu ermoeglichen. Die Daten koennen - dann ueber logiCAD an den Devices abgerufen werden. -

- -

-

-Derived from

-RevPiNetIOSelected -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
RevPiNetIODriverInstantiiert die Grundfunktionen.
-

-Static Methods

- - -
None
- -

-RevPiNetIODriver (Constructor)

-RevPiNetIODriver(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=False, replace_io_file=None, direct_output=False) -

-Instantiiert die Grundfunktionen. -

- Parameter 'monitoring' und 'simulator' stehen hier nicht zur - Verfuegung, da diese automatisch gesetzt werden. -

-
address:
-
-IP-Adresse / (IP, Port) -
virtdev
-
-Virtuelles Device oder mehrere als -
-
-
See Also:
-
-RevPiModIO.__init__(...) -
-
-
Up
-

- -

RevPiNetIOSelected

-

-Klasse fuer die Verwaltung einzelner Devices aus piCtory. -

- Diese Klasse uebernimmt nur angegebene Devices der piCtory Konfiguration - und bilded sie inkl. IOs ab. Sie uebernimmt die exklusive Verwaltung des - Adressbereichs im Prozessabbild an dem sich die angegebenen Devices - befinden und stellt sicher, dass die Daten synchron sind. -

- -

-

-Derived from

-RevPiNetIO -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
RevPiNetIOSelectedInstantiiert nur fuer angegebene Devices die Grundfunktionen.
-

-Static Methods

- - -
None
- -

-RevPiNetIOSelected (Constructor)

-RevPiNetIOSelected(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) -

-Instantiiert nur fuer angegebene Devices die Grundfunktionen. -

- Der Parameter deviceselection kann eine einzelne - Device Position / einzelner Device Name sein oder eine Liste mit - mehreren Positionen / Namen -

-
address:
-
-IP-Adresse / (IP, Port) -
deviceselection
-
-Positionsnummer oder Devicename -
-
-
See Also:
-
-RevPiNetIO.__init__(...) -
-
-
Up
-
- \ No newline at end of file diff --git a/doc/revpimodio2.summary.html b/doc/revpimodio2.summary.html deleted file mode 100644 index dd61e6e..0000000 --- a/doc/revpimodio2.summary.html +++ /dev/null @@ -1,76 +0,0 @@ - - -revpimodio2.summary - - - -

-revpimodio2.summary

-

-Bildet die Summary-Sektion von piCtory ab. -

-

-Global Attributes

- - -
__author__
__copyright__
__license__
-

-Classes

- - - - - -
SummaryBildet die Summary-Sektion der config.rsc ab.
-

-Functions

- - -
None
-

- -

Summary

-

-Bildet die Summary-Sektion der config.rsc ab. -

-

-Derived from

-object -

-Class Attributes

- - -
__slots__
-

-Class Methods

- - -
None
-

-Methods

- - - - - -
SummaryInstantiiert die RevPiSummary-Klasse.
-

-Static Methods

- - -
None
- -

-Summary (Constructor)

-Summary(summary) -

-Instantiiert die RevPiSummary-Klasse. -

-
summary
-
-piCtory Summaryinformationen -
-
-
Up
-
- \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..c35888f --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = RevPiModIO2 +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..2c735de --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# RevPiModIO2 documentation build configuration file, created by +# sphinx-quickstart on Sun Oct 20 12:38:53 2019. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../')) + +from revpimodio2 import __version__ + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.todo', + 'sphinx.ext.viewcode' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'RevPiModIO2' +copyright = '2019, Sven Sager (NaruX)' +author = 'Sven Sager (NaruX)' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = __version__ +# The full version, including alpha/beta/rc tags. +# release = '' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'RevPiModIO2doc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'RevPiModIO2.tex', 'RevPiModIO2 Documentation', + 'Sven Sager (NaruX)', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'revpimodio2', 'RevPiModIO2 Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'RevPiModIO2', 'RevPiModIO2 Documentation', + author, 'RevPiModIO2', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..7762839 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,20 @@ +.. RevPiModIO2 documentation master file, created by + sphinx-quickstart on Sun Oct 20 12:38:53 2019. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to RevPiModIO2's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 0000000..c622db6 --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,7 @@ +revpimodio2 +=========== + +.. toctree:: + :maxdepth: 4 + + revpimodio2 diff --git a/docs/revpimodio2.rst b/docs/revpimodio2.rst new file mode 100644 index 0000000..6668bf0 --- /dev/null +++ b/docs/revpimodio2.rst @@ -0,0 +1,70 @@ +revpimodio2 package +=================== + +Submodules +---------- + +revpimodio2\.app module +----------------------- + +.. automodule:: revpimodio2.app + :members: + :undoc-members: + :show-inheritance: + +revpimodio2\.device module +-------------------------- + +.. automodule:: revpimodio2.device + :members: + :undoc-members: + :show-inheritance: + +revpimodio2\.helper module +-------------------------- + +.. automodule:: revpimodio2.helper + :members: + :undoc-members: + :show-inheritance: + +revpimodio2\.io module +---------------------- + +.. automodule:: revpimodio2.io + :members: + :undoc-members: + :show-inheritance: + +revpimodio2\.modio module +------------------------- + +.. automodule:: revpimodio2.modio + :members: + :undoc-members: + :show-inheritance: + +revpimodio2\.netio module +------------------------- + +.. automodule:: revpimodio2.netio + :members: + :undoc-members: + :show-inheritance: + +revpimodio2\.summary module +--------------------------- + +.. automodule:: revpimodio2.summary + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: revpimodio2 + :members: + :undoc-members: + :show-inheritance: diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api deleted file mode 100644 index 6572765..0000000 --- a/eric-revpimodio2.api +++ /dev/null @@ -1,221 +0,0 @@ -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.acheck?4(check_type, **kwargs) -revpimodio2.app.App?1(app) -revpimodio2.consttostr?4(value) -revpimodio2.device.Connect.A3?7 -revpimodio2.device.Connect._devconfigure?5() -revpimodio2.device.Connect._get_leda3?5() -revpimodio2.device.Connect._get_wdtoggle?5() -revpimodio2.device.Connect._set_leda3?5(value) -revpimodio2.device.Connect._set_wdtoggle?5(value) -revpimodio2.device.Connect.wdautotoggle?7 -revpimodio2.device.Core.A1?7 -revpimodio2.device.Core.A2?7 -revpimodio2.device.Core._devconfigure?5() -revpimodio2.device.Core._get_leda1?5() -revpimodio2.device.Core._get_leda2?5() -revpimodio2.device.Core._get_status?5() -revpimodio2.device.Core._set_calculatedled?5(addresslist, shifted_value) -revpimodio2.device.Core._set_leda1?5(value) -revpimodio2.device.Core._set_leda2?5(value) -revpimodio2.device.Core.errorlimit1?4(value) -revpimodio2.device.Core.errorlimit2?4(value) -revpimodio2.device.Core.frequency?4() -revpimodio2.device.Core.iocycle?4() -revpimodio2.device.Core.ioerrorcount?4() -revpimodio2.device.Core.leftgate?4() -revpimodio2.device.Core.missingdeviceorgate?4() -revpimodio2.device.Core.overunderflow?4() -revpimodio2.device.Core.picontrolrunning?4() -revpimodio2.device.Core.rightgate?4() -revpimodio2.device.Core.status?7 -revpimodio2.device.Core.temperature?4() -revpimodio2.device.Core.unconfdevice?4() -revpimodio2.device.Device._buildio?5(dict_io, iotype) -revpimodio2.device.Device._devconfigure?5() -revpimodio2.device.Device._get_offset?5() -revpimodio2.device.Device._get_producttype?5() -revpimodio2.device.Device._update_my_io_list?5() -revpimodio2.device.Device.autorefresh?4(activate=True) -revpimodio2.device.Device.get_allios?4(export=None) -revpimodio2.device.Device.get_inputs?4(export=None) -revpimodio2.device.Device.get_memories?4(export=None) -revpimodio2.device.Device.get_outputs?4(export=None) -revpimodio2.device.Device.length?7 -revpimodio2.device.Device.name?7 -revpimodio2.device.Device.offset?7 -revpimodio2.device.Device.position?7 -revpimodio2.device.Device.producttype?7 -revpimodio2.device.Device.readprocimg?4() -revpimodio2.device.Device.setdefaultvalues?4() -revpimodio2.device.Device.syncoutputs?4() -revpimodio2.device.Device.writeprocimg?4() -revpimodio2.device.Device?1(parentmodio, dict_device, simulator=False) -revpimodio2.device.DeviceList?1() -revpimodio2.device.DioModule?1(parentmodio, dict_device, simulator=False) -revpimodio2.device.Gateway.get_rawbytes?4() -revpimodio2.device.Gateway?1(parent, dict_device, simulator=False) -revpimodio2.device.Virtual.writeinputdefaults?4() -revpimodio2.helper.Cycletools._docycle?5() -revpimodio2.helper.Cycletools.get_tof?4(name) -revpimodio2.helper.Cycletools.get_tofc?4(name) -revpimodio2.helper.Cycletools.get_ton?4(name) -revpimodio2.helper.Cycletools.get_tonc?4(name) -revpimodio2.helper.Cycletools.get_tp?4(name) -revpimodio2.helper.Cycletools.get_tpc?4(name) -revpimodio2.helper.Cycletools.set_tof?4(name, milliseconds) -revpimodio2.helper.Cycletools.set_tofc?4(name, cycles) -revpimodio2.helper.Cycletools.set_ton?4(name, milliseconds) -revpimodio2.helper.Cycletools.set_tonc?4(name, cycles) -revpimodio2.helper.Cycletools.set_tp?4(name, milliseconds) -revpimodio2.helper.Cycletools.set_tpc?4(name, cycles) -revpimodio2.helper.Cycletools?1(cycletime) -revpimodio2.helper.EventCallback.run?4() -revpimodio2.helper.EventCallback.stop?4() -revpimodio2.helper.EventCallback?1(func, name, value) -revpimodio2.helper.ProcimgWriter._collect_events?5(value) -revpimodio2.helper.ProcimgWriter._get_ioerrors?5() -revpimodio2.helper.ProcimgWriter._gotioerror?5(e=None) -revpimodio2.helper.ProcimgWriter.get_maxioerrors?4() -revpimodio2.helper.ProcimgWriter.get_refresh?4() -revpimodio2.helper.ProcimgWriter.ioerrors?7 -revpimodio2.helper.ProcimgWriter.maxioerrors?7 -revpimodio2.helper.ProcimgWriter.refresh?7 -revpimodio2.helper.ProcimgWriter.run?4() -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() -revpimodio2.io.IOBase._get_byteorder?5() -revpimodio2.io.IOBase._get_iotype?5() -revpimodio2.io.IOBase.address?7 -revpimodio2.io.IOBase.byteorder?7 -revpimodio2.io.IOBase.defaultvalue?7 -revpimodio2.io.IOBase.get_defaultvalue?4() -revpimodio2.io.IOBase.get_value?4() -revpimodio2.io.IOBase.length?7 -revpimodio2.io.IOBase.name?7 -revpimodio2.io.IOBase.reg_event?4(func, delay=0, edge=BOTH, as_thread=False, prefire=False) -revpimodio2.io.IOBase.reg_timerevent?4(func, delay, edge=BOTH, as_thread=False) -revpimodio2.io.IOBase.set_value?4(value) -revpimodio2.io.IOBase.type?7 -revpimodio2.io.IOBase.unreg_event?4(func=None, edge=None) -revpimodio2.io.IOBase.value?7 -revpimodio2.io.IOBase.wait?4(edge=BOTH, exitevent=None, okvalue=None, timeout=0) -revpimodio2.io.IOBase?1(parentdevice, valuelist, iotype, byteorder, signed) -revpimodio2.io.IOEvent?1(func, edge, as_thread, delay, overwrite, prefire) -revpimodio2.io.IOList._private_register_new_io_object?5(new_io) -revpimodio2.io.IOList?1() -revpimodio2.io.IntIO._get_signed?5() -revpimodio2.io.IntIO._set_byteorder?5(value) -revpimodio2.io.IntIO._set_signed?5(value) -revpimodio2.io.IntIO.byteorder?7 -revpimodio2.io.IntIO.defaultvalue?7 -revpimodio2.io.IntIO.get_intdefaultvalue?4() -revpimodio2.io.IntIO.get_intvalue?4() -revpimodio2.io.IntIO.set_intvalue?4(value) -revpimodio2.io.IntIO.signed?7 -revpimodio2.io.IntIO.value?7 -revpimodio2.io.IntIOCounter.reset?4() -revpimodio2.io.IntIOCounter?1(counter_id, parentdevice, valuelist, iotype, byteorder, signed) -revpimodio2.io.IntIOReplaceable.replace_io?4(name, frm, **kwargs) -revpimodio2.io.StructIO._get_frm?5() -revpimodio2.io.StructIO._get_signed?5() -revpimodio2.io.StructIO.defaultvalue?7 -revpimodio2.io.StructIO.frm?7 -revpimodio2.io.StructIO.get_structdefaultvalue?4() -revpimodio2.io.StructIO.get_structvalue?4() -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.modio.RevPiModIO._configure?5(jconfigrsc) -revpimodio2.modio.RevPiModIO._configure_replace_io?5() -revpimodio2.modio.RevPiModIO._create_myfh?5() -revpimodio2.modio.RevPiModIO._get_configrsc?5() -revpimodio2.modio.RevPiModIO._get_cycletime?5() -revpimodio2.modio.RevPiModIO._get_debug?5() -revpimodio2.modio.RevPiModIO._get_ioerrors?5() -revpimodio2.modio.RevPiModIO._get_length?5() -revpimodio2.modio.RevPiModIO._get_maxioerrors?5() -revpimodio2.modio.RevPiModIO._get_monitoring?5() -revpimodio2.modio.RevPiModIO._get_procimg?5() -revpimodio2.modio.RevPiModIO._get_replace_io_file?5() -revpimodio2.modio.RevPiModIO._get_simulator?5() -revpimodio2.modio.RevPiModIO._gotioerror?5(action, e=None) -revpimodio2.modio.RevPiModIO._set_cycletime?5(milliseconds) -revpimodio2.modio.RevPiModIO._set_maxioerrors?5(value) -revpimodio2.modio.RevPiModIO._simulate_ioctl?5(request, arg=b'') -revpimodio2.modio.RevPiModIO.autorefresh_all?4() -revpimodio2.modio.RevPiModIO.cleanup?4() -revpimodio2.modio.RevPiModIO.configrsc?7 -revpimodio2.modio.RevPiModIO.cycleloop?4(func, cycletime=50) -revpimodio2.modio.RevPiModIO.cycletime?7 -revpimodio2.modio.RevPiModIO.debug?7 -revpimodio2.modio.RevPiModIO.exit?4(full=True) -revpimodio2.modio.RevPiModIO.export_replaced_ios?4(filename) -revpimodio2.modio.RevPiModIO.get_jconfigrsc?4() -revpimodio2.modio.RevPiModIO.handlesignalend?4(cleanupfunc=None) -revpimodio2.modio.RevPiModIO.ioerrors?7 -revpimodio2.modio.RevPiModIO.length?7 -revpimodio2.modio.RevPiModIO.mainloop?4(blocking=True, no_warn=False) -revpimodio2.modio.RevPiModIO.maxioerrors?7 -revpimodio2.modio.RevPiModIO.monitoring?7 -revpimodio2.modio.RevPiModIO.procimg?7 -revpimodio2.modio.RevPiModIO.readprocimg?4(device=None) -revpimodio2.modio.RevPiModIO.replace_io_file?7 -revpimodio2.modio.RevPiModIO.resetioerrors?4() -revpimodio2.modio.RevPiModIO.setdefaultvalues?4(device=None) -revpimodio2.modio.RevPiModIO.simulator?7 -revpimodio2.modio.RevPiModIO.syncoutputs?4(device=None) -revpimodio2.modio.RevPiModIO.writeprocimg?4(device=None) -revpimodio2.modio.RevPiModIO?1(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.modio.RevPiModIODriver?1(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.modio.RevPiModIOSelected?1(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.netio.NetFH._connect?5() -revpimodio2.netio.NetFH._direct_send?5(send_bytes, recv_count) -revpimodio2.netio.NetFH.clear_dirtybytes?4(position=None) -revpimodio2.netio.NetFH.close?4() -revpimodio2.netio.NetFH.closed?7 -revpimodio2.netio.NetFH.flush?4() -revpimodio2.netio.NetFH.get_closed?4() -revpimodio2.netio.NetFH.get_name?4() -revpimodio2.netio.NetFH.get_timeout?4() -revpimodio2.netio.NetFH.ioctl?4(request, arg=b'') -revpimodio2.netio.NetFH.name?7 -revpimodio2.netio.NetFH.read?4(length) -revpimodio2.netio.NetFH.readpictory?4() -revpimodio2.netio.NetFH.run?4() -revpimodio2.netio.NetFH.seek?4(position) -revpimodio2.netio.NetFH.set_dirtybytes?4(position, dirtybytes) -revpimodio2.netio.NetFH.set_timeout?4(value) -revpimodio2.netio.NetFH.tell?4() -revpimodio2.netio.NetFH.timeout?7 -revpimodio2.netio.NetFH.write?4(bytebuff) -revpimodio2.netio.NetFH?1(address, timeout=500) -revpimodio2.netio.RevPiNetIO._create_myfh?5() -revpimodio2.netio.RevPiNetIO.disconnect?4() -revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4() -revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None) -revpimodio2.netio.RevPiNetIO.net_setdefaultvalues?4(device=None) -revpimodio2.netio.RevPiNetIO?1(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.netio.RevPiNetIODriver?1(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.netio.RevPiNetIOSelected?1(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.netio._sysdeldirty?8 -revpimodio2.netio._sysexit?8 -revpimodio2.netio._sysflush?8 -revpimodio2.netio._syspictory?8 -revpimodio2.netio._syssync?8 -revpimodio2.summary.Summary?1(summary) diff --git a/eric-revpimodio2.bas b/eric-revpimodio2.bas deleted file mode 100644 index 3eda7c3..0000000 --- a/eric-revpimodio2.bas +++ /dev/null @@ -1,19 +0,0 @@ -Base Device -Connect Core -Core Base -DeviceNotFoundError Exception -DioModule Device -EventCallback Thread -Gateway Device -IntIO IOBase -IntIOCounter IntIO -IntIOReplaceable IntIO -NetFH Thread -ProcimgWriter Thread -RevPiModIODriver RevPiModIOSelected -RevPiModIOSelected RevPiModIO -RevPiNetIO _RevPiModIO -RevPiNetIODriver RevPiNetIOSelected -RevPiNetIOSelected RevPiNetIO -StructIO IOBase -Virtual Gateway diff --git a/revpimodio2.e4p b/revpimodio2.e4p deleted file mode 100644 index 816e923..0000000 --- a/revpimodio2.e4p +++ /dev/null @@ -1,428 +0,0 @@ - - - - - - - en_US - 7ea159534ad3516e9069331120048abf9b00151e - 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.3.3 - Sven Sager - akira@narux.de - - - revpimodio2/__init__.py - revpimodio2/app.py - revpimodio2/device.py - revpimodio2/devicecon.py - revpimodio2/helper.py - revpimodio2/io.py - revpimodio2/modio.py - revpimodio2/netio.py - revpimodio2/summary.py - setup.py - test/test_dio_cycleloop.py - test/test_dio_mainloop.py - test/test_dio_while2.py - test/test_net_leistung.py - test/test_netio_brett.py - test/test_unit.py - test/test_unit_fh.py - test/test_unitnet.py - test/web_benniesrun.py - test/web_benniesrunxxl.py - test/web_cycleloop.py - test/web_mainloop.py - test/web_rpidaten.py - test/web_rpii2c.py - test/web_startseite.py - test/web_virtdevdriver.py - - - - - - - .hgignore - LICENSE.txt - MANIFEST.in - README.md - doc - eric-revpimodio2.api - - test/test_unit.py - - Mercurial - - - - add - - - - - - - - checkout - - - - - - - - commit - - - - - - - - diff - - - - - - - - export - - - - - - - - global - - - - - - - - history - - - - - - - - log - - - - - - - - remove - - - - - - - - status - - - - - - - - tag - - - - - - - - update - - - - - - - - - - - - - - - - - - - - - ERIC4API - - - - - ignoreDirectories - - - - deb - dist - doc - test - - - - ignoreFilePatterns - - - - setup.py - devicecon.py - - - - languages - - - - Python3 - - - - outputFile - - - eric-revpimodio2.api - - - useRecursion - - - True - - - - - ERIC4DOC - - - - - ignoreDirectories - - - - deb - dist - doc - test - - - - ignoreFilePatterns - - - - setup.py - devicecon.py - - - - outputDirectory - - - doc - - - qtHelpEnabled - - - False - - - useRecursion - - - True - - - - - - - - - - - Pep8Checker - - - - - BuiltinsChecker - - - - - chr - - - - unichr - - - - str - - - - unicode - - - - - - CopyrightAuthor - - - - - - CopyrightMinFileSize - - - 0 - - - DocstringType - - - pep257 - - - ExcludeFiles - - - */test/* - - - ExcludeMessages - - - E123,E226,E24,C101,E402,C111 - - - FixCodes - - - - - - FixIssues - - - False - - - FutureChecker - - - - - - HangClosing - - - False - - - IncludeMessages - - - - - - LineComplexity - - - 15 - - - LineComplexityScore - - - 10 - - - MaxCodeComplexity - - - 10 - - - MaxLineLength - - - 79 - - - NoFixCodes - - - E501 - - - RepeatMessages - - - True - - - ShowIgnored - - - False - - - ValidEncodings - - - latin-1, utf-8 - - - - - - - - - - - CodeMetrics - - - - - ExcludeFiles - - - */test/*,*/setup.py,*/test_unit.py - - - - - - - diff --git a/revpimodio2/__init__.py b/revpimodio2/__init__.py index 3b8c1e2..4ea6607 100644 --- a/revpimodio2/__init__.py +++ b/revpimodio2/__init__.py @@ -12,17 +12,16 @@ Auf alle IOs kann der Benutzer Funktionen als Events registrieren. Diese fuehrt das Modul bei Datenaenderung aus. """ -import warnings - __all__ = [ "RevPiModIO", "RevPiModIOSelected", "RevPiModIODriver", - "RevPiNetIO", "RevPiNetIOSelected", "RevPiNetIODriver" + "RevPiNetIO", "RevPiNetIOSelected", "RevPiNetIODriver", + "Cycletools", ] __author__ = "Sven Sager " __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "LGPLv3" __name__ = "revpimodio2" -__version__ = "2.3.3" +__version__ = "2.4.2" # Global package values OFF = 0 @@ -35,8 +34,6 @@ INP = 300 OUT = 301 MEM = 302 -warnings.simplefilter(action="always") - class DeviceNotFoundError(Exception): @@ -99,5 +96,6 @@ def consttostr(value): # Benötigte Klassen importieren +from .helper import Cycletools from .modio import RevPiModIO, RevPiModIOSelected, RevPiModIODriver from .netio import RevPiNetIO, RevPiNetIOSelected, RevPiNetIODriver diff --git a/revpimodio2/device.py b/revpimodio2/device.py index a668c62..291e9d8 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -348,12 +348,10 @@ class Device(object): if not self._modio._imgwriter.is_alive(): # Alte Einstellungen speichern - imgmaxioerrors = self._modio._imgwriter.maxioerrors imgrefresh = self._modio._imgwriter.refresh # ImgWriter mit alten Einstellungen erstellen self._modio._imgwriter = ProcimgWriter(self._modio) - self._modio._imgwriter.maxioerrors = imgmaxioerrors self._modio._imgwriter.refresh = imgrefresh self._modio._imgwriter.start() @@ -494,6 +492,16 @@ class Core(Base): "_slc_temperature", "_slc_errorlimit1", "_slc_errorlimit2", \ "_slc_frequency", "_slc_led", "a1green", "a1red", "a2green", "a2red" + def __setattr__(self, key, value): + """Verhindert Ueberschreibung der LEDs.""" + if hasattr(self, key) and key in ( + "a1green", "a1red", "a2green", "a2red"): + raise AttributeError( + "direct assignment is not supported - use .value Attribute" + ) + else: + object.__setattr__(self, key, value) + def _devconfigure(self): """Core-Klasse vorbereiten.""" @@ -767,6 +775,17 @@ class Connect(Core): __slots__ = "__evt_wdtoggle", "__th_wdtoggle", "a3green", "a3red", "wd", \ "x2in", "x2out" + def __setattr__(self, key, value): + """Verhindert Ueberschreibung der LEDs.""" + if hasattr(self, key) and key in ( + "a1green", "a1red", "a2green", "a2red", "a3green", "a3red", + "wd", "x2in", "x2out"): + raise AttributeError( + "direct assignment is not supported - use .value Attribute" + ) + else: + object.__setattr__(self, key, value) + def __wdtoggle(self): """WD Ausgang alle 10 Sekunden automatisch toggeln.""" while not self.__evt_wdtoggle.wait(10): diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index 0197694..8c88e4b 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -289,8 +289,8 @@ class ProcimgWriter(Thread): """ - __slots__ = "__dict_delay", "__eventth", "__eventqth", "__eventwork", \ - "_adjwait", "_eventq", "_ioerror", "_maxioerrors", "_modio", \ + __slots__ = "__dict_delay", "__eventth", "_eventqth", "__eventwork", \ + "_adjwait", "_eventq", "_modio", \ "_refresh", "_work", "daemon", "lck_refresh", "newdata" def __init__(self, parentmodio): @@ -299,12 +299,10 @@ class ProcimgWriter(Thread): super().__init__() self.__dict_delay = {} self.__eventth = Thread(target=self.__exec_th) - self.__eventqth = queue.Queue() + self._eventqth = queue.Queue() self.__eventwork = False self._adjwait = 0 self._eventq = queue.Queue() - self._ioerror = 0 - self._maxioerrors = 0 self._modio = parentmodio self._refresh = 0.05 self._work = Event() @@ -340,7 +338,7 @@ class ProcimgWriter(Thread): or regfunc.edge == FALLING and not boolor: if regfunc.delay == 0: if regfunc.as_thread: - self.__eventqth.put( + self._eventqth.put( (regfunc, io_event._name, io_event.value), False ) @@ -351,19 +349,20 @@ class ProcimgWriter(Thread): ) else: # Verzögertes Event in dict einfügen - tupfire = ( - regfunc, io_event._name, io_event.value + tup_fire = ( + regfunc, io_event._name, io_event.value, + io_event, ) if regfunc.overwrite \ - or tupfire not in self.__dict_delay: - self.__dict_delay[tupfire] = ceil( + or tup_fire not in self.__dict_delay: + self.__dict_delay[tup_fire] = ceil( regfunc.delay / 1000 / self._refresh ) else: for regfunc in dev._dict_events[io_event]: if regfunc.delay == 0: if regfunc.as_thread: - self.__eventqth.put( + self._eventqth.put( (regfunc, io_event._name, io_event.value), False ) @@ -374,12 +373,13 @@ class ProcimgWriter(Thread): ) else: # Verzögertes Event in dict einfügen - tupfire = ( - regfunc, io_event._name, io_event.value + tup_fire = ( + regfunc, io_event._name, io_event.value, + io_event, ) if regfunc.overwrite \ - or tupfire not in self.__dict_delay: - self.__dict_delay[tupfire] = ceil( + or tup_fire not in self.__dict_delay: + self.__dict_delay[tup_fire] = ceil( regfunc.delay / 1000 / self._refresh ) @@ -390,7 +390,7 @@ class ProcimgWriter(Thread): """Laeuft als Thread, der Events als Thread startet.""" while self.__eventwork: try: - tup_fireth = self.__eventqth.get(timeout=1) + tup_fireth = self._eventqth.get(timeout=1) th = EventCallback( tup_fireth[0].func, tup_fireth[1], tup_fireth[2] ) @@ -415,7 +415,7 @@ class ProcimgWriter(Thread): self.__eventwork = value if not value: # Nur leeren beim deaktivieren - self.__eventqth = queue.Queue() + self._eventqth = queue.Queue() self._eventq = queue.Queue() self.__dict_delay = {} @@ -427,34 +427,6 @@ class ProcimgWriter(Thread): return True - def _get_ioerrors(self): - """Ruft aktuelle Anzahl der Fehler ab. - @return Aktuelle Fehleranzahl""" - return self._ioerror - - def _gotioerror(self, e=None): - """IOError Verwaltung fuer autorefresh. - @param e Exception to log if debug is enabled - """ - self._ioerror += 1 - if self._maxioerrors != 0 and self._ioerror >= self._maxioerrors: - raise RuntimeError( - "reach max io error count {0} on process image".format( - self._maxioerrors - ) - ) - warnings.warn( - "count {0} io errors on process image".format(self._ioerror), - RuntimeWarning - ) - if self._modio._debug and e is not None: - warnings.warn(str(e), RuntimeWarning) - - def get_maxioerrors(self): - """Gibt die Anzahl der maximal erlaubten Fehler zurueck. - @return Anzahl erlaubte Fehler""" - return self._maxioerrors - def get_refresh(self): """Gibt Zykluszeit zurueck. @return Zykluszeit in Millisekunden""" @@ -465,18 +437,19 @@ class ProcimgWriter(Thread): fh = self._modio._create_myfh() self._adjwait = self._refresh + mrk_warn = True + while not self._work.is_set(): ot = default_timer() # Lockobjekt holen und Fehler werfen, wenn nicht schnell genug if not self.lck_refresh.acquire(timeout=self._adjwait): warnings.warn( - "cycle time of {0} ms exceeded on lock".format( - int(self._refresh * 1000) - ), + "cycle time of {0} ms exceeded during executing function" + "".format(int(self._refresh * 1000)), RuntimeWarning ) - # Verzögerte Events pausieren an dieser Stelle + # Nur durch cycleloop erreichbar - keine verzögerten Events continue try: @@ -511,11 +484,27 @@ class ProcimgWriter(Thread): fh.flush() except IOError as e: - self._gotioerror(e) + self._modio._gotioerror("autorefresh", e, mrk_warn) + mrk_warn = self._modio._debug == -1 self.lck_refresh.release() continue else: + if not mrk_warn: + if self._modio._debug == 0: + warnings.warn( + "recover from io errors on process image", + RuntimeWarning + ) + else: + warnings.warn( + "recover from io errors on process image - total " + "count of {0} errors now" + "".format(self._modio._ioerror), + RuntimeWarning + ) + mrk_warn = True + # Alle aufwecken self.lck_refresh.release() self.newdata.set() @@ -525,15 +514,14 @@ class ProcimgWriter(Thread): if self.__eventwork: for tup_fire in tuple(self.__dict_delay.keys()): if tup_fire[0].overwrite and \ - getattr(self._modio.io, tup_fire[1]).value != \ - tup_fire[2]: + tup_fire[3].value != tup_fire[2]: del self.__dict_delay[tup_fire] else: self.__dict_delay[tup_fire] -= 1 if self.__dict_delay[tup_fire] <= 0: # Verzögertes Event übernehmen und löschen if tup_fire[0].as_thread: - self.__eventqth.put(tup_fire, False) + self._eventqth.put(tup_fire, False) else: self._eventq.put(tup_fire, False) del self.__dict_delay[tup_fire] @@ -546,9 +534,8 @@ class ProcimgWriter(Thread): self._adjwait -= 0.001 if self._adjwait < 0: warnings.warn( - "cycle time of {0} ms exceeded".format( - int(self._refresh * 1000) - ), + "cycle time of {0} ms exceeded several times - can not" + " hold cycle time!".format(int(self._refresh * 1000)), RuntimeWarning ) self._adjwait = 0 @@ -564,17 +551,6 @@ class ProcimgWriter(Thread): """Beendet die automatische Prozessabbildsynchronisierung.""" self._work.set() - def set_maxioerrors(self, value): - """Setzt die Anzahl der maximal erlaubten Fehler. - @param value Anzahl erlaubte Fehler""" - if type(value) == int: - if value >= 0: - self._maxioerrors = value - else: - raise ValueError("value must be 0 or a positive integer") - else: - raise TypeError("value must be ") - def set_refresh(self, value): """Setzt die Zykluszeit in Millisekunden. @param value Millisekunden""" @@ -587,6 +563,4 @@ class ProcimgWriter(Thread): "refresh time must be 5 to 2000 milliseconds" ) - ioerrors = property(_get_ioerrors) - maxioerrors = property(get_maxioerrors, set_maxioerrors) refresh = property(get_refresh, set_refresh) diff --git a/revpimodio2/io.py b/revpimodio2/io.py index 46c11af..b5e766d 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -994,18 +994,12 @@ class IntIOReplaceable(IntIO): - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus + - prefire: Ausloesen mit aktuellem Wert, wenn mainloop startet @see Python3 struct """ - # 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 io_new = StructIO( self, diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index f808f6b..75e0c9c 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -37,11 +37,11 @@ class RevPiModIO(object): "_maxioerrors", "_myfh", "_myfh_lck", "_monitoring", "_procimg", \ "_simulator", "_syncoutputs", "_th_mainloop", "_waitexit", \ "core", "app", "device", "exitsignal", "io", "summary", "_debug", \ - "_lck_replace_io", "_replace_io_file", "_run_on_pi" + "_replace_io_file", "_run_on_pi" def __init__( self, autorefresh=False, monitoring=False, syncoutputs=True, - procimg=None, configrsc=None, simulator=False, debug=False, + procimg=None, configrsc=None, simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. @@ -51,7 +51,7 @@ class RevPiModIO(object): @param procimg Abweichender Pfad zum Prozessabbild @param configrsc Abweichender Pfad zur piCtory Konfigurationsdatei @param simulator Laedt das Modul als Simulator und vertauscht IOs - @param debug Gibt bei allen Fehlern komplette Meldungen aus + @param debug Gibt alle Warnungen inkl. Zyklusprobleme aus @param replace_io_file Replace IO Konfiguration aus Datei laden @param direct_output Write outputs immediately to process image (slow) @@ -80,12 +80,11 @@ class RevPiModIO(object): # Private Variablen self.__cleanupfunc = None self._buffedwrite = False - self._debug = debug + self._debug = 1 self._exit = Event() self._imgwriter = None self._ioerror = 0 self._length = 0 - self._lck_replace_io = False self._looprunning = False self._lst_devselect = [] self._lst_refresh = [] @@ -108,6 +107,9 @@ class RevPiModIO(object): # Event für Benutzeraktionen self.exitsignal = Event() + # Wert über setter setzen + self.debug = debug + try: self._run_on_pi = S_ISCHR(osstat(self._procimg).st_mode) except Exception: @@ -116,6 +118,7 @@ class RevPiModIO(object): # Nur Konfigurieren, wenn nicht vererbt if type(self) == RevPiModIO: self._configure(self.get_jconfigrsc()) + self._configure_replace_io(self._get_cpreplaceio()) def __del__(self): """Zerstoert alle Klassen um aufzuraeumen.""" @@ -138,7 +141,8 @@ class RevPiModIO(object): self.writeprocimg() def _configure(self, jconfigrsc): - """Verarbeitet die piCtory Konfigurationsdatei.""" + """Verarbeitet die piCtory Konfigurationsdatei. + @param jconfigrsc: Data to build IOs as of JSON""" # Filehandler konfigurieren, wenn er noch nicht existiert if self._myfh is None: @@ -233,7 +237,8 @@ class RevPiModIO(object): else: # Device-Type nicht gefunden warnings.warn( - "device type '{0}' unknown".format(device["type"]), + "device type '{0}' on position {1} unknown" + "".format(device["type"], device["position"]), Warning ) dev_new = None @@ -262,11 +267,6 @@ class RevPiModIO(object): 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 self._imgwriter = helpermodule.ProcimgWriter(self) @@ -301,85 +301,74 @@ class RevPiModIO(object): # Summary Klasse instantiieren 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, welche vorher mit .export_replaced_ios(...) in eine Datei exportiert worden sind. Diese IOs werden in dieser Instanz wiederhergestellt. + @param ireplaceio: Data to replace ios as + """ - cp = ConfigParser() - - 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: + for io in creplaceio: if io == "DEFAULT": continue # IO prüfen - parentio = cp[io].get("replace", "") + parentio = creplaceio[io].get("replace", "") # Funktionsaufruf vorbereiten dict_replace = { - "frm": cp[io].get("frm"), + "frm": creplaceio[io].get("frm"), + "byteorder": creplaceio[io].get("byteorder", "little"), + "bmk": creplaceio[io].get("bmk", ""), } - # Convert defaultvalue from config file - if "defaultvalue" in cp[io]: - if dict_replace["frm"] == "?": - try: - dict_replace["defaultvalue"] = \ - cp[io].getboolean("defaultvalue") - except Exception: - raise ValueError( - "replace_io_file: could not convert '{0}' " - "defaultvalue '{1}' to boolean" - "".format(io, cp[io].get("defaultvalue")) - ) - else: - try: - dict_replace["defaultvalue"] = \ - cp[io].getint("defaultvalue") - except Exception: - raise ValueError( - "replace_io_file: could not convert '{0}' " - "defaultvalue '{1}' to integer" - "".format(io, cp[io].get("bit")) - ) - # Get bitaddress from config file - if "bit" in cp[io]: + if "bit" in creplaceio[io]: try: - dict_replace["bit"] = cp[io].getint("bit", 0) + dict_replace["bit"] = creplaceio[io].getint("bit") except Exception: raise ValueError( "replace_io_file: could not convert '{0}' " "bit '{1}' to integer" - "".format(io, cp[io].get("bit")) + "".format(io, creplaceio[io]["bit"]) ) - # Sonstige Werte laden, wenn vorhanden - if "bmk" in cp[io]: - dict_replace["bmk"] = cp[io].get("bmk") - if "byteorder" in cp[io]: - dict_replace["byteorder"] = cp[io].get("byteorder") + # Convert defaultvalue from config file + if "defaultvalue" in creplaceio[io]: + if dict_replace["frm"] == "?": + try: + dict_replace["defaultvalue"] = \ + creplaceio[io].getboolean("defaultvalue") + except Exception: + raise ValueError( + "replace_io_file: could not convert '{0}' " + "defaultvalue '{1}' to boolean" + "".format(io, creplaceio[io]["defaultvalue"]) + ) + else: + try: + dict_replace["defaultvalue"] = \ + creplaceio[io].getint("defaultvalue") + except Exception: + raise ValueError( + "replace_io_file: could not convert '{0}' " + "defaultvalue '{1}' to integer" + "".format(io, creplaceio[io]["defaultvalue"]) + ) # IO ersetzen try: self.io[parentio].replace_io(name=io, **dict_replace) except Exception as e: - raise RuntimeError( - "replace_io_file: can not replace '{0}' with '{1}' " - "| RevPiModIO message: {2}".format(parentio, io, e) - ) + # NOTE: Bei Selected/Driver kann nicht geprüft werden + if len(self._lst_devselect) == 0: + raise RuntimeError( + "replace_io_file: can not replace '{0}' with '{1}' " + "| RevPiModIO message: {2}".format(parentio, io, e) + ) def _create_myfh(self): """Erstellt FileObject mit Pfad zum procimg. @@ -392,6 +381,25 @@ class RevPiModIO(object): @return Pfad der verwendeten piCtory Konfiguration""" return self._configrsc + def _get_cpreplaceio(self): + """Laed die replace_io_file Konfiguration und verarbeitet sie. + @return 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): """Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus. @return Millisekunden""" @@ -400,15 +408,12 @@ class RevPiModIO(object): def _get_debug(self): """Gibt Status des Debugflags zurueck. @return Status des Debugflags""" - return self._debug + return self._debug == 1 def _get_ioerrors(self): """Getter function. @return Aktuelle Anzahl gezaehlter Fehler""" - if self._looprunning: - return self._imgwriter._ioerror - else: - return self._ioerror + return self._ioerror def _get_length(self): """Getter function. @@ -440,11 +445,12 @@ class RevPiModIO(object): @return True, wenn als Simulator gestartet""" return self._simulator - def _gotioerror(self, action, e=None): + def _gotioerror(self, action, e=None, show_warn=True): """IOError Verwaltung fuer Prozessabbildzugriff. @param action Zusatzinformationen zum loggen @param e Exception to log if debug is enabled + @param show_warn Warnung anzeigen """ self._ioerror += 1 @@ -453,13 +459,21 @@ class RevPiModIO(object): "reach max io error count {0} on process image" "".format(self._maxioerrors) ) - warnings.warn( - "got io error during {0} and count {1} errors now" - "".format(action, self._ioerror), - RuntimeWarning - ) - if self._debug and e is not None: - warnings.warn(str(e), RuntimeWarning) + + if not show_warn or self._debug == -1: + return + + if self._debug == 0: + warnings.warn( + "got io error on process image", + RuntimeWarning + ) + else: + warnings.warn( + "got io error during '{0}' and count {1} errors now | {2}" + "".format(action, self._ioerror, str(e)), + RuntimeWarning + ) def _set_cycletime(self, milliseconds): """Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung. @@ -472,12 +486,31 @@ class RevPiModIO(object): else: self._imgwriter.refresh = milliseconds + def _set_debug(self, value): + """Setzt debugging Status um mehr Meldungen zu erhalten oder nicht. + @param value Wenn True, werden umfangreiche Medungen angezeigt""" + if type(value) == bool: + value = int(value) + if not type(value) == int: + # Wert -1 ist zum kompletten deaktivieren versteckt + raise TypeError("value must be or ") + if not -1 <= value <= 1: + raise ValueError("value must be True/False or -1, 0, 1") + + self._debug = value + + if value == -1: + warnings.filterwarnings("ignore", module="revpimodio2") + elif value == 0: + warnings.filterwarnings("default", module="revpimodio2") + else: + warnings.filterwarnings("always", module="revpimodio2") + def _set_maxioerrors(self, value): """Setzt Anzahl der maximal erlaubten Fehler bei Prozessabbildzugriff. @param value Anzahl erlaubte Fehler""" if type(value) == int and value >= 0: self._maxioerrors = value - self._imgwriter.maxioerrors = value else: raise ValueError("value must be 0 or a positive integer") @@ -511,7 +544,6 @@ class RevPiModIO(object): self._myfh.flush() elif request == 19220: - # FIXME: Implement # Counterwert auf 0 setzen dev_position = arg[0] bit_field = int.from_bytes(arg[2:], byteorder="little") @@ -524,7 +556,7 @@ class RevPiModIO(object): break if io_byte == -1: - raise RuntimeError("count not reset counter io in file") + raise RuntimeError("could not reset counter io in file") with self._myfh_lck: self._myfh.seek(io_byte) @@ -573,7 +605,7 @@ class RevPiModIO(object): @param func Funktion, die ausgefuehrt werden soll @param cycletime Zykluszeit in Millisekunden - Standardwert 50 ms - @return None + @return None or the return value of the cycle function """ # Prüfen ob ein Loop bereits läuft @@ -682,7 +714,7 @@ class RevPiModIO(object): if not self._monitoring: self.writeprocimg(dev) - def export_replaced_ios(self, filename): + def export_replaced_ios(self, filename="replace_ios.conf"): """Exportiert ersetzte IOs dieser Instanz. Exportiert alle ersetzten IOs, welche mit .replace_io(...) angelegt @@ -705,8 +737,10 @@ class RevPiModIO(object): # Optional values if io._bitaddress >= 0: cp[io.name]["bit"] = str(io._bitaddress) - cp[io.name]["byteorder"] = io._byteorder - cp[io.name]["defaultvalue"] = str(io.defaultvalue) + if io._byteorder != "little": + cp[io.name]["byteorder"] = io._byteorder + if io.defaultvalue != 0: + cp[io.name]["defaultvalue"] = str(io.defaultvalue) if io.bmk != "": cp[io.name]["bmk"] = io.bmk @@ -784,7 +818,7 @@ class RevPiModIO(object): signal(SIGINT, self.__evt_exit) signal(SIGTERM, self.__evt_exit) - def mainloop(self, blocking=True, no_warn=False): + def mainloop(self, blocking=True): """Startet den Mainloop mit Eventueberwachung. Der aktuelle Programmthread wird hier bis Aufruf von @@ -799,8 +833,7 @@ class RevPiModIO(object): Events vom RevPi benoetigt werden, aber das Programm weiter ausgefuehrt werden soll. - @param blocking Wenn False, blockiert das Programm NICHT - @param no_warn Keine Warnungen bei langsamen Funktionen ausgeben + @param blocking Wenn False, blockiert das Programm hier NICHT @return None """ @@ -847,7 +880,7 @@ class RevPiModIO(object): or regfunc.edge == RISING and io.value \ or regfunc.edge == FALLING and not io.value: if regfunc.as_thread: - self._imgwriter.__eventqth.put( + self._imgwriter._eventqth.put( (regfunc, io._name, io.value), False ) else: @@ -858,13 +891,13 @@ class RevPiModIO(object): # ImgWriter mit Eventüberwachung aktivieren self._imgwriter._collect_events(True) e = None - runtime = -1 if no_warn else 0 + runtime = -1 if self._debug == -1 else 0 while not self._exit.is_set(): # Laufzeit der Eventqueue auf 0 setzen if self._imgwriter._eventq.qsize() == 0: - runtime = -1 if no_warn else 0 + runtime = -1 if self._debug == -1 else 0 try: tup_fire = self._imgwriter._eventq.get(timeout=1) @@ -882,7 +915,7 @@ class RevPiModIO(object): runtime = -1 warnings.warn( "can not execute all event functions in one cycle - " - "rise .cycletime or optimize your event functions", + "optimize your event functions or rise .cycletime", RuntimeWarning ) except Empty: @@ -958,7 +991,6 @@ class RevPiModIO(object): def resetioerrors(self): """Setzt aktuellen IOError-Zaehler auf 0 zurueck.""" self._ioerror = 0 - self._imgwriter._ioerror = 0 def setdefaultvalues(self, device=None): """Alle Outputbuffer werden auf die piCtory default Werte gesetzt. @@ -1082,7 +1114,7 @@ class RevPiModIO(object): return workokay - debug = property(_get_debug) + debug = property(_get_debug, _set_debug) configrsc = property(_get_configrsc) cycletime = property(_get_cycletime, _set_cycletime) ioerrors = property(_get_ioerrors) @@ -1110,7 +1142,7 @@ class RevPiModIOSelected(RevPiModIO): def __init__( self, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, - simulator=False, debug=False, replace_io_file=None, + simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert nur fuer angegebene Devices die Grundfunktionen. @@ -1142,6 +1174,7 @@ class RevPiModIOSelected(RevPiModIO): ) self._configure(self.get_jconfigrsc()) + self._configure_replace_io(self._get_cpreplaceio()) if len(self.device) == 0: if type(self) == RevPiModIODriver: @@ -1178,7 +1211,7 @@ class RevPiModIODriver(RevPiModIOSelected): def __init__( self, virtdev, autorefresh=False, monitoring=False, - syncoutputs=True, procimg=None, configrsc=None, debug=False, + syncoutputs=True, procimg=None, configrsc=None, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. diff --git a/revpimodio2/netio.py b/revpimodio2/netio.py index c2da6a4..c09317e 100644 --- a/revpimodio2/netio.py +++ b/revpimodio2/netio.py @@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "LGPLv3" import socket import warnings +from configparser import ConfigParser from json import loads as jloads from re import compile from revpimodio2 import DeviceNotFoundError @@ -21,8 +22,28 @@ _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' # piCtory Konfiguration laden _syspictory = b'\x01PI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17' +_syspictoryh = b'\x01PH\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' +_sysreplaceioh = b'\x01RH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17' # Übertragene Bytes schreiben _sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17' +# Hashvalues +HASH_FAIL = b'\xff' * 16 + + +class AclException(Exception): + + """Probleme mit Berechtigungen.""" + + pass + + +class ConfigChanged(Exception): + + """Aenderung der piCtory oder replace_ios Datei.""" + + pass class NetFH(Thread): @@ -35,26 +56,34 @@ class NetFH(Thread): """ - __slots__ = "__by_buff", "__int_buff", "__dictdirty", "__flusherr", \ - "__position", "__sockact", "__sockerr", "__sockend", "__socklock", \ - "__timeout", "__trigger", "__waitsync", \ - "_address", "_slavesock", \ - "daemon" + __slots__ = "__by_buff", "__check_replace_ios", "__config_changed", \ + "__int_buff", "__dictdirty", "__flusherr", "__replace_ios_h", \ + "__pictory_h", "__position", "__sockact", "__sockerr", "__sockend", \ + "__socklock", "__timeout", "__trigger", "__waitsync", "_address", \ + "_slavesock", "daemon" - def __init__(self, address, timeout=500): + def __init__(self, address, check_replace_ios, timeout=500): """Init NetFH-class. + @param address IP Adresse, Port des RevPi als - @param timeout Timeout in Millisekunden der Verbindung""" + @param check_replace_ios Prueft auf Veraenderungen der Datei + @param timeout Timeout in Millisekunden der Verbindung + + """ super().__init__() self.daemon = True self.__by_buff = b'' + self.__check_replace_ios = check_replace_ios + self.__config_changed = False self.__int_buff = 0 self.__dictdirty = {} self.__flusherr = False + self.__replace_ios_h = b'' + self.__pictory_h = b'' self.__sockact = False self.__sockerr = Event() - self.__sockend = False + self.__sockend = Event() self.__socklock = Lock() self.__timeout = None self.__trigger = False @@ -90,10 +119,10 @@ class NetFH(Thread): if bytecode == b'\x18': # Alles beenden, wenn nicht erlaubt - self.__sockend = True + self.__sockend.set() self.__sockerr.set() self._slavesock.close() - raise RuntimeError( + raise AclException( "write access to the process image is not permitted - use " "monitoring=True or check aclplcslave.conf on RevPi and " "reload revpipyload!" @@ -124,6 +153,46 @@ class NetFH(Thread): so = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: so.connect(self._address) + + # Hashwerte anfordern + recv_len = 16 + so.sendall(_syspictoryh) + if self.__check_replace_ios: + so.sendall(_sysreplaceioh) + recv_len += 16 + + # Hashwerte empfangen + byte_buff = bytearray() + zero_byte = 0 + while not self.__sockend.is_set() and len(byte_buff) < recv_len: + data = so.recv(recv_len) + if data == b'': + zero_byte += 1 + if zero_byte == 100: + raise OSError("too many zero bytes on hash load") + byte_buff += data + + # Änderung an piCtory prüfen + if self.__pictory_h and byte_buff[:16] != self.__pictory_h: + self.__config_changed = True + self.close() + raise ConfigChanged( + "configuration on revolution pi was changed") + else: + self.__pictory_h = byte_buff[:16] + + # Änderung an replace_ios prüfen + if self.__check_replace_ios and self.__replace_ios_h \ + and byte_buff[16:] != self.__replace_ios_h: + self.__config_changed = True + self.close() + raise ConfigChanged( + "configuration on revolution pi was changed") + else: + self.__replace_ios_h = byte_buff[16:] + except ConfigChanged: + so.close() + raise except Exception: so.close() else: @@ -151,11 +220,12 @@ class NetFH(Thread): @returns Empfangende Bytes """ - if self.__sockend: + if self.__sockend.is_set(): raise ValueError("I/O operation on closed file") with self.__socklock: self._slavesock.sendall(send_bytes) + # FIXME: Schleife bis Daten empfangen sind einbauen recv = self._slavesock.recv(recv_count) self.__trigger = True return recv @@ -163,10 +233,15 @@ class NetFH(Thread): def clear_dirtybytes(self, position=None): """Entfernt die konfigurierten Dirtybytes vom RevPi Slave. @param position Startposition der Dirtybytes""" - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("I/O operation on closed file") - with self.__socklock: + error = False + try: + self.__socklock.acquire() + if position is None: # Alle Dirtybytes löschen self._slavesock.sendall(_sysdeldirty) @@ -184,40 +259,54 @@ class NetFH(Thread): # ACL prüfen und ggf Fehler werfen self.__check_acl(check) - self.__sockerr.set() raise IOError("clear dirtybytes error on network") + except AclException: + raise + except Exception: + error = True + finally: + self.__socklock.release() - # Daten bei Erfolg übernehmen + # Daten immer übernehmen if position is None: self.__dictdirty = {} elif position in self.__dictdirty: del self.__dictdirty[position] + if error: + # Fehler nach übernahme der Daten auslösen um diese zu setzen + self.__sockerr.set() + self.__trigger = True def close(self): """Verbindung trennen.""" - if self.__sockend: + if self.__sockend.is_set(): return - self.__sockend = True + self.__sockend.set() self.__sockerr.set() # Vom Socket sauber trennen if self._slavesock is not None: - with self.__socklock: - try: - if self.__sockend: - self._slavesock.send(_sysexit) - else: - self._slavesock.shutdown(socket.SHUT_RDWR) - except Exception: - pass + try: + self.__socklock.acquire() + self._slavesock.send(_sysexit) + + # NOTE: Wird das benötigt? + self._slavesock.shutdown(socket.SHUT_RDWR) + except Exception: + pass + finally: + self.__socklock.release() + self._slavesock.close() def flush(self): """Schreibpuffer senden.""" - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("flush of closed file") with self.__socklock: @@ -248,13 +337,23 @@ class NetFH(Thread): def get_closed(self): """Pruefen ob Verbindung geschlossen ist. @return True, wenn Verbindung geschlossen ist""" - return self.__sockend + return self.__sockend.is_set() + + def get_config_changed(self): + """Pruefen ob RevPi Konfiguration geaendert wurde. + @return True, wenn RevPi Konfiguration geaendert ist""" + return self.__config_changed def get_name(self): """Verbindugnsnamen zurueckgeben. @return IP:PORT""" return "{0}:{1}".format(*self._address) + def get_reconnecting(self): + """Interner reconnect aktiv wegen Netzwerkfehlern. + @return True, wenn reconnect aktiv""" + return self.__sockerr.is_set() + def get_timeout(self): """Gibt aktuellen Timeout zurueck. @return in Millisekunden""" @@ -264,7 +363,9 @@ class NetFH(Thread): """IOCTL Befehle ueber das Netzwerk senden. @param request Request as @param arg Argument as """ - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("read of closed file") if not (isinstance(arg, bytes) and len(arg) <= 1024): @@ -295,7 +396,9 @@ class NetFH(Thread): """Daten ueber das Netzwerk lesen. @param length Anzahl der Bytes @return Gelesene """ - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("read of closed file") with self.__socklock: @@ -307,8 +410,8 @@ class NetFH(Thread): ) bytesbuff = bytearray() - while not self.__sockend and len(bytesbuff) < length: - rbytes = self._slavesock.recv(1024) + while not self.__sockend.is_set() and len(bytesbuff) < length: + rbytes = self._slavesock.recv(256) if rbytes == b'': self.__sockerr.set() @@ -323,56 +426,108 @@ class NetFH(Thread): def readpictory(self): """Ruft die piCtory Konfiguration ab. @return piCtory Datei""" - if self.__sockend: + if self.__sockend.is_set(): raise ValueError("read of closed file") + if self.__pictory_h == HASH_FAIL: + raise RuntimeError( + "could not read/parse piCtory configuration over network" + ) + with self.__socklock: self._slavesock.send(_syspictory) byte_buff = bytearray() - while not self.__sockend: - data = self._slavesock.recv(1024) + zero_byte = 0 + while not self.__sockend.is_set() and zero_byte < 100: + data = self._slavesock.recv(128) + if data == b'': + zero_byte += 1 byte_buff += data if data.find(b'\x04') >= 0: + self.__trigger = True + # NOTE: Nur suchen oder Ende prüfen? - return byte_buff[:-1] + return bytes(byte_buff[:-1]) self.__sockerr.set() raise IOError("readpictory error on network") - self.__trigger = True + def readreplaceio(self): + """Ruft die replace_io Konfiguration ab. + @return replace_io_file""" + if self.__sockend.is_set(): + raise ValueError("read of closed file") + + if self.__replace_ios_h == HASH_FAIL: + raise RuntimeError( + "replace_io_file: could not read/parse over network" + ) + + with self.__socklock: + self._slavesock.send(_sysreplaceio) + + byte_buff = bytearray() + zero_byte = 0 + while not self.__sockend.is_set() and zero_byte < 100: + data = self._slavesock.recv(128) + if data == b'': + zero_byte += 1 + + byte_buff += data + if data.find(b'\x04') >= 0: + self.__trigger = True + + # NOTE: Nur suchen oder Ende prüfen? + return bytes(byte_buff[:-1]) + + self.__sockerr.set() + raise IOError("readreplaceio error on network") def run(self): """Handler fuer Synchronisierung.""" - while not self.__sockend: + state_reconnect = False + while not self.__sockend.is_set(): # Bei Fehlermeldung neu verbinden if self.__sockerr.is_set(): + if not state_reconnect: + state_reconnect = True + warnings.warn( + "got a network error and try to reconnect", + RuntimeWarning + ) self._connect() + if self.__sockerr.is_set(): + # Verhindert bei Scheitern 100% CPU last + self.__sockend.wait(self.__waitsync) + else: + state_reconnect = False + warnings.warn( + "successfully reconnected after network error", + RuntimeWarning + ) - else: - # Kein Fehler aufgetreten, sync durchführen wenn socket frei - if not self.__trigger and \ - self.__socklock.acquire(blocking=False): - try: - self._slavesock.send(_syssync) - data = self._slavesock.recv(2) - except IOError as e: + # Kein Fehler aufgetreten, sync durchführen wenn socket frei + if not self.__trigger and \ + self.__socklock.acquire(blocking=False): + try: + self._slavesock.send(_syssync) + data = self._slavesock.recv(2) + except IOError: + self.__sockerr.set() + else: + if data != b'\x06\x16': warnings.warn( - "network error in sync of NetFH", RuntimeWarning + "data error on network sync", + RuntimeWarning ) self.__sockerr.set() - else: - if data != b'\x06\x16': - warnings.warn( - "data error in sync of NetFH", RuntimeWarning - ) - self.__sockerr.set() - self.__socklock.release() + self.__socklock.release() - self.__trigger = False + self.__trigger = False # Warten nach Sync damit Instantiierung funktioniert self.__sockerr.wait(self.__waitsync) @@ -380,7 +535,9 @@ class NetFH(Thread): def seek(self, position): """Springt an angegebene Position. @param position An diese Position springen""" - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("seek of closed file") self.__position = int(position) @@ -388,10 +545,15 @@ class NetFH(Thread): """Konfiguriert Dirtybytes fuer Prozessabbild bei Verbindungsfehler. @param positon Startposition zum Schreiben @param dirtybytes die geschrieben werden sollen""" - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("I/O operation on closed file") - with self.__socklock: + error = False + try: + self.__socklock.acquire() + self._slavesock.sendall( b'\x01EY' + position.to_bytes(length=2, byteorder="little") + @@ -406,24 +568,35 @@ class NetFH(Thread): # ACL prüfen und ggf Fehler werfen self.__check_acl(check) - self.__sockerr.set() raise IOError("set dirtybytes error on network") + except AclException: + raise + except Exception: + error = True + finally: + self.__socklock.release() - # Daten erfolgreich übernehmen - self.__dictdirty[position] = dirtybytes + # Daten immer übernehmen + self.__dictdirty[position] = dirtybytes - self.__trigger = True + if error: + # Fehler nach übernahme der Daten auslösen um diese zu setzen + self.__sockerr.set() + + self.__trigger = True def set_timeout(self, value): """Setzt Timeoutwert fuer Verbindung. @param value Timeout in Millisekunden""" - if self.__sockend: + if self.__sockend.is_set(): raise ValueError("I/O operation on closed file") # Timeoutwert verarbeiten (könnte Exception auslösen) self.__set_systimeout(value) - with self.__socklock: + try: + self.__socklock.acquire() + self._slavesock.send( b'\x01CF' + value.to_bytes(length=2, byteorder="little") + @@ -431,15 +604,20 @@ class NetFH(Thread): ) check = self._slavesock.recv(1) if check != b'\x1e': - self.__sockerr.set() raise IOError("set timeout error on network") + except Exception: + self.__sockerr.set() + finally: + self.__socklock.release() - self.__trigger = True + self.__trigger = True def tell(self): """Gibt aktuelle Position zurueck. @return int aktuelle Position""" - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("I/O operation on closed file") return self.__position @@ -447,7 +625,9 @@ class NetFH(Thread): """Daten ueber das Netzwerk schreiben. @param bytebuff Bytes zum schreiben @return Anzahl geschriebener bytes""" - if self.__sockend: + if self.__config_changed: + raise ConfigChanged("configuration on revolution pi was changed") + if self.__sockend.is_set(): raise ValueError("write to closed file") if self.__flusherr: @@ -468,7 +648,9 @@ class NetFH(Thread): return len(bytebuff) closed = property(get_closed) + config_changed = property(get_config_changed) name = property(get_name) + reconnecting = property(get_reconnecting) timeout = property(get_timeout, set_timeout) @@ -489,7 +671,7 @@ class RevPiNetIO(_RevPiModIO): def __init__( self, address, autorefresh=False, monitoring=False, - syncoutputs=True, simulator=False, debug=False, + syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. @@ -543,15 +725,15 @@ class RevPiNetIO(_RevPiModIO): # Vererben super().__init__( - autorefresh, - monitoring, - syncoutputs, - "{0}:{1}".format(*self._address), - None, - simulator, - debug, - replace_io_file, - direct_output + autorefresh=autorefresh, + monitoring=monitoring, + syncoutputs=syncoutputs, + procimg="{0}:{1}".format(*self._address), + configrsc=None, + simulator=simulator, + debug=debug, + replace_io_file=replace_io_file, + direct_output=direct_output, ) # Netzwerkfilehandler anlegen @@ -560,25 +742,73 @@ class RevPiNetIO(_RevPiModIO): # Nur Konfigurieren, wenn nicht vererbt if type(self) == RevPiNetIO: self._configure(self.get_jconfigrsc()) + self._configure_replace_io(self._get_cpreplaceio()) def _create_myfh(self): """Erstellt NetworkFileObject. return FileObject""" self._buffedwrite = True - return NetFH(self._address) + return NetFH(self._address, self._replace_io_file == ":network:") + + def _get_cpreplaceio(self): + """Laed die replace_io Konfiguration ueber das Netzwerk. + @return 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): """Trennt Verbindungen und beendet autorefresh inkl. alle Threads.""" self.cleanup() + def exit(self, full=True): + """Beendet mainloop() und optional autorefresh. + @see #RevPiModIO.exit(...)""" + try: + super().exit(full) + except ConfigChanged: + pass + + def get_config_changed(self): + """Pruefen ob RevPi Konfiguration geaendert wurde. + + In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss + neu instanziert werden. + + @return True, wenn RevPi Konfiguration geaendert ist""" + return self._myfh.config_changed + def get_jconfigrsc(self): """Laedt die piCotry Konfiguration und erstellt ein . @return der piCtory Konfiguration""" - mynh = NetFH(self._address) + mynh = NetFH(self._address, False) byte_buff = mynh.readpictory() mynh.close() return jloads(byte_buff.decode("utf-8")) + def get_reconnecting(self): + """Interner reconnect aktiv wegen Netzwerkfehlern. + + Das Modul versucht intern die Verbindung neu herzustellen. Es ist + kein weiteres Zutun noetig. + + @return True, wenn reconnect aktiv""" + return self._myfh.reconnecting + def net_cleardefaultvalues(self, device=None): """Loescht Defaultwerte vom PLC Slave. @param device nur auf einzelnes Device anwenden, sonst auf Alle""" @@ -646,6 +876,9 @@ class RevPiNetIO(_RevPiModIO): dev._offset + dev._slc_out.start, dirtybytes ) + config_changed = property(get_config_changed) + reconnecting = property(get_reconnecting) + class RevPiNetIOSelected(RevPiNetIO): @@ -662,7 +895,7 @@ class RevPiNetIOSelected(RevPiNetIO): def __init__( self, address, deviceselection, autorefresh=False, - monitoring=False, syncoutputs=True, simulator=False, debug=False, + monitoring=False, syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert nur fuer angegebene Devices die Grundfunktionen. @@ -695,6 +928,7 @@ class RevPiNetIOSelected(RevPiNetIO): ) self._configure(self.get_jconfigrsc()) + self._configure_replace_io(self._get_cpreplaceio()) if len(self.device) == 0: if type(self) == RevPiNetIODriver: @@ -731,7 +965,7 @@ class RevPiNetIODriver(RevPiNetIOSelected): def __init__( self, address, virtdev, autorefresh=False, monitoring=False, - syncoutputs=True, debug=False, replace_io_file=None, + syncoutputs=True, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. diff --git a/setup.py b/setup.py index ed4e147..b98e127 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( license="LGPLv3", name="revpimodio2", - version="2.3.3", + version="2.4.2", packages=["revpimodio2"], python_requires="~=3.2",