Eigenheim mit Java und Beckhoff

sirpacman

Mitglied
Hallo liebe Java Programmierer

Ich bin gelernter Steuerungstechniker und mach dies auch schon über 10 Jahre. Ich meinem Haus läuft eine Beckhoff SPS, welche mein gesamtes Haus inkl. der Zentralheizung steuert. Die Software kommt natürlich von mir. Ich würde jetzt gerne einige Funktionen, welche nicht Echtzeitfähig sind in Java umsetzten. Ich bin in Java natürlich noch ein Anfänger, da ich erst seit ca. 1 Jahr ab und zu in meiner Freizeit kleine Lösungen in Java umsetzte. Keine Angst ich hab schon gegoogelt und ich will auch keinen Code von euch geschrieben haben. Es würde mich schon reichen, wenn man einen Tipp gibt welche Möglichkeiten es in Java gibt um folgende Probleme zu lösen.


Wie gesagt das Hauptprogramm läuft in meiner SPS und das ist gut so, weil das Echtzeitfähig sein muss. Was ich jetzt gerne machen würde ist eine Prozessdatenerfassung. Von allen meinen Sensoren Wetterstation, PT1000´s in der Zentralheizung PT1000 von der Solaranlage, Temperatur der einzelnen Räume usw. Des weiteren würde ich gerne eine Visualiesierung über mein Android Tablet machen.
Die einzelnen Gewerke Funktionieren ja auch.

Ich hab mir das so vorgestellt, das ich einen eigenen Thread mache, welche meine Visualisierung managed/Kommunikation zu meine Android-App macht. Ein Android App mit der Kommunikation zu meinem Java-Server läuft natürlich nur sehr primitiv und das Apps ist "hässlich" aber es läuft :)

Einen weiteren Thread hab ich gemacht, welcher mir Zyklisch die Prozessdaten in eine SQL Datenbank schreibt. Auch dieser Thread läuft rudimentär. Aber er läuft.

Die Kommunikation mit meiner SPS, das heißt mit den Variablen in der SPS läuft auch. Das läuft im Gegensatz zu den 2 anderen Sachen gut, da das mehr meine Welt ist.

So mein Problem ist jetzt, wie realisiere ich das schön in Java. In der Steuerungstechnik würde ich jetzt Globale Variablen machen, welche vom Thread mit den SPS Variablen gespeist bzw. gelesen wird und alle anderen Threads oder Funktionen könnten diese Variablen lesen oder schreiben.

Mein "wichtigster" Thread ist ja der, der mit der SPS kommuniziert. Das heißt hier lese ich zyklisch Daten aus. Diese Daten sollten aber von den anderen 2 Prozessen ja verwenden werden können. Und speziell der Thread mit dem Java-Server muss natürlich die Daten welchen von der VISU kommen auch in den Thread zu der SPS Kommunikation bekommen, da ich dann mit diesen Informationen wieder Variablen in der SPS schreiben, damit ich von der VISU aus auch Lichter, Jalousien usw. schalten kann.

Ist es überhaupt der richtige Weg alles in einen eigenen Thread zu machen oder gibt es da besseres??? Wenn ja, wie mach ich das mit dem Informationsausstausch. Über eine "globale" Datenbank oder doch über eine Interthread-Kommunikation (hab ich auch schon mal programmiert, scheint aber für mich nicht das richtige zu sein).

Ich wäre froh um jeden Input, damit ich nicht weiter "sinnlos" im Internet suchen muss.
 

Times

Bekanntes Mitglied
Guten Tag,

auf der Arbeit arbeiten wir auch bei einigen Kunden mit alten Geazent-Systemen sowie Siemens SPS'en, habe also auch ein wenig Erfahrung in diesem Bereich.

Also die Idee mit den Threads würde ich schon beibehalten, da zB deine SPS Kommunikation auch weiterlaufen muss wenn die Datenbank auch nur für 5 Sekunden rumzickt und daher die Verbindung kurzzeitig abbricht!

Threads (wie auch von dir beschrieben):
  1. T1: Kommunikation Server <-> SPS
  2. T2: Kommunikation Server <-> Tablet/Smartphone ...
  3. T3: Kommunikation Server <-> Datenbank | Interne Arbeiten!

Wie du bereits gesagt hast gibt es mehrere Wege um die ganzen Threads nun miteinander kommunizieren zu lassen, aber der einzig wahre Grund warum eine Kommunikation auf direktem Wege zwischen Tablet/Smartphone (T2) und SPS (T1) vorhanden sein müsste, wäre um Schaltbefehle möglichst schnell an die SPS weiterzugeben, aber auch NUR dann wenn diese von der VISU kommen, alles andere würde ja eh über die Datenbank laufen oder ist das bei dir anders?
Wenn man zB auf die Lampe in der VISU drückt, sollte sie ausgehen o.ä.


Aus diesem Grund empfehle ich dir dabei folgendes Kommunikationsmodell:
  • T1 kennt T3 (SPS <-> Datenbank)
  • T2 kennt T3 (Tablet/Smartphone Server <-> Datenbank)
Die Aufgaben der einzelnen Threads würden wie folgt aussehen:

T1: Kommunikation SPS
Kommunikation mit SPS. Empfangende Daten an den Datenbankthread weiterreichen.
Schaltbefehle vom Datenbankthread abholen, falls vorhanden, und an die SPS senden.

T2: Kommunkation Tablet/Smartphone
Kommunikation mit diversen (n vielen) Clients. Schaltbefehle werden für die Speicherung in die Datenbank an den Datenbankthread weitergereicht. VISU-Daten vom Datenbankthread abholen, anfragen.

T3: Kommunikation Datenbank / Interne Arbeiten
In diesem Thread läuft das meiste ab. Diesem Thread ist alles was um ihm rum passiert egal, er macht nur das was IHN interessiert, andere können es sich abholen wenn sie möchten!
  • OPTIONAL: Abspeichern von Schaltbefehlen in die Datenbank (Eine Liste wird von außen befüllt und mit jedem Thread-Durchlauf entleert - sprich in die Datenbank abgespeichert)
    Grund Optional: Da der SPS Thread diesen kennt, können die Befehle aber auch solange in der Liste drin bleiben, bis der SPS Thread sich diese abholt.
  • Datenspeicherung: Jede andere Klasse die diesen Thread kennt kann alle möglichen zu speichernden Daten an diesen Thread übergeben (Entweder direkt SQL-Statements oder Rohdaten die von dem Thread dann selber noch behandelt / formatiert werden). Diese werden auch ersteinmal wieder in einer Liste abgespeichert und erst beim Threaddurchlauf abgearbeitet.
  • Bereitstellung von Schaltbefehlen: Entweder durch Datenbankabfrage oder durch den oben genannten Punkt (Sprich Weitergabe von Informationen).
  • Bereitstellung von VISU-Informationen: VISU-Bild wird angefordert und wie gehabt wieder in einer Liste abgespeichert (Du hast ja bestimmt interne ID's für verschiedene VISU-Bilder). Anhand dieser ID's ermittelst du dir alle Datenpunkte und speicherst sie auch ersteinmal in deinem Thread ab. Der VISU-Thread kann sich diese dann zu einem Zeitpunkt seiner Wahl abholen.
    ACHTUNG: Wenn deine VISU-Bilder viele Datenpunkte haben, würde es sich lohnen bei der ersten Anfrage alle Daten, und danach nurnoch die Änderungen zu speichern!

Programmierung

Der wichtigste Bestandteil ist natürlich der SPS-Thread aber der Datenbank-Thread hat eine höhere Form erreicht (Verwirrend..?!).
Das erste was du also erstellen musst ist ein Objekt vom Datenbankthread, und folglich die beiden anderen Thread mit dem Übergabeparamter "Datenbankthread", welcher in den beiden anderen Threads als Attribut mit gespeichert wird.


Hoffe habe dein Anliegen richtig verstanden :)
Falls weiter Hilfe gewünscht ist, bitte nachfragen.

Grüße
Times
 

sirpacman

Mitglied
Hallo

Viele dank für die Antwort. Dann war ich ja vom Prinzip her mal nicht total daneben :). Bei der VISU hätte ich das so gemacht, das ich einfach ein Objekt über eine Socket-Verbindung schicke. Dort sind alle Informationen enthalten, welche ich für die VISU auf den Tablet/Smartphone brauche. Wir reden hier ja nicht von extrem vielen Daten. Wenn hier ein paar hundert Bytes zusammen kommen, welche ich zyklisch senden muss (z.B alle 500ms oder nur jede Sekunde) ist alles bei einander. Die Daten von der VISU würde ich über die selbe Socket-Verbindung schicken, aber natürlich nur bei jeder Änderung.

Wie soll ich am besten die Kommunikation zwischen den Threads machen?? Über eine Pipe mit PipeInput und PipeOutput oder wie meinst du das sonst???


mfg

Matthias
 

Thallius

Top Contributor
Hallo liebe Java Programmierer

So mein Problem ist jetzt, wie realisiere ich das schön in Java. In der Steuerungstechnik würde ich jetzt Globale Variablen machen, welche vom Thread mit den SPS Variablen gespeist bzw. gelesen wird und alle anderen Threads oder Funktionen könnten diese Variablen lesen oder schreiben.

Ich wäre froh um jeden Input, damit ich nicht weiter "sinnlos" im Internet suchen muss.

Hm, das ist jetzt aber nicht wirklich Dein Ernst, dass Du Interprozess-Kommunikation über globale Variablen machst, wo dann auch noch mehrere Prozesse diese schreiben können oder?

Für sowas wurden Messages oder Notifications erfunden und das nicht nur in Java sondern auch in jeder anderen Programmiersprache...

Gruß

Claus
 

sirpacman

Mitglied
Eine SPS läuft im Prinzip immer in Echtzeit. Das hat verschiedene Gründe gerade wenn man Software für Maschinen programmiert, die sehr schnelle Bewegungen machen und man dann noch sehr genau Positionieren muss ist das wichtig. Auch bei der Haussteuerung hat es Gründe z.B die automatische Abbrandsteuerung welche über verschiedene Regler in der SPS Software gesteuert wird. Die Buskomopnenten. Bei einer SPS ist es leider nur teilweiße so, das sich das Betriebsystem um die Kommunikation kümmert. Ich hab gewisse Bussystem, bei denen meine Software das ganze Managemend übernehmen muss. Wenn da zulange Zykluszeiten entstehen, gibt es Störungen und Fehler, usw.


Eben ist es nicht mein Ernst das über Globale Variablen zu machen. Ich will ja die Vorteile von Java ausnützen, vielleicht hab ich das zu wenig kommuniziert. Aber leider ist es so das es nicht in jeder Programmiersprache solche schönen Sachen wie Messages und Notifications hat. Bei einer SPS gibt es das definitiv nicht. Das sind keine objektorientierte Sprachen, sonder rein funktionelle. Beckhoff ist gerade dabei, die neue SPS Generation aufzubauen und dort hab ich das erste mal auch die Möglichkeit objektorientiert zu arbeiten. Bei meiner leider noch nicht.
 

Thallius

Top Contributor
Hm nurmal so am Rande. Ich programmiere schon seit über 30 Jahren und ich habe schon an Betriebssystemen für einige Hardware mitgearbeitet. Und es ist nun wirklich kein Hexenwerk eine Message-Queue aufzusetzen und via Messages zu kommunizieren. Das ist dann immer noch Echtzeit und hat keine Wartezyklen. Mit mehreren Tasks auf eine Variable zu schreiben dafür brauchst du dann eine Semaphore und die ist nicht weniger aufwendig. Ohne Semaphore so etwas zu machen ist Harakiri und führt über kurz oder lang zu 99% zu Concurrency Problemen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
theJavaMaschine Mitstreiter gesucht: Gemeinsam Java und Android Development lernen! Allgemeine Java-Themen 5
PARAS Karriereberatung benötigt: Wie kann ich ein Java Full Stack Entwickler werden? Allgemeine Java-Themen 7
P Java Access Bridge Allgemeine Java-Themen 5
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 1
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 6
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
O Newton Algorithmus Java Allgemeine Java-Themen 1
P Java Quellen finden Allgemeine Java-Themen 3
M Java Analyse/ SWOT-Analyse Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben