simstb 0.6.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. sim_basis/__init__.py +0 -0
  2. sim_basis/resources/CONTRIBUTING.md +6 -0
  3. sim_basis/resources/LICENSE.txt +15 -0
  4. sim_basis/resources/README.md +74 -0
  5. sim_basis/resources/config.toml +29 -0
  6. sim_basis/resources/daten/anaaus.txt +8 -0
  7. sim_basis/resources/daten/anaein.txt +8 -0
  8. sim_basis/resources/daten/digaus.txt +16 -0
  9. sim_basis/resources/daten/digein.txt +16 -0
  10. sim_basis/resources/docs/SimSTB-Benutzerdokumentation.pdf +0 -0
  11. sim_basis/resources/docs/beispiel.py +34 -0
  12. sim_basis/resources/modelle.json +13 -0
  13. sim_basis/simstb_dateizugriff.py +70 -0
  14. sim_basis/simstb_konfig.py +57 -0
  15. sim_basis/simstb_logger.py +33 -0
  16. sim_basis/version.py +3 -0
  17. sim_schnittstelle/__init__.py +0 -0
  18. sim_schnittstelle/simulator.py +93 -0
  19. sim_werkzeuge/__init__.py +0 -0
  20. sim_werkzeuge/images/band_links.gif +0 -0
  21. sim_werkzeuge/images/band_rechts.gif +0 -0
  22. sim_werkzeuge/images/band_stopp.gif +0 -0
  23. sim_werkzeuge/images/led_blau.png +0 -0
  24. sim_werkzeuge/images/led_grau.png +0 -0
  25. sim_werkzeuge/images/led_gruen.png +0 -0
  26. sim_werkzeuge/images/simstb.ico +0 -0
  27. sim_werkzeuge/simstb_cli.py +75 -0
  28. sim_werkzeuge/simstb_datenaufzeichner.py +250 -0
  29. sim_werkzeuge/simstb_generator.py +250 -0
  30. sim_werkzeuge/simstb_gui.py +486 -0
  31. sim_werkzeuge/simstb_init.py +72 -0
  32. sim_werkzeuge/simstb_modell_1.py +124 -0
  33. sim_werkzeuge/simstb_modell_2.py +121 -0
  34. sim_werkzeuge/simstb_modelle.py +121 -0
  35. sim_werkzeuge/simstb_setzer.py +57 -0
  36. simstb-0.6.0a1.dist-info/METADATA +96 -0
  37. simstb-0.6.0a1.dist-info/RECORD +40 -0
  38. simstb-0.6.0a1.dist-info/WHEEL +4 -0
  39. simstb-0.6.0a1.dist-info/entry_points.txt +4 -0
  40. simstb-0.6.0a1.dist-info/licenses/LICENSE.txt +15 -0
sim_basis/__init__.py ADDED
File without changes
@@ -0,0 +1,6 @@
1
+ # SimSTB - Simulationsumgebung für digitale und analoge Ein- und Ausgänge
2
+
3
+ Es gibt mehrere Möglichkeiten zum Projet SimSTB beizutragen:
4
+ - Benutzen Sie privat oder im Unterrichtseinsatz SimSTB und geben Sie Erfahrungen zurück.
5
+ - Erstellen Sie Unterrichtseinheiten, die auf SimSTB basieren.
6
+ - Erstellen Sie Modelle, die zusammen mit SimSTB genutzt werden können.
@@ -0,0 +1,15 @@
1
+
2
+ Copyright (c) 2026 Markus Breuer
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files,
5
+ to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,
6
+ distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
7
+ subject to the following conditions:
8
+
9
+ The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or
10
+ substantial portions of the Software.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
13
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
14
+ ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
15
+ THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,74 @@
1
+ # SimSTB - Simulationsumgebung für digitale und analoge Ein- und Ausgänge
2
+
3
+ Die Simulationsumgebung SimSTB ist für die Ausbildung im Bereich Python-Programmierung geeignet. Sie ist insbesondere für den Unterricht bei (elektro)technischen Schülern gedacht.
4
+
5
+ Oft muss ein Programm nicht nur über die Konsole oder eine graphische Oberfläche mit dem Benutzer kommunizieren, sondern auch über analoge und digitale Schnittstellen mit einem technischen System. Die Simulationsumgebung SimSTB erlaubt es, dies für Schulungszwecke auch ohne zusätzliche Hardware
6
+ mittels Simulation durchzuführen.
7
+
8
+ Durch das Einbinden des Simulatorpakets `sim` stehen dem Schüler vier einfach zu nutzende Funktionen für die digitale und analoge Ein- und Ausgabe zur Verfügung. Die analogen und digitalen Werte können über eine graphische Oberfläche bequem überwacht und gesetzt werden.
9
+
10
+ ## Installation
11
+
12
+ 1. Installieren Sie das Simulator-Paket mit dem Befehl `pip install sim`
13
+ 2. Prüfen Sie mit `pip list`, ob das Paket installiert wurde.
14
+ 3. Prüfen Sie mit `simstb_cli --version`, ob das Kommandozeilenwerkzeug korrekt installiert wurde.
15
+ 4. Bauen Sie mit `simstb_cli --init` die Laufzeitumgebung auf. Hierzu wird ein Ordner `sim` mit der Laufzeitumgebung im aktuellen Arbeitsverzeichnis angelegt. Achten Sie darauf, sich beim Aufruf im richtigen Verzeichnis zu befinden.
16
+ 5. Kontrollieren Sie, ob folgende Verzeichnis-Struktur und Dateien vorhanden sind.
17
+
18
+ ```
19
+ SIM
20
+ │ config.toml
21
+ │ CONTRIBUTING.md
22
+ │ LICENSE.txt
23
+ │ modelle.json
24
+ │ README.md
25
+
26
+ ├───data
27
+ │ anaaus.txt
28
+ │ anaein.txt
29
+ │ digaus.txt
30
+ │ digein.txt
31
+
32
+ └───doc
33
+ beispiel.py
34
+ SimSTB-Benutzerdokumentation.pdf
35
+ ```
36
+
37
+ 6. Erstellen Sie eine Umgebungsvariable namens `SIMSTB_WURZEL`, welches auf das Simulationsverzeichnis zeigt.
38
+
39
+ ## Benutzung
40
+
41
+ ### 1. Simulations Steuerung und Monitor
42
+
43
+ Mit Hilfe des Programms simstb_gui können Sie digitalen und analogen Ein- und Ausgänge überwachen und die Eingänge setzen. Die Werte werden im Sekundentakt aktualisiert. Starten können Sie das Simulator GUI mit in der Kommandozeile mit `simstb_gui` oder `simstb_cli --gui`.
44
+
45
+ ### 2. Erstellung eigener Programme für die Simulationsumgebung SimSTB
46
+
47
+ Mit Hilfe der vier Funktionen:
48
+
49
+ - digEin
50
+ - digAus
51
+ - anaEin
52
+ - anaAus
53
+
54
+ können Sie eigene Python-Programme schreiben. Sie können deren Ausgaben mit der Simulationsumgebung überwachen und die Eingänge setzen.
55
+
56
+ Um die vier Funktionen zu nutzen, müssen Sie die Simulatorschnittstelle mit `import sim_schnittstelle.simulator as sim` importieren.
57
+
58
+ In der Datei __SimSTB-Benutzerdokumentation.pdf__ finden Sie eine ausführrliche Beschreibung. Ebenso finden Sie in der Dokumentation die Beispieldatei beispiel.py.
59
+
60
+ ## Dokumentation
61
+
62
+ | Dokument | Inhalt |
63
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
64
+ | README | Erster Überblick über das Projekt SimSTB; diese lesen Sie gerade |
65
+ | SimSTB-Benutzerdokumentation | Benutzerdokumentation; beschreibt wie Sie die Simulationsumgebung installieren und benutzen; wenn Sie die Simulationsumgebung nur nutzen und keine eigenen Änderungen vornehmen wollen, das einzige Dokument, was Sie lesen sollten. |
66
+ | beispiel.py | Beispielprogramm für den Umgang mit der Simulatorschnittstelle. |
67
+
68
+ ## Version
69
+
70
+ V 0.6.1
71
+
72
+ ## License
73
+
74
+ [MIT](LICENSE.txt) © [Markus Breuer].
@@ -0,0 +1,29 @@
1
+ # Konfigurationsdatei für den Simulator SimSTB
2
+ # alle Pfade ausgehend von der Umgebungsvariablen SIMSTB_WURZEL
3
+
4
+ # Log-Datei und Log-Level
5
+ LOGDATEI = "./simstb.log"
6
+ LOGLEVEL = "INFO"
7
+
8
+ # Namen und Position der Austauschdateien
9
+ ANAAUS = "data/anaaus.txt"
10
+ ANAEIN = "data/anaein.txt"
11
+ DIGAUS = "data/digaus.txt"
12
+ DIGEIN = "data/digein.txt"
13
+
14
+ # Anzahl der Kanäle
15
+ DIGMAXLAENGE = 16
16
+ ANAMAXLAENGE = 8
17
+
18
+ # GUI-Farben
19
+ AKTIVE_BACKGROUND = "#90EE90"
20
+ HAUPT_BACKGROUND = "#b7d7e8"
21
+ BLOCK_BACKGROUND = "#cfe0e8"
22
+
23
+ # Intervall in Sekunden für die Aktualisierung der Anzeige
24
+ INTERVALL = 1
25
+
26
+ # Signalformen für analogen Zufallgenerator
27
+ SIGNALFORMEN = ["Zufall", "Sinus", "Rechteck", "Dreieck"]
28
+
29
+ MODELL_DATEI = "./modelle.json"
@@ -0,0 +1,8 @@
1
+ 0
2
+ 0
3
+ 0
4
+ 0
5
+ 0
6
+ 0
7
+ 0
8
+ 0
@@ -0,0 +1,8 @@
1
+ 0,0
2
+ 0,0
3
+ 0,0
4
+ 0,0
5
+ 0,0
6
+ 0,0
7
+ 0,0
8
+ 0,0
@@ -0,0 +1,16 @@
1
+ 0
2
+ 0
3
+ 0
4
+ 0
5
+ 0
6
+ 0
7
+ 0
8
+ 0
9
+ 0
10
+ 0
11
+ 0
12
+ 0
13
+ 0
14
+ 0
15
+ 0
16
+ 0
@@ -0,0 +1,16 @@
1
+ 0
2
+ 0
3
+ 0
4
+ 0
5
+ 0
6
+ 0
7
+ 0
8
+ 0
9
+ 0
10
+ 0
11
+ 0
12
+ 0
13
+ 0
14
+ 0
15
+ 0
16
+ 0
@@ -0,0 +1,34 @@
1
+ """ SimSTB - Simulatorschnittstelle - Beispieldatei für die Nutzung der Schnittstelle
2
+ Das Modul Simulatorschnittstelle stellt vier Funktionen
3
+ zur Simulation digitaler und analoger Ein- und Ausgaben bereit
4
+ Name, Organisaion: Markus Breuer, STMB
5
+ Erstellt, Letzte Änderung: 21.06.2023, 05.03.2026
6
+ """
7
+
8
+ import time
9
+ import sim_schnittstelle.simulator as sim
10
+
11
+
12
+ def test():
13
+ """ Testfunktion """
14
+ ende = False
15
+ print("Beispielprogramm für Simulationsumgebung")
16
+ print("----------------------------------------")
17
+ print("Die am analogen Eingang Kanal 0 liegenden Eingangssignale")
18
+ print("werden im Sekundentakt eingelesen. Beendet wird das Einlesen,")
19
+ print("sobald am digitalen Eingang Kanal 0 eine 1 anliegt.")
20
+ print("Am Ende werden noch ein digitales und analoges Ausgabesignal gesetzt.")
21
+
22
+ while ende is not True:
23
+ wert = sim.ana_ein(0) # Einlesen eines analogen Eingabesignals über Kanal 0
24
+ print(wert)
25
+ time.sleep(1)
26
+ ende = sim.dig_ein(0) # Einlesen eines digitalen Eingabesignals über Kanal 0
27
+
28
+ sim.dig_aus(15, 1) # Ausgabe eines digitalen Ausgabesignals über Kanal 15
29
+ sim.ana_aus(7, -123.456) # Ausgabe eines analogen Ausgabesignals über Kanal 7
30
+
31
+ print("Beispielprogramm beendet")
32
+
33
+
34
+ test()
@@ -0,0 +1,13 @@
1
+ [
2
+ {
3
+ "nr": 1,
4
+ "name": "Modell 1 - LED Streifen",
5
+ "exe": "simstb_modell_1.exe"
6
+ },
7
+ {
8
+ "nr": 2,
9
+ "name": "Modell 2 - Fließband (in Arbeit)",
10
+ "exe": "simstb_modell_2.exe"
11
+ }
12
+
13
+ ]
@@ -0,0 +1,70 @@
1
+ """ SimSTB - Dateizugriff auf Austauschdateien
2
+ Das Modul Dateizugriff stellt zwei Funktionen zum Lesen und Schreiben der Austauschdateien
3
+ zur Verfügung. Die Datenübergabe erfolgt jeweils als Liste.
4
+ Name, Organisaion: Markus Breuer, STMB
5
+ Erstellt, Letzte Änderung: 28.07.2021, 15.03.2026
6
+ """
7
+
8
+ import filelock
9
+ import logging
10
+ import sim_basis.simstb_konfig as kfg
11
+ from pathlib import Path
12
+
13
+ class DateiZugriff:
14
+ """Klasse zum Zugriff auf die Austauschdateien"""
15
+
16
+ def __init__(self, dateiname, max_laenge):
17
+ """Konstruktor des Datenzugriffs auf die Austauschdateien"""
18
+ self.logger = logging.getLogger(__name__)
19
+ self.dateiname = dateiname
20
+ self.max_laenge = max_laenge
21
+ konfigkonfigmanager = kfg.Konfig()
22
+ self.konfig = konfigkonfigmanager.konfiguration_bereitstellen()
23
+ if dateiname in [self.konfig["DIGEIN"], self.konfig["DIGAUS"]]:
24
+ self.reset_daten = ["0"] * self.max_laenge
25
+ else:
26
+ self.reset_daten = ["0.0"] * self.max_laenge
27
+
28
+ def lesen_alle(self):
29
+ """Zeilenweises einlesen der Daten und Rückgabe als Liste"""
30
+ try:
31
+ daten = []
32
+ # Erstelle ein FileLock-Objekt
33
+ lock_path = str(Path(self.dateiname).with_suffix(".lock"))
34
+ lock = filelock.FileLock(lock_path)
35
+ # Versuche, die Datei zu sperren und darauf zuzugreifen
36
+ with lock:
37
+ with open(self.dateiname, "r", encoding="utf8") as eingabedatei:
38
+ for zeile in eingabedatei:
39
+ zeile = zeile.replace(",", ".") # deutsches Komma in Austauschdatei
40
+ zeile = zeile.rstrip("\n")
41
+ daten = daten + [zeile]
42
+ # Prüfen, ob die Anzahl der Daten stimmt
43
+ if len(daten) != self.max_laenge:
44
+ self.logger.error(
45
+ f"Dateizugriff lesen_alle 1 - Falsche Anzahl an Daten: Datei {self.dateiname}, gelesen: {len(daten)}, erwartet: {self.max_laenge} -> alles auf 0 gesetzt"
46
+ )
47
+ self.schreiben_alle(self.reset_daten)
48
+ daten = self.reset_daten
49
+ except:
50
+ # Fehler beim Lesen der Datei
51
+ self.logger.error(f"Dateizugriff lesen_alle 2 - Allgemeine Exception: Datei {self.dateiname} -> alles auf 0 gesetzt")
52
+ self.schreiben_alle(self.reset_daten)
53
+ daten = self.reset_daten
54
+
55
+ return daten
56
+
57
+ def schreiben_alle(self, daten):
58
+ """Komplettes zurückschreiben aller Daten einer Austauschdatei"""
59
+ # Erstelle ein FileLock-Objekt
60
+ lock_path = str(Path(self.dateiname).with_suffix(".lock"))
61
+ lock = filelock.FileLock(lock_path)
62
+ with lock:
63
+ try:
64
+ with open(self.dateiname, "w", encoding="utf8") as ausgabedatei:
65
+ for wert in daten:
66
+ zeile = str(wert) + "\n"
67
+ zeile = zeile.replace(".", ",") # deutsches Komma in Austauschdatei
68
+ ausgabedatei.write(zeile)
69
+ except:
70
+ self.logger.error(f"Dateizugriff schreiben_alle - Allgemeine Exception: Datei {self.dateiname} -> alles auf 0 gesetzt")
@@ -0,0 +1,57 @@
1
+ """simstb_konfig.py - SimSTB - Konfigurationsdaten
2
+ Das Modul Konfiguration stellt zentrale Konfigurationsdaten, wie z.B.
3
+ Längen, Dateinamen inkl. Pfad oder Signalformen zur Verfügung.
4
+ Name, Organisaion: Markus Breuer, STMB
5
+ Erstellt, Letzte Änderung: 28.07.2021, 20.03.2026
6
+ """
7
+
8
+ from pathlib import Path
9
+ import os
10
+ import sys
11
+ import toml
12
+ import threading
13
+
14
+ # Default name for the configuration file
15
+ KONFIG_DATEINAME = "config.toml"
16
+
17
+
18
+ class Konfig:
19
+ """Klasse mit zentralen Konfigurationsdaten"""
20
+
21
+ _konfig = None # Klassenvariable für die Konfiguration
22
+ _lock = threading.Lock() # Sperre für thread-sichere Zugriffe
23
+
24
+ def __init__(self, konfig_dateiname=KONFIG_DATEINAME):
25
+ """Konstruktor der Klasse"""
26
+ with Konfig._lock:
27
+ if Konfig._konfig is None: # Nur laden, wenn noch nicht geladen
28
+ self.konfig_dateiname = konfig_dateiname
29
+ if "SIMSTB_CONFIG_FILE" in os.environ:
30
+ # Overwrite default value with environment value
31
+ self.konfig_dateiname = Path(os.environ["SIMSTB_CONFIG_FILE"])
32
+ # Absoluten Pfad zur Konfigurationsdatei ermitteln
33
+ try:
34
+ basisverzeichnis = Path(os.getenv("SIMSTB_WURZEL"))
35
+ except Exception as e:
36
+ print("Umgebungsvariable SIMSTB_WURZEL nichtgesetzt -> Bitte Umgebungsvariable SIMSTB_WURZEL setzen -> Programmabbruch")
37
+ sys.exit(1)
38
+ self.konfig_dateiname = basisverzeichnis / self.konfig_dateiname
39
+ # Konfigurationsdaten aus der TOML-Datei laden
40
+ try:
41
+ Konfig._konfig = toml.load(self.konfig_dateiname)
42
+ except Exception as e:
43
+ msg = f"Fehler beim Laden der Konfigurationsdatei:{self.konfig_dateiname}"
44
+ raise FileNotFoundError(msg) from e
45
+ # Relative Pfade durch absolute Pfade ersetzen
46
+ schluesselliste = ["LOGDATEI", "MODELL_DATEI", "ANAAUS", "ANAEIN", "DIGAUS", "DIGEIN"]
47
+ basisverzeichnis = Path(os.getenv("SIMSTB_WURZEL"))
48
+ for schluessel in schluesselliste:
49
+ if schluessel in Konfig._konfig:
50
+ Konfig._konfig[schluessel] = str(basisverzeichnis / Konfig._konfig[schluessel])
51
+ # Konfiguration ergänzen
52
+ Konfig._konfig["BASISVERZEICHNIS"] = str(basisverzeichnis)
53
+ Konfig._konfig["KONFIG_DATEINAME"] = str(self.konfig_dateiname)
54
+
55
+ def konfiguration_bereitstellen(self):
56
+ """Stellt die Konfigurationsdaten bereit"""
57
+ return Konfig._konfig
@@ -0,0 +1,33 @@
1
+ """ SimSTB - Logger
2
+ Das Modul Logger stellt eine Funktion zur Speicherung von Log-Informationen bereit.
3
+ Name, Organisaion: Markus Breuer, STMB
4
+ Erstellt, Letzte Änderung: 10.01.2025, 20.03.2026
5
+ """
6
+
7
+ import sim_basis.simstb_konfig as kfg
8
+ import logging
9
+ import threading
10
+
11
+ _logging_lock = threading.Lock()
12
+ _logging_initialisiert = False
13
+
14
+ def logging_einrichten():
15
+ """Richtet die Logging-Konfiguration ein"""
16
+ global _logging_initialisiert
17
+ with _logging_lock:
18
+ if not _logging_initialisiert:
19
+ konfigmanager = kfg.Konfig()
20
+ konfig = konfigmanager.konfiguration_bereitstellen()
21
+ logdateiname = konfig["LOGDATEI"]
22
+ loglevel = konfig.get("LOGLEVEL", "INFO").upper()
23
+ logging.basicConfig(filename=logdateiname, level=loglevel,
24
+ format="%(asctime)s [PID:%(process)d] [TID:%(thread)d] [%(levelname)s] %(name)s: %(message)s",
25
+ datefmt="%d.%m.%Y %H:%M:%S"
26
+ )
27
+ # Gezielt die Logger von benutzter Drittsoftware ausschalten
28
+ logging.getLogger("filelock").setLevel(logging.CRITICAL)
29
+ logging.getLogger("tkinter").setLevel(logging.CRITICAL)
30
+ # Log-Informationen über Initialisieren des Loggings
31
+ logger = logging.getLogger(__name__)
32
+ logger.info("Logging initialisiert (Logdatei: %s, Loglevel: %s)", logdateiname, loglevel)
33
+ _logging_initialisiert = True
sim_basis/version.py ADDED
@@ -0,0 +1,3 @@
1
+ # Build Data, automatisch generiert, nicht manuell ändern!
2
+ SIMSTB_VERSION='0.6.0a1'
3
+ SIMSTB_VERSION_DATE='22.03.2026'
File without changes
@@ -0,0 +1,93 @@
1
+ """ SimSTB - Simulatorschnittstelle
2
+ Das Modul Simulatorschnittstelle stellt vier Funktionen
3
+ zur Simulation digitaler und analoger Ein- und Ausgaben bereit
4
+ Name, Organisaion: Markus Breuer, STMB
5
+ Erstellt, Letzte Änderung: 20.06.2023, 22.03.2026
6
+ """
7
+
8
+ import logging
9
+ import sim_basis.simstb_logger as log
10
+ import sim_basis.simstb_konfig as kfg
11
+ import sim_basis.simstb_dateizugriff as dzg
12
+
13
+
14
+ # Logger-Objekt auf Modulebene, damit es in allen Funktionen genutzt werden kann
15
+ logger = None
16
+ def logging_lokal_einrichten():
17
+ """Richtet die Logging-Konfiguration ein und gibt einen Logger zurück"""
18
+ global logger
19
+ if logger is None:
20
+ log.logging_einrichten()
21
+ logger = logging.getLogger(__name__)
22
+ logger.info("Simulatorschnittstelle - Neuer Zugriff auf Simulatorschnittstelle über Simulatorschnittstelle")
23
+
24
+ def dig_ein( id):
25
+ """Schnittstellenfunktion und digitalen Eingang zu lesen """
26
+ # Logging initialisieren und Log-Message rausschreiben
27
+ logging_lokal_einrichten()
28
+ logger.debug("dig_ein - Aufruf mit id: %d", id)
29
+ konfigkonfigmanager = kfg.Konfig()
30
+ konfig = konfigkonfigmanager.konfiguration_bereitstellen()
31
+ zugriff = dzg.DateiZugriff(konfig["DIGEIN"], konfig["DIGMAXLAENGE"])
32
+ daten = zugriff.lesen_alle()
33
+ # Prüfen, ob Index korrekt war und Antwort setzen
34
+ if id >= len(daten) or len(daten) != konfig["DIGMAXLAENGE"]:
35
+ logger.error(
36
+ f"Simulatorschnittstelle dig_ein - Indexproblem: Zugriffsindex: {id}, Feldlänge: {len(daten)}, Dateilänge: {konfig['DIGMAXLAENGE']} -> None zurückgeliefert"
37
+ )
38
+ wert = None
39
+ else:
40
+ wert = bool(int(daten[ id]))
41
+ return wert
42
+
43
+ def dig_aus( id, wert):
44
+ """Schnittstellenfunktion und digitalen Ausgang zu setzen """
45
+ logging_lokal_einrichten()
46
+ logger.debug("dig_aus - Aufruf mit id: %d, wert: %d", id, wert)
47
+ konfigkonfigmanager = kfg.Konfig()
48
+ konfig = konfigkonfigmanager.konfiguration_bereitstellen()
49
+ zugriff = dzg.DateiZugriff(konfig["DIGAUS"], konfig["DIGMAXLAENGE"])
50
+ daten = zugriff.lesen_alle()
51
+ # Prüfen, ob Index korrekt war
52
+ if id >= len(daten) or len(daten) != konfig["DIGMAXLAENGE"]:
53
+ logger.error(
54
+ f"Simulatorschnittstelle dig_aus - Indexproblem: Zugriffsindex: {id}, Feldlänge: {len(daten)}, Dateilänge: {konfig['DIGMAXLAENGE']}"
55
+ )
56
+ return
57
+ daten[ id] = str(int(wert))
58
+ zugriff.schreiben_alle(daten)
59
+
60
+ def ana_ein( id):
61
+ """Schnittstellenfunktion und analogen Eingang zu lesen """
62
+ logging_lokal_einrichten()
63
+ logger.debug("ana_ein - Aufruf mit id: %d", id)
64
+ konfigkonfigmanager = kfg.Konfig()
65
+ konfig = konfigkonfigmanager.konfiguration_bereitstellen()
66
+ zugriff = dzg.DateiZugriff(konfig["ANAEIN"], konfig["ANAMAXLAENGE"])
67
+ daten = zugriff.lesen_alle()
68
+ # Prüfen, ob Index korrekt war und Antwort setzen
69
+ if id >= len(daten) or len(daten) != konfig["ANAMAXLAENGE"]:
70
+ logger.error(
71
+ f"Simulatorschnittstelle ana_ein - Indexproblem: Zugriffsindex: {id}, Feldlänge: {len(daten)}, Dateilänge: {konfig['ANAMAXLAENGE']} -> None zurückgeliefert"
72
+ )
73
+ wert = None
74
+ else:
75
+ wert = float(daten[ id])
76
+ return wert
77
+
78
+ def ana_aus( id, wert):
79
+ """Schnittstellenfunktion und analogen Ausgang zu setzen """
80
+ logging_lokal_einrichten()
81
+ logger.debug("ana_aus - Aufruf mit id: %d, wert: %f", id, wert)
82
+ konfigkonfigmanager = kfg.Konfig()
83
+ konfig = konfigkonfigmanager.konfiguration_bereitstellen()
84
+ zugriff = dzg.DateiZugriff(konfig["ANAAUS"], konfig["ANAMAXLAENGE"])
85
+ daten = zugriff.lesen_alle()
86
+ # Prüfen, ob Index korrekt war und Antwort setzen
87
+ if id >= len(daten) or len(daten) != konfig["ANAMAXLAENGE"]:
88
+ logger.error(
89
+ f"Simulatorschnittstelle ana_aus - Indexproblem: Zugriffsindex: {id}, Feldlänge: {len(daten)}, Dateilänge: {konfig['ANAMAXLAENGE']}"
90
+ )
91
+ return
92
+ daten[ id] = str(float(wert))
93
+ zugriff.schreiben_alle(daten)
File without changes
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,75 @@
1
+ """ simstb_cli.py - CLI-Werkzeug für Projekt SimSTB
2
+ Name, Organisaion: Markus Breuer, STMB
3
+ Erstellt, Letzte Änderung: 17.03.2026, 22.03.2026
4
+ """
5
+
6
+
7
+ from pathlib import Path
8
+ import os
9
+ import sys
10
+ import argparse
11
+ import sim_basis.version as ver
12
+ import sim_basis.simstb_konfig as kfg
13
+ import sim_werkzeuge.simstb_gui as gui
14
+ import sim_werkzeuge.simstb_init as init
15
+
16
+ def main():
17
+ parser = argparse.ArgumentParser(description="CLI-Werkeug für Projekt SimSTB")
18
+ parser.add_argument(
19
+ "--version",
20
+ action="store_true",
21
+ help="Zeigt die aktuelle Version an."
22
+ )
23
+ parser.add_argument(
24
+ "--hilfe",
25
+ action="store_true",
26
+ help="Zeigt diese Hilfe an."
27
+ )
28
+ parser.add_argument(
29
+ "--show-config",
30
+ action="store_true",
31
+ help="Zeigt die aktuelle Konfiguration an."
32
+ )
33
+ parser.add_argument(
34
+ "--init",
35
+ action="store_true",
36
+ help="Initialisiert die Laufzeitumgebung."
37
+ )
38
+ parser.add_argument(
39
+ "--gui",
40
+ action="store_true",
41
+ help="Startet das GUI-Programm."
42
+ )
43
+
44
+ args = parser.parse_args()
45
+
46
+ if args.version:
47
+ print(f"Version: {ver.SIMSTB_VERSION} (Stand: {ver.SIMSTB_VERSION_DATE})")
48
+ elif args.hilfe:
49
+ parser.print_help()
50
+ elif args.show_config:
51
+ show_config()
52
+ elif args.init:
53
+ init.init_runtime()
54
+ elif args.gui:
55
+ print("GUI starten ...")
56
+ gui.main()
57
+ else:
58
+ parser.print_help()
59
+
60
+ def show_config():
61
+ try:
62
+ basisverzeichnis = Path(os.getenv("SIMSTB_WURZEL"))
63
+ print(f"\nUmgebungsvariable SIMSTB_WURZEL gesetzt: {basisverzeichnis}\n")
64
+ except Exception as e:
65
+ print("Umgebungsvariable SIMSTB_WURZEL nicht gesetzt -> Bitte Umgebungsvariable SIMSTB_WURZEL setzen -> Programmabbruch")
66
+ sys.exit(1)
67
+ konfigkonfigmanager = kfg.Konfig()
68
+ konfig = konfigkonfigmanager.konfiguration_bereitstellen()
69
+ print("Aktuelle Konfiguration SimSTB (Pfade aufgelöst):\n")
70
+ for key, value in konfig.items():
71
+ print(f"{str(key):<20s} : {value}")
72
+ print("\n")
73
+
74
+ if __name__ == "__main__":
75
+ main()