Pārlūkot izejas kodu

Merge branch 'master' of https://gitlab.justprojects.de/master/smart-energy-monitor

Johannes Müller 2 gadi atpakaļ
vecāks
revīzija
3c3fb73ad1

+ 5 - 1
.gitignore

@@ -26,4 +26,8 @@ __pycache__/
 !/box-pc/python*/sitecustomize.py
 
 /hengli/
-/benton/
+/benton/
+
+/analyse/data/.local/
+
+*.RData

+ 6 - 0
00_Einleitung.md

@@ -0,0 +1,6 @@
+# Einleitung
+
+Es gibt viele gute Wege eine Messung durchzuführen, aber die darauffolgende Auswertung kann oft nur in nachhinein manuell durchgeführt werden. Dazu kommt zusätzlich, dass im industriellen Umfeld viele proprietäre Lösungen existieren, die aber noch weniger Flexibilität als DIY-Systeme bieten. Sie decken dabei auch häufig nicht vollständig die Anforderungen der Kunden ab.
+Das hier vorgestellte System arbeitet hingegen direkt mit der bereits im Unternehmen etablierten Hardware zusammen und ermöglicht, dank Verwendung offener Standards, eine leicht erweiterbare Datenaggregation und die Möglichkeit der direkten programmatischen Analyse der Messwerte.
+
+In Kooperation mit der Laempe Sinto Mössner GmbH wird mit dieser Arbeit ein Energie-Monitoring-System entwickelt, welches Einblicke in die Effizienz und Fehlerprävention der im Unternehmen hergestellten Kern-Schieß-Maschinen geben kann.

+ 10 - 0
10_Grundlagen.md

@@ -0,0 +1,10 @@
+# Grundlagen
+
+
+
+- Vorstellung Anwendungsfall
+  - Laempe Kernschießmaschienen
+- fehlende Energieerfassung
+- vorhandene Aufzeichnung von Anlagenzuständen in einer Datenbank
+  - Korrelation mit Leistungswerten
+  - Integration in den vorhandenen Aufbau

+ 31 - 0
20_Theorie.md

