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:
2023-02-07 09:38:11 +01:00
parent 7d482d498c
commit 3771a7847e
3 changed files with 25 additions and 29 deletions

View File

@@ -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']

View File

@@ -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.

View File

@@ -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
) )