Struktureller Modulaufbau für die Modbus-Kommunikation im Thread
Verfasst: Donnerstag 14. September 2023, 14:49
Guten Tag,
ich möchte gerne Controller über ModusTCP steuern. Die Steuerung der Controller ist Teil eines größeren Projektes und soll daher ausgelagert in einem Modul erfolgen.
Es handelt sich um insgesamt 6 Controller. Von den Controllern sollen im 5 Sekundentakt ca. 10 Messwerte (je 4 Register) ausgelesen und im Minutentakt 1 Steuerbefehl gesendet werden.
So als grobe Schätzung über den anfallenden Datenaustausch.
Da die Ansteuerung der Controller nur ein Teil des Projekt ist, welches nicht durch andere Programmabläufe gestört oder verzögert werden soll, soll die Kommunikation in einem eigenen Thread laufen.
Da ich an dem Projekt nicht alleine arbeite, soll das Modul benutzerfreundlich programmiert werden. Ich habe dabei an einzelne Funktionen für jedes Register gedacht, welche mit einem Doc-String Hinweise liefert, um was für ein Register es sich handelt, wie der Rückgabe Wert zu interpretieren ist oder wie der zuschreibende Wert auszusehen hat.
Ich habe noch keine Erfahrungen mit so großen Projekten und bin mir bei dem Programmaufbau unsicher.
Mein Ansätze sind:
Threading Events
Ich erstelle einen Thread, welche dauerhaft läuft und erstelle einzelne Funktionen, welche nur das jeweilige Event setzt.
Für die einzelnen Funktionen könnte ich dann DocStrings mit Funktionen erstellen und müsste mir auch keine Gedanken machen, über die Zugriffe von verschieden Threads auf die unterschiedlichen Controller.
Das Problem wäre dabei, dass der Thread dauerhaft in der Schleife laufen würde, obwohl er nur alle 5 Sekunden, bzw bei einem Sterungsbefehl laufen müsste.
Zudem werden viele Events benötigt, da ich keine Übergabewerte bei den Events übergeben kann. Vielleicht könnte man das Problem über die Queue oder durch auslesen mehrerer Register gleichzeitig verringern.
Mehrere Threads
Die andere Idee, wäre für jede Aufgabe (das zyklische Auslesen und Steuerbefehle) einen neuen Thread zu starten. Somit würde ich für jeden Zyklus einen Thread starten, welcher einmal alle Daten einsammelt. Und falls eine Steuerbefehl kommt, für diesen einen zusätzliche Thread erstellen, würde dann über einen Lock, das zeitgleiche zugreifen verhindern.
Hierbei sehe ich die hohe Anzahl an Threads problematisch. Ich würde die Threads im Modul erstellen lassen, um den Modulnutzer zu entlasten, jedoch verliert man so schnell den Überblick über die Anzahl der verschiedene Threads. Des Weitern ist es hier schwieriger die Benutzerfreundlichkeit zu gewährleisten. Denn desto mehr Daten aufeinmal ausgelsen werden (führt zu einer kleineren Anzahl an benötigten Threads) desto unübersichtlicher wird es für den Benutzer/ wird der DocString komplizierter.
Ich bin mit beiden Varianten nicht zufrieden.
Habt Ihr Vorschläge, wie man das Modul am besten aufbaut?
Vielen Dank!
ich möchte gerne Controller über ModusTCP steuern. Die Steuerung der Controller ist Teil eines größeren Projektes und soll daher ausgelagert in einem Modul erfolgen.
Es handelt sich um insgesamt 6 Controller. Von den Controllern sollen im 5 Sekundentakt ca. 10 Messwerte (je 4 Register) ausgelesen und im Minutentakt 1 Steuerbefehl gesendet werden.
So als grobe Schätzung über den anfallenden Datenaustausch.
Da die Ansteuerung der Controller nur ein Teil des Projekt ist, welches nicht durch andere Programmabläufe gestört oder verzögert werden soll, soll die Kommunikation in einem eigenen Thread laufen.
Da ich an dem Projekt nicht alleine arbeite, soll das Modul benutzerfreundlich programmiert werden. Ich habe dabei an einzelne Funktionen für jedes Register gedacht, welche mit einem Doc-String Hinweise liefert, um was für ein Register es sich handelt, wie der Rückgabe Wert zu interpretieren ist oder wie der zuschreibende Wert auszusehen hat.
Ich habe noch keine Erfahrungen mit so großen Projekten und bin mir bei dem Programmaufbau unsicher.
Mein Ansätze sind:
Threading Events
Ich erstelle einen Thread, welche dauerhaft läuft und erstelle einzelne Funktionen, welche nur das jeweilige Event setzt.
Für die einzelnen Funktionen könnte ich dann DocStrings mit Funktionen erstellen und müsste mir auch keine Gedanken machen, über die Zugriffe von verschieden Threads auf die unterschiedlichen Controller.
Das Problem wäre dabei, dass der Thread dauerhaft in der Schleife laufen würde, obwohl er nur alle 5 Sekunden, bzw bei einem Sterungsbefehl laufen müsste.
Zudem werden viele Events benötigt, da ich keine Übergabewerte bei den Events übergeben kann. Vielleicht könnte man das Problem über die Queue oder durch auslesen mehrerer Register gleichzeitig verringern.
Mehrere Threads
Die andere Idee, wäre für jede Aufgabe (das zyklische Auslesen und Steuerbefehle) einen neuen Thread zu starten. Somit würde ich für jeden Zyklus einen Thread starten, welcher einmal alle Daten einsammelt. Und falls eine Steuerbefehl kommt, für diesen einen zusätzliche Thread erstellen, würde dann über einen Lock, das zeitgleiche zugreifen verhindern.
Hierbei sehe ich die hohe Anzahl an Threads problematisch. Ich würde die Threads im Modul erstellen lassen, um den Modulnutzer zu entlasten, jedoch verliert man so schnell den Überblick über die Anzahl der verschiedene Threads. Des Weitern ist es hier schwieriger die Benutzerfreundlichkeit zu gewährleisten. Denn desto mehr Daten aufeinmal ausgelsen werden (führt zu einer kleineren Anzahl an benötigten Threads) desto unübersichtlicher wird es für den Benutzer/ wird der DocString komplizierter.
Ich bin mit beiden Varianten nicht zufrieden.
Habt Ihr Vorschläge, wie man das Modul am besten aufbaut?
Vielen Dank!