@@ -0,0 +1,31 @@
+# Theorie
+
+Mit dieser Arbeit werden diverse Konzepte zur Überwachung maschineller Anlagen erforscht. Dabei soll ein autonomes Meldesystem aufgebaut werden, welches auf schleichende Probleme aufmerksam machen kann bzw. zur Optimierung des Betriebsablaufes beiträgt. Um dies zu erreichen müssen Messwerte erhoben, analysiert und schließlich gespeichert werden. Diese Teilschritte sind in den folgenden Unterkapiteln näher aufgeführt.
+
+## Erfassung der Messwerte
+
+Die Aggregation der Messwerte soll unabhängig von Modell und Auslegung der Anlage möglich sein. Es werden verschiedene Wege in Betracht gezogen und schießlich einer von diesen an einer echten Anlage getestet. Die dafür notwendigen Komponenten sollten leicht in den bestehenden Aufbau integrierbar sein.
+
+Zunächst sollen die elektrische Versorgung, die Ströme einzelner Baugruppen und der Status der zentralen Steuerung der Anlage erfasst werden. Der Messintervall sollte klein genug sein, um zwischen den Prozessschritten der Anlage unterscheiden zu können. Bei den zu betrachtenden Kernschießanlagen ist ein Intervall unter 100ms ausreichend; jedoch sollte je nach Möglichkeit ein Interval von 20ms angestrebt werden. 
+
+Während der Entwicklung ist es auch sinnvoll die Rohwerte der Messungen zu sichern, um den Analyseschritt mit Hilfe von echten Messwerten exemplarisch zu testen.
+
+## Datenverarbeitung
+
+Bei der Erhebung der Messwerte entstehen viele Datenpunkte, die keine große Aussagekraft besitzen. Der Schritt der Datenverarbeitung kombiniert die eingehenden Datenströme und extrahiert für den Endnutzer relvante Informationen. Die Verarbeitung soll auf einer PC-Platform stattfinden, so dass sie flexibel eingesetzt werden kann. Sie kann dadurch vor Ort, zum Beispiel auf einem industriellen Box-PC, oder auch über eine Netzwerkverbindung aus einem entfernten Ort durchgeführt werden. Aus sicherheitstechnischen Gründen darf die verwendete Platform nur über die erhobenen Messwerte verfügen und nicht in den ProzesDatenbildsablauf der Anlage eingreifen.
+
+In diesem Schritt werden zuerst die Verbrauchswerte wie Ströme und Spannungen mit dem Status der Anlagensteuerung kombiniert, so dass pro Prozessschritt ein wiederholbares Datenbild entsteht. Ein Prozessschritt ist ein zeitlich begrenzter Zustand der Anlage, in der eine bestimmte Gruppe von Aktoren aktiviert wird. Dies kann beispielsweise das Einfahren des Hubtisches sein. Die elektrischen Verbräuche während dieses Schrittes können so als Funktion der Schrittnummer und Zeit nach Beginn des Vorgangs dargestellt werden. Das Datenbild besteht dann im einfachsten Fall aus Versorgungsleistungen und Strömen der 24V-Kanäle. 
+
+Nun werden die Differenzen des Datenbildes zwischen dem Ausgangszustand und der Aktivierung eines Prozessschrittes berechnet. Dadurch können die Verbräuche der jeweiligen Prozessschritte von den Standbyströmen der inaktiven Komponenten der Anlage isoliert werden. Der Ausgangszustand sollte zeitlich nah am Messvorgang gesetzt sind, damit äußere Einflüsse wie Versorgungsspannung und Umgebungstemperatur einen geringeren Effekt auf die berechneten Differenzen haben.
+
+Anschließend werden je nach erwartetem zeitlichen Verlaufs des Datenbilds einige Aggregationen wie Durchschnitt, Maximum oder Varianz einzelner Kanäle erhoben, um schließlich einfache Kennzahlen für diesen Schritt zu erhalten. Damit können nun Aussagen wie `Das für den Hubtisch zuständige Ventil hat beim zweitausendsten Aktivieren einen Strom von 1,3A verbraucht` getroffen werden.
+
+## Datenspeicherung
+
+Je präziser die Datenverarbeitung angesetzt ist, desto weniger Daten müssen anschließend gespeichert werden. In allen Fällen sind die zu speichernden Werte periodische Kennzahlen der einzelnen Prozessschritte, welche in einer zeitbasierten Datenbank abgelegt werden müssen. Nur wenn eine Kennzahl ein festgelegtes Limit überschreitet ist eine direkte Meldung des Wertes notwendig. 
+
+Um eine zuverlässige Speicherung zu garantieren sollten die Daten möglichst auf mehreren unabhängigen Systemen gespeichert werden. Hierzu wird ein modularer Aufbau verwendet, der es auch ermöglicht unterschiedlichste Speichermethoden gleichzeitig zu verwenden. Schließlich ist auch eine Löschungsstategie notwendig, um zu garantieren, dass immer genug Speicherplatz für neue Daten vorhanden ist.
+
+## Visualisierung
+
+Die Visualisierung kann dank der vorbereiteten Datensätze im einfachsten Fall aus dem Plotten der Messreihen aus einer der Datenbanken bestehen. Je nach Bedarf kann die Visualisierung vor Ort am HMI der Anlagen erfolgen oder auch beispielsweise über einen Browser auf einem entfernten PC. Hier besteht kein großer Entwicklungsbedarf und es kann deswegen auch auf fertige universelle Visualisierungsoberflächen zurückgegriffen werden. 

+ 31 - 0
30_Implementierung.md

