mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 13:53:53 +01:00
Replaces Master-Slave with Client-Server
Expunging all occurrences of inappropriate language of the query and response paradigm of PLC communications. We are familiar with the Modbus terminology and fully support this change. https://www.modbus.org/docs/Client-ServerPR-07-2020-final.docx.pdf
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
# Configuration file for the Sphinx documentation builder.
|
# Configuration file for the Sphinx documentation builder.
|
||||||
#
|
#
|
||||||
# For the full list of built-in configuration values, see the documentation:
|
# For the full list of built-in configuration values, see the documentation:
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -11,7 +10,6 @@ sys.path.insert(0, os.path.abspath('../src'))
|
|||||||
from revpimodio2 import __version__
|
from revpimodio2 import __version__
|
||||||
|
|
||||||
# -- Project information -----------------------------------------------------
|
# -- Project information -----------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
|
||||||
|
|
||||||
project = 'revpimodio2'
|
project = 'revpimodio2'
|
||||||
copyright = '2023, Sven Sager'
|
copyright = '2023, Sven Sager'
|
||||||
@@ -19,7 +17,6 @@ author = 'Sven Sager'
|
|||||||
version = __version__
|
version = __version__
|
||||||
|
|
||||||
# -- General configuration ---------------------------------------------------
|
# -- General configuration ---------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
|
||||||
|
|
||||||
extensions = [
|
extensions = [
|
||||||
'sphinx.ext.autodoc',
|
'sphinx.ext.autodoc',
|
||||||
@@ -31,7 +28,6 @@ templates_path = ['_templates']
|
|||||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||||
|
|
||||||
# -- Options for HTML output -------------------------------------------------
|
# -- Options for HTML output -------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
|
||||||
|
|
||||||
html_theme = 'alabaster'
|
html_theme = 'alabaster'
|
||||||
html_static_path = ['_static']
|
html_static_path = ['_static']
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.. revpimodio2 documentation master file, created by
|
.. revpimodio2 documentation main file, created by
|
||||||
sphinx-quickstart on Sun Jan 22 17:49:41 2023.
|
sphinx-quickstart on Sun Jan 22 17:49:41 2023.
|
||||||
You can adapt this file completely to your liking, but it should at least
|
You can adapt this file completely to your liking, but it should at least
|
||||||
contain the root `toctree` directive.
|
contain the root `toctree` directive.
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class NetFH(Thread):
|
|||||||
"__int_buff", "__dictdirty", "__flusherr", "__replace_ios_h", \
|
"__int_buff", "__dictdirty", "__flusherr", "__replace_ios_h", \
|
||||||
"__pictory_h", "__position", "__sockerr", "__sockend", \
|
"__pictory_h", "__position", "__sockerr", "__sockend", \
|
||||||
"__socklock", "__timeout", "__waitsync", "_address", \
|
"__socklock", "__timeout", "__waitsync", "_address", \
|
||||||
"_slavesock", "daemon"
|
"_serversock", "daemon"
|
||||||
|
|
||||||
def __init__(self, address: tuple, check_replace_ios: bool, timeout=500):
|
def __init__(self, address: tuple, check_replace_ios: bool, timeout=500):
|
||||||
"""
|
"""
|
||||||
@@ -91,7 +91,7 @@ class NetFH(Thread):
|
|||||||
self.__timeout = None
|
self.__timeout = None
|
||||||
self.__waitsync = None
|
self.__waitsync = None
|
||||||
self._address = address
|
self._address = address
|
||||||
self._slavesock = None # type: socket.socket
|
self._serversock = None # type: socket.socket
|
||||||
|
|
||||||
# Parameterprüfung
|
# Parameterprüfung
|
||||||
if not isinstance(address, tuple):
|
if not isinstance(address, tuple):
|
||||||
@@ -105,8 +105,8 @@ class NetFH(Thread):
|
|||||||
self.__set_systimeout(timeout)
|
self.__set_systimeout(timeout)
|
||||||
self._connect()
|
self._connect()
|
||||||
|
|
||||||
if self._slavesock is None:
|
if self._serversock is None:
|
||||||
raise FileNotFoundError("can not connect to revpi slave")
|
raise FileNotFoundError("can not connect to revpi server")
|
||||||
|
|
||||||
# NetFH konfigurieren
|
# NetFH konfigurieren
|
||||||
self.__position = 0
|
self.__position = 0
|
||||||
@@ -129,10 +129,10 @@ class NetFH(Thread):
|
|||||||
# Alles beenden, wenn nicht erlaubt
|
# Alles beenden, wenn nicht erlaubt
|
||||||
self.__sockend.set()
|
self.__sockend.set()
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
self._slavesock.close()
|
self._serversock.close()
|
||||||
raise AclException(
|
raise AclException(
|
||||||
"write access to the process image is not permitted - use "
|
"write access to the process image is not permitted - use "
|
||||||
"monitoring=True or check aclplcslave.conf on RevPi and "
|
"monitoring=True or check aclplcserver.conf on RevPi and "
|
||||||
"reload revpipyload!"
|
"reload revpipyload!"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -146,8 +146,8 @@ class NetFH(Thread):
|
|||||||
self.__timeout = value / 1000
|
self.__timeout = value / 1000
|
||||||
|
|
||||||
# Timeouts in Socket setzen
|
# Timeouts in Socket setzen
|
||||||
if self._slavesock is not None:
|
if self._serversock is not None:
|
||||||
self._slavesock.settimeout(self.__timeout)
|
self._serversock.settimeout(self.__timeout)
|
||||||
|
|
||||||
# 45 Prozent vom Timeout für Synctimer verwenden
|
# 45 Prozent vom Timeout für Synctimer verwenden
|
||||||
self.__waitsync = self.__timeout / 100 * 45
|
self.__waitsync = self.__timeout / 100 * 45
|
||||||
@@ -156,7 +156,7 @@ class NetFH(Thread):
|
|||||||
raise ValueError("value must between 10 and 60000 milliseconds")
|
raise ValueError("value must between 10 and 60000 milliseconds")
|
||||||
|
|
||||||
def _connect(self) -> None:
|
def _connect(self) -> None:
|
||||||
"""Stellt die Verbindung zu einem RevPiSlave her."""
|
"""Stellt die Verbindung zu einem RevPiPlcServer her."""
|
||||||
# Neuen Socket aufbauen
|
# Neuen Socket aufbauen
|
||||||
so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
try:
|
try:
|
||||||
@@ -205,10 +205,10 @@ class NetFH(Thread):
|
|||||||
else:
|
else:
|
||||||
# Alten Socket trennen
|
# Alten Socket trennen
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
if self._slavesock is not None:
|
if self._serversock is not None:
|
||||||
self._slavesock.close()
|
self._serversock.close()
|
||||||
|
|
||||||
self._slavesock = so
|
self._serversock = so
|
||||||
self.__sockerr.clear()
|
self.__sockerr.clear()
|
||||||
|
|
||||||
# Timeout setzen
|
# Timeout setzen
|
||||||
@@ -241,7 +241,7 @@ class NetFH(Thread):
|
|||||||
send_len = len(send_bytes)
|
send_len = len(send_bytes)
|
||||||
while counter < send_len:
|
while counter < send_len:
|
||||||
# Send loop to trigger timeout of socket on each send
|
# Send loop to trigger timeout of socket on each send
|
||||||
sent = self._slavesock.send(send_bytes[counter:])
|
sent = self._serversock.send(send_bytes[counter:])
|
||||||
if sent == 0:
|
if sent == 0:
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
raise IOError("lost network connection while send")
|
raise IOError("lost network connection while send")
|
||||||
@@ -249,7 +249,7 @@ class NetFH(Thread):
|
|||||||
|
|
||||||
self.__buff_recv.clear()
|
self.__buff_recv.clear()
|
||||||
while recv_len > 0:
|
while recv_len > 0:
|
||||||
count = self._slavesock.recv_into(
|
count = self._serversock.recv_into(
|
||||||
self.__buff_block, min(recv_len, self.__buff_size)
|
self.__buff_block, min(recv_len, self.__buff_size)
|
||||||
)
|
)
|
||||||
if count == 0:
|
if count == 0:
|
||||||
@@ -270,7 +270,7 @@ class NetFH(Thread):
|
|||||||
|
|
||||||
def clear_dirtybytes(self, position=None) -> None:
|
def clear_dirtybytes(self, position=None) -> None:
|
||||||
"""
|
"""
|
||||||
Entfernt die konfigurierten Dirtybytes vom RevPi Slave.
|
Entfernt die konfigurierten Dirtybytes vom RevPi Server.
|
||||||
|
|
||||||
Diese Funktion wirft keine Exception bei einem uebertragungsfehler,
|
Diese Funktion wirft keine Exception bei einem uebertragungsfehler,
|
||||||
veranlasst aber eine Neuverbindung.
|
veranlasst aber eine Neuverbindung.
|
||||||
@@ -319,17 +319,17 @@ class NetFH(Thread):
|
|||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
|
|
||||||
# Vom Socket sauber trennen
|
# Vom Socket sauber trennen
|
||||||
if self._slavesock is not None:
|
if self._serversock is not None:
|
||||||
try:
|
try:
|
||||||
self.__socklock.acquire()
|
self.__socklock.acquire()
|
||||||
self._slavesock.sendall(_sysexit)
|
self._serversock.sendall(_sysexit)
|
||||||
self._slavesock.shutdown(socket.SHUT_WR)
|
self._serversock.shutdown(socket.SHUT_WR)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
self.__socklock.release()
|
self.__socklock.release()
|
||||||
|
|
||||||
self._slavesock.close()
|
self._serversock.close()
|
||||||
|
|
||||||
def flush(self) -> None:
|
def flush(self) -> None:
|
||||||
"""Schreibpuffer senden."""
|
"""Schreibpuffer senden."""
|
||||||
@@ -538,12 +538,12 @@ class NetFH(Thread):
|
|||||||
# Kein Fehler aufgetreten, sync durchführen wenn socket frei
|
# Kein Fehler aufgetreten, sync durchführen wenn socket frei
|
||||||
if self.__socklock.acquire(blocking=False):
|
if self.__socklock.acquire(blocking=False):
|
||||||
try:
|
try:
|
||||||
self._slavesock.sendall(_syssync)
|
self._serversock.sendall(_syssync)
|
||||||
|
|
||||||
self.__buff_recv.clear()
|
self.__buff_recv.clear()
|
||||||
recv_lenght = 2
|
recv_lenght = 2
|
||||||
while recv_lenght > 0:
|
while recv_lenght > 0:
|
||||||
count = self._slavesock.recv_into(
|
count = self._serversock.recv_into(
|
||||||
self.__buff_block, recv_lenght
|
self.__buff_block, recv_lenght
|
||||||
)
|
)
|
||||||
if count == 0:
|
if count == 0:
|
||||||
@@ -857,7 +857,7 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
|
|
||||||
def net_cleardefaultvalues(self, device=None) -> None:
|
def net_cleardefaultvalues(self, device=None) -> None:
|
||||||
"""
|
"""
|
||||||
Loescht Defaultwerte vom PLC Slave.
|
Loescht Defaultwerte vom PLC Server.
|
||||||
|
|
||||||
:param device: nur auf einzelnes Device anwenden, sonst auf Alle
|
:param device: nur auf einzelnes Device anwenden, sonst auf Alle
|
||||||
"""
|
"""
|
||||||
@@ -879,7 +879,7 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
|
|
||||||
def net_setdefaultvalues(self, device=None) -> None:
|
def net_setdefaultvalues(self, device=None) -> None:
|
||||||
"""
|
"""
|
||||||
Konfiguriert den PLC Slave mit den piCtory Defaultwerten.
|
Konfiguriert den PLC Server mit den piCtory Defaultwerten.
|
||||||
|
|
||||||
Diese Werte werden auf dem RevPi gesetzt, wenn die Verbindung
|
Diese Werte werden auf dem RevPi gesetzt, wenn die Verbindung
|
||||||
unerwartet (Netzwerkfehler) unterbrochen wird.
|
unerwartet (Netzwerkfehler) unterbrochen wird.
|
||||||
@@ -924,7 +924,7 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
dirtybytes += \
|
dirtybytes += \
|
||||||
int_byte.to_bytes(length=1, byteorder="little")
|
int_byte.to_bytes(length=1, byteorder="little")
|
||||||
|
|
||||||
# Dirtybytes an PLC Slave senden
|
# Dirtybytes an PLC Server senden
|
||||||
self._myfh.set_dirtybytes(
|
self._myfh.set_dirtybytes(
|
||||||
dev._offset + dev._slc_out.start, dirtybytes
|
dev._offset + dev._slc_out.start, dirtybytes
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user