@@ -0,0 +1,31 @@
+# Implementierung
+
+## Wahl der Sensoren
+
+Zur Erfassung der Energiewerte kommen verschiedene Systeme in Frage. Alle diese Sensorsysteme müssen jedoch folgende Kriterien erfüllen:
+  - Eignung und Zertifizierung für industrielle Umgebungen
+  - Konvertierung in digitale Signale auf einem standardisierten Feldbus
+  - Feldbusanschluss ist in Laempe-Anlagen einsetzbar
+  - internationale Versorgungsspannungen werden unterstützt
+
+
+
+![Datenfluss](out/diagrams/datenfluss/Datenfluss.svg)
+
+- Untersuchung der Verfügbarkeit von Leistungssensoren mit Feldbusanschluss
+- Alternativen für Einspeisung
+  - Leistungstrennschalter mit Leistungserfassung über Modbus
+  - Stromzähler mit MBus
+  - Leistungsanalyse durch einen Energie-Monitor mit Netzwerkfähigkeit
+- Erweiterung durch zusätzliche Stromwandler
+
+- Alternativen für Kleinstspannungskreise
+  - Stromshunts mit ADC über IO-Link
+  - Netzteile mit Modbus
+  - elektronische Sicherungen mit IO-Link
+- Wahl der Sensoren
+  - Janitza Energie-Monitor mit OPC UA
+  - IFM elektronische Sicherung mit IO-Link
+- Testaufbau
+  - Energiemonitor, Feldbus, SPS, Netzwerk, IPC
+- Einbau in eine fertige Anlage

+ 0 - 0
40_Zusammenfassung.md


+ 33 - 12
README.md

@@ -1,4 +1,4 @@
-# Masterarbeit: Energiemonitoring zur Prozessanalyse in elektrischen Anlagen
+# Masterarbeit: Energiemonitoring zur Prozessanalyse in industriellen Anlagen am Beispiel von Kernschießmaschinen
 
 Es soll ein Energiemonitoringsystem für die Laempe Mössner Sinto GmbH entwickelt werden, das in möglichst vielen unterschiedlichen elektrischen Anlagen eingesetzt werden kann, um Prozesse einer Kernschießmaschine und deren Energie im Einzelnen wie auch bilanziert zu erfassen und zu evaluieren.
 
@@ -10,14 +10,35 @@ Hierfür soll das System zum Energiemonitoring an einem Versuchsstand aufgebaut,
 
 Gegeben sind folgende speicherprogrammierbaren Steuerungen, dezentrale Peripherien und deren Feldbusse, auf welche das System applizierbar sein muss.
 
--	Siemens
-    -	CPU: SIMATIC S7-1500 vgl. 1515F-2 PN
-    -	Dezentrale Peripherie: SIMATIC ET 200SP
-    -	Feldbus: Profinet
--	Allen-Bradley / Rockwell Automation 
-    -	CPU: Compact Logix vlg. 5069-L310ERMS3
-    -	Dezentrale Peripherie: Point IO – 1734 Serie
-    -	Feldbus: Ethernet IP
--	Mitsubishi
-    -	CPU: MELSEC iQ-R vlg. R08SFCPU-SET
-    -	Feldbus: CC-Link IE Field
+- Siemens
+    - CPU: SIMATIC S7-1500 vgl. 1515F-2 PN
+    - Dezentrale Peripherie: SIMATIC ET 200SP
+    - Feldbus: Profinet
+- Allen-Bradley / Rockwell Automation 
+    - CPU: Compact Logix vlg. 5069-L310ERMS3
+    - Dezentrale Peripherie: Point IO – 1734 Serie
+    - Feldbus: Ethernet IP
+- Mitsubishi
+    - CPU: MELSEC iQ-R vlg. R08SFCPU-SET
+    - Feldbus: CC-Link IE Field
+
+![Datenfluss](out/diagrams/datenfluss/Datenfluss.svg)
+
+# Implementierung
+- [Image für Box-PC](box-pc/)
+    - Anwendung: [PLC-Connector](box-pc/plc-connector/)
+- [TIA-Portal-Projekt](AI-energy-meter-Project/) für eine temporäre sekundäre Steuerung
+
+- Datenanalyse [mit R-Studio](analyse/)
+
+# WIP Kapitel
+
+- [Einleitung](00_Einleitung.md)
+- [Grundlagen](10_Grundlagen.md)
+- [Theorie](20_Theorie.md)
+- [Implementierung](30_Implementierung.md)
+- [Zusammenfassung](40_Zusammenfassung.md)
+
+
+# finales Dokument
+ - [in LaTeX](main.tex)

+ 1 - 0
analyse/data/.config/rstudio/rstudio-prefs.json

@@ -0,0 +1 @@
+{}

+ 72 - 0
analyse/data/fetch_from_influx.R

@@ -0,0 +1,72 @@
+library(influxdbclient)
+token <- "XPBViJ3s4JL9_wPffwd5M2EgXj5hcUgT0n4jNhv7m6-NC-6SSxQ3run4kXtWBvOk-FYr1VG5Tj5WcoHgjge9jw=="
+org <- "laempe"
+bucket <- "energy-monitor"
+
+client <- InfluxDBClient$new(url = "http://influxdb:8086",
+                             token = token,
+                             org = org)
+
+get_df <- function(client, query) {
+  result <- client$query(gsub("[\r\n]", "", query))
+  
+  time <- result[["_result"]][[1]][["time"]]
+  
+  df <- data.frame(time)
+  
+  for (i in 1:length(result[["_result"]])){
+    r <- result[["_result"]][[i]]
+    if(exists("channel", r))
+      field <- sprintf('%s_%s', r[["_field"]][1], r[["channel"]][1])
+    else
+      field <- r[["_field"]][1]
+    df[field] <- r[["_value"]]
+  }
+  rm(result) 
+  return(df)
+}
+
+start = "2022-05-04T06:00:00+02:00"
+stop  = "2022-05-04T11:25:00+02:00"
+query = sprintf('
+from(bucket: "energy-monitor")
+  |> range(start: %s, stop: %s)
+  |> filter(fn: (r) => r["_measurement"] == "plant")
+  |> filter(fn: (r) => r["_field"] == "auswerfer_1_heben" or r["_field"] == "auswerfer_1_senken" or r["_field"] == "gaswagen_ausfahren" or r["_field"] == "gaswagen_einfahren" or r["_field"] == "hubtisch_heben" or r["_field"] == "hubtisch_senken" or r["_field"] == "rolltor_oeffnen" or r["_field"] == "rolltor_schliessen" or r["_field"] == "schuss" or r["_field"] == "seitenteil_links_schliessen" or r["_field"] == "seitenteil_links_und_rechts_oeffnen" or r["_field"] == "seitenteil_rechts_schliessen" or r["_field"] == "unterteil_faehrt_aus" or r["_field"] == "unterteil_faehrt_ein")
+  |> aggregateWindow(every: 50ms, fn: last, createEmpty: false)
+  |> toBool()
+  |> yield(name: "last")
+  |> drop(columns: ["_start", "_stop"])
+', start, stop)
+
+hengli_plant = get_df(client, query)
+
+query = sprintf('
+from(bucket: "energy-monitor")
+  |> range(start: %s, stop: %s)
+  |> filter(fn: (r) => r["_measurement"] == "24v")
+  |> filter(fn: (r) => r["_field"] == "current" or r["_field"] == "voltage")
+  |> aggregateWindow(every: 20ms, fn: mean, createEmpty: false)
+  |> yield(name: "mean")
+  |> drop(columns: ["_start", "_stop"])
+', start, stop)
+
+hengli_24v = get_df(client, query)
+
+query = sprintf('
+from(bucket: "energy-monitor")
+  |> range(start: %s, stop: %s)
+  |> filter(fn: (r) => r["_measurement"] == "480v")
+  |> aggregateWindow(every: 60ms, fn: mean, createEmpty: false)
+  |> yield(name: "mean")
+  |> drop(columns: ["_start", "_stop"])
+', start, stop)
+
+hengli_480v = get_df(client, query)
+
+plot(hengli_24v$current_10, type = "l")
+
+library(ggplot2)
+ggplot(hengli_24v, aes(x=time)) +
+  geom_line(aes(y=current_10), color = "#ff0000")
+

+ 25 - 0
analyse/docker-compose.yml

@@ -0,0 +1,25 @@
+version: "3.7"
+   
+services:
+  rstudio-server:
+    container_name: rstudio-server
+    image: rocker/rstudio
+    ports:
+      - 8787:8787
+    volumes:
+      - ./data:/home/rstudio
+      - r-site-library:/usr/local/lib/R/site-library
+    working_dir: /home/rstudio
+
+    environment:
+      PASSWORD: rstudio
+    networks:
+      - influxdb
+      
+networks:
+  influxdb:
+    external: True
+
+volumes:
+  r-site-library:
+    external: false

+ 79 - 0
diagrams/benton.plantuml

@@ -0,0 +1,79 @@
+@startuml Benton
+
+!include common.iuml
+
+title Messaufbau Benton-Foundry-LL20
+
+center footer jomueller, 06.2022
+
+
+node Sensoren {
+  object "24V Strommessung" as b {
+    IFM DF2101
+    16 Kanäle 
+    1-10A
+    20ms Interval
+  }
+  object "Energiemessung" as c {
+    3-phasige Zuleitung 480V
+    3x Stromwandler 50A/5A
+  }
+  
+  b -[hidden]- c
+
+}
+
+node "ET200SP CPU" as Interfacemodul {
+
+  object "IO-Link Master" as iolink_master {
+    
+  }
+  object "Energiemeter" as energy_meter {
+    AI Energy Meter
+    U; I; Phase
+  }
+
+  object "Datenbaustein" as DB3 {
+    DB3
+  }
+
+  iolink_master -[hidden]down- energy_meter
+}
+
+node "Steuerung\nCompact Logix" as Steuerung {
+  object Tags {
+    unterteil
+    oberteil
+    auswerfer
+    rolltor
+    schuss
+    hubtisch
+    ...
+  }
+}
+
+node Anwendung {
+  agent "PLC-Connector" as app #FFC5C4
+  database InfluxDB
+  database CSV
+
+  
+}
+
+Sensoren -[hidden]right- Interfacemodul
+
+b <-right-> iolink_master: "  IO-Link"
+c -right-> energy_meter
+c -right-> energy_meter
+
+iolink_master -> DB3
+energy_meter -> DB3
+
+DB3 <-> app: "S7 Protokoll"
+
+Tags <-right-> app: "EtherNet IP"
+
+app -up-> InfluxDB
+app -up-> CSV
+
+@enduml

+ 7 - 0
diagrams/common.iuml

@@ -0,0 +1,7 @@
+skinparam TitleFontSize 24
+allow_mixing
+skinparam linetype ortho
+skinparam NodeBorderColor #7777cc
+skinparam ObjectBackgroundColor #C8C7FF
+skinparam DatabaseBackgroundColor #C8C7FF
+skinparam AgentBackgroundColor #C8C7FF

+ 47 - 0
diagrams/datenfluss.plantuml

@@ -0,0 +1,47 @@
+@startuml Datenfluss
+
+!include common.iuml
+
+title Datenfluss
+
+center footer jomueller, 06.2022
+
+
+node Sensoren {
+  agent "24V Strommessung" as b
+  agent "480V Energiemessung" as c
+  
+  b -[hidden]- c
+
+}
+
+node PLC {
+  agent "PLC-Variablen" as DB3
+  agent Status
+}
+
+node Anwendung {
+  agent "PLC-Connector" as app #FFC5C4
+  database Datenbank
+}
+
+
+node Visualisierung {
+  agent Alarme
+
+  agent Dashboard
+}
+
+Sensoren -[hidden]right- PLC
+
+b -right-> DB3
+c -right-> DB3
+Status -down-> DB3
+
+DB3 -> app
+
+app -> Datenbank
+
+Datenbank -> Visualisierung
+
+@enduml

+ 84 - 0
diagrams/hengli.plantuml

@@ -0,0 +1,84 @@
+@startuml Hengli
+
+!include common.iuml
+
+title Messaufbau Jiangsu-Hengli-LFB65 
+
+center footer jomueller, 06.2022
+
+
+node Sensoren {
+  object "24V Strommessung" as b {
+    IFM DF2101
+    16 Kanäle 
+    1-10A
+    20ms Interval
+  }
+  object "Energiemessung" as c {
+    3-phasige Zuleitung 400V
+    3x Stromwandler 150A/5A
+  }
+  
+  b -[hidden]- c
+
+}
+
+node "ET200SP CPU" as Interfacemodul {
+
+  object "IO-Link Master" as iolink_master {
+    
+  }
+  object "Energiemeter" as energy_meter {
+    AI Energy Meter
+    U; I; Phase
+  }
+
+  object "Datenbaustein" as DB3 {
+    DB3
+  }
+
+  iolink_master -[hidden]down- energy_meter
+
+}
+
+node "Steuerung\nS7-1500" as Steuerung {
+  object Datenbaustein {
+    DB3
+  }
+  object Status {
+    unterteil
+    oberteil
+    auswerfer
+    rolltor
+    schuss
+    hubtisch
+    ...
+  }
+  Status -down-> Datenbaustein
+}
+
+node Anwendung {
+  agent "PLC-Connector" as app #FFC5C4
+  database InfluxDB
+  database CSV
+
+  
+}
+
+Sensoren -[hidden]right- Interfacemodul
+
+b <-right-> iolink_master: "  IO-Link"
+c -right-> energy_meter
+c -right-> energy_meter
+
+iolink_master -> DB3
+energy_meter -> DB3
+
+DB3 <-> app: "S7\nProtokoll"
+
+Datenbaustein <-right-> app: "S7\nProtokoll"
+
+app -up-> InfluxDB
+app -up-> CSV
+
+@enduml

+ 2 - 2
main.tex

@@ -4,7 +4,7 @@
 \usepackage{amsfonts}
 \usepackage{amssymb}
 \author{jm}
-\title{Masterarbeit Präventive Wartung durch Energieüberwachung}
+\title{Energiemonitoring zur Prozessanalyse in industriellen Anlagen am Beispiel von Kernschießmaschinen}
 
 \date{\today}
 
@@ -102,5 +102,5 @@
 \section{Literaturverzeichnis}
 
 \bibliography{PAPERBIBLIOGRAPHY}
-	
+  
 \end{document}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4 - 0
out/diagrams/benton/Benton.svg


+ 83 - 0
out/diagrams/datenfluss/Datenfluss.svg

@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="328px" preserveAspectRatio="none" style="width:1095px;height:328px;background:#FFFFFF;" version="1.1" viewBox="0 0 1095 328" width="1095px" zoomAndPan="magnify"><defs/><g><rect height="37.9375" style="stroke:#00000000;stroke-width:1.0;fill:none;" width="153" x="464" y="5"/><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacing" textLength="143" x="469" y="32.2773">Datenfluss</text><!--MD5=[aec5a9ef0112d0cbf74047ddc40dd148]
+cluster Sensoren--><g id="cluster_Sensoren"><polygon points="16,64.9375,26,54.9375,250,54.9375,250,282.9375,240,292.9375,16,292.9375,16,64.9375" style="stroke:#7777CC;stroke-width:1.0;fill:none;"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="240" x2="250" y1="64.9375" y2="54.9375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="16" x2="240" y1="64.9375" y2="64.9375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="240" x2="240" y1="64.9375" y2="292.9375"/><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacing" textLength="125" x="66.5" y="90.2148">Sensoren</text></g><!--MD5=[d638006d9681d35d828cde7dc11d8204]
+cluster PLC--><g id="cluster_PLC"><polygon points="290,64.9375,300,54.9375,460,54.9375,460,282.9375,450,292.9375,290,292.9375,290,64.9375" style="stroke:#7777CC;stroke-width:1.0;fill:none;"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="450" x2="460" y1="64.9375" y2="54.9375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="290" x2="450" y1="64.9375" y2="64.9375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="450" x2="450" y1="64.9375" y2="292.9375"/><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacing" textLength="51" x="345.5" y="90.2148">PLC</text></g><!--MD5=[20b914e54e06ff5f80813e3ab6447f01]
+cluster Anwendung--><g id="cluster_Anwendung"><polygon points="492,187.4375,502,177.4375,779,177.4375,779,279.4375,769,289.4375,492,289.4375,492,187.4375" style="stroke:#7777CC;stroke-width:1.0;fill:none;"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="769" x2="779" y1="187.4375" y2="177.4375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="492" x2="769" y1="187.4375" y2="187.4375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="769" x2="769" y1="187.4375" y2="289.4375"/><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacing" textLength="159" x="552" y="212.7148">Anwendung</text></g><!--MD5=[6f7f97399f3459a4d8ad2c626077acb8]
+cluster Visualisierung--><g id="cluster_Visualisierung"><polygon points="811,183.9375,821,173.9375,1078,173.9375,1078,282.9375,1068,292.9375,811,292.9375,811,183.9375" style="stroke:#7777CC;stroke-width:1.0;fill:none;"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="1068" x2="1078" y1="183.9375" y2="173.9375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="811" x2="1068" y1="183.9375" y2="183.9375"/><line style="stroke:#7777CC;stroke-width:1.0;fill:none;" x1="1068" x2="1068" y1="183.9375" y2="292.9375"/><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacing" textLength="191" x="845" y="209.2148">Visualisierung</text></g><!--MD5=[5d12e840fb55afd9ed7b3559a638e8f7]
+entity b--><g id="elem_b"><rect fill="#C8C7FF" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="157" x="63.5" y="113.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="137" x="73.5" y="136.9326">24V Strommessung</text></g><!--MD5=[8e9b2d9d80e066cced8e5d90e9bdea61]
+entity c--><g id="elem_c"><rect fill="#C8C7FF" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="178" x="48" y="232.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="158" x="58" y="255.9326">480V Energiemessung</text></g><!--MD5=[202bc8d4b7f7c0afa362c0cadf823034]
+entity DB3--><g id="elem_DB3"><rect fill="#C8C7FF" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="114" x="322" y="232.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="332" y="255.9326">PLC-Variablen</text></g><!--MD5=[e88f9f5b1775d132f0566dd3f47ca5e5]
+entity Status--><g id="elem_Status"><rect fill="#C8C7FF" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="64" x="347" y="113.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="44" x="357" y="136.9326">Status</text></g><!--MD5=[4541fb81c80c07473fe4b07432ef0971]
+entity app--><g id="elem_app"><rect fill="#FFC5C4" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="124" x="508" y="232.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="104" x="518" y="255.9326">PLC-Connector</text></g><!--MD5=[8b6fad1796f199daf3f7481a3b07466b]
+entity Datenbank--><g id="elem_Datenbank"><path d="M667,238.4375 C667,228.4375 715,228.4375 715,228.4375 C715,228.4375 763,228.4375 763,238.4375 L763,263.7344 C763,273.7344 715,273.7344 715,273.7344 C715,273.7344 667,273.7344 667,263.7344 L667,238.4375 " fill="#C8C7FF" style="stroke:#181818;stroke-width:0.5;"/><path d="M667,238.4375 C667,248.4375 715,248.4375 715,248.4375 C715,248.4375 763,248.4375 763,238.4375 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="76" x="677" y="265.4326">Datenbank</text></g><!--MD5=[f46ee3fe86bf44c0ea9b67698aab33a5]
+entity Alarme--><g id="elem_Alarme"><rect fill="#C8C7FF" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="67" x="985.5" y="232.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="47" x="995.5" y="255.9326">Alarme</text></g><!--MD5=[63cd45bfe8ce5232e0cf4e791771f97b]
+entity Dashboard--><g id="elem_Dashboard"><rect fill="#C8C7FF" height="36.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="96" x="854" y="232.9375"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="76" x="864" y="255.9326">Dashboard</text></g><!--MD5=[89c5e88c1b3a23b788935d6fc97d11bf]
+link b to c--><!--MD5=[af87c8ce8893bc72e9a45aec53626259]
+link Sensoren to PLC--><!--MD5=[b68b420ddd83952ea7f0b759c1682a6b]
+link b to DB3--><g id="link_b_DB3"><path codeLine="42" d="M220.57,141.9375 C273.8,141.9375 334.5,141.9375 334.5,141.9375 C334.5,141.9375 334.5,227.4475 334.5,227.4475 " fill="none" id="b-to-DB3" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="334.5,232.4475,338.5,223.4475,334.5,227.4475,330.5,223.4475,334.5,232.4475" style="stroke:#181818;stroke-width:1.0;"/></g><!--MD5=[446aa0da4f6323df3c03e85239b3db2b]
+link c to DB3--><g id="link_c_DB3"><path codeLine="43" d="M226.08,250.9375 C226.08,250.9375 316.69,250.9375 316.69,250.9375 " fill="none" id="c-to-DB3" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="321.69,250.9375,312.69,246.9375,316.69,250.9375,312.69,254.9375,321.69,250.9375" style="stroke:#181818;stroke-width:1.0;"/></g><!--MD5=[cdfc3700825667f308cdcac49820de5e]
+link Status to DB3--><g id="link_Status_DB3"><path codeLine="44" d="M379,150.0075 C379,150.0075 379,227.6975 379,227.6975 " fill="none" id="Status-to-DB3" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="379,232.6975,383,223.6975,379,227.6975,375,223.6975,379,232.6975" style="stroke:#181818;stroke-width:1.0;"/></g><!--MD5=[6387076be90827b2a888f9fccd88b033]
+link DB3 to app--><g id="link_DB3_app"><path codeLine="46" d="M436.05,250.9375 C436.05,250.9375 502.92,250.9375 502.92,250.9375 " fill="none" id="DB3-to-app" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="507.92,250.9375,498.92,246.9375,502.92,250.9375,498.92,254.9375,507.92,250.9375" style="stroke:#181818;stroke-width:1.0;"/></g><!--MD5=[4261806ce36c2f898e83f3c49a5a9fa7]
+link app to Datenbank--><g id="link_app_Datenbank"><path codeLine="48" d="M632.33,250.9375 C632.33,250.9375 661.73,250.9375 661.73,250.9375 " fill="none" id="app-to-Datenbank" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="666.73,250.9375,657.73,246.9375,661.73,250.9375,657.73,254.9375,666.73,250.9375" style="stroke:#181818;stroke-width:1.0;"/></g><!--MD5=[8eea88c56023fa3c38550fe0852d63a6]
+link Datenbank to Visualisierung--><g id="link_Datenbank_Visualisierung"><path codeLine="50" d="M763.04,250.9375 C775.39,250.9375 788.0375,250.9375 798.1775,250.9375 C800.7125,250.9375 803.0908,250.9375 805.2685,250.9375 C806.3574,250.9375 807.3961,250.9375 808.3792,250.9375 C808.8708,250.9375 809.3484,250.9375 809.8115,250.9375 C810.043,250.9375 810.2709,250.9375 810.4951,250.9375 C810.6072,250.9375 810.7183,250.9375 810.8285,250.9375 C810.8836,250.9375 810.9385,250.9375 810.9931,250.9375 " fill="none" id="Datenbank-to-Visualisierung" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="810.9931,250.9375,801.9931,246.9375,805.9931,250.9375,801.9931,254.9375,810.9931,250.9375" style="stroke:#181818;stroke-width:1.0;"/></g><rect height="11.6406" style="stroke:#00000000;stroke-width:1.0;fill:none;" width="89" x="496" y="308.9375"/><text fill="#888888" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="89" x="496" y="318.2197">jomueller, 06.2022</text><!--MD5=[ff4c9720cdd68bb94b05c3943fc0e11c]
+@startuml Datenfluss
+
+skinparam TitleFontSize 24
+allow_mixing
+skinparam linetype ortho
+skinparam NodeBorderColor #7777cc
+skinparam ObjectBackgroundColor #C8C7FF
+skinparam DatabaseBackgroundColor #C8C7FF
+skinparam AgentBackgroundColor #C8C7FF
+
+title Datenfluss
+
+center footer jomueller, 06.2022
+
+
+node Sensoren {
+  agent "24V Strommessung" as b
+  agent "480V Energiemessung" as c
+  
+  b -[hidden]- c
+
+}
+
+node PLC {
+  agent "PLC-Variablen" as DB3
+  agent Status
+}
+
+node Anwendung {
+  agent "PLC-Connector" as app #FFC5C4
+  database Datenbank
+}
+
+
+node Visualisierung {
+  agent Alarme
+
+  agent Dashboard
+}
+
+Sensoren -[hidden]right- PLC
+
+b -right-> DB3
+c -right-> DB3
+Status -down-> DB3
+
+DB3 -> app
+
+app -> Datenbank
+
+Datenbank -> Visualisierung
+
+@enduml
+
+PlantUML version 1.2022.5(Sat Apr 30 10:55:52 UTC 2022)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Default Encoding: UTF-8
+Language: en
+Country: null
+--></g></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4 - 0
out/diagrams/hengli/Hengli.svg


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels