Przeglądaj źródła

analyse hengli timing

subDesTagesMitExtraKaese 2 lat temu
rodzic
commit
58919e0e21

+ 1 - 1
.gitignore

@@ -16,7 +16,7 @@ __pycache__/
 *.ACD.Recovery
 
 /box-pc/influxdb2*/
-/box-pc/influxdbv2/
+/box-pc/influxdbv2*/
 /box-pc/build/
 /box-pc/dist/
 /box-pc/*.spec

BIN
20220411_164825.jpg


BIN
20220503_113703.jpg


BIN
20220503_123258.jpg


BIN
analyse/hengli_influxdb_data_2022-09-05_15-54-10.ods


+ 3 - 0
box-pc/.dockerignore

@@ -0,0 +1,3 @@
+*
+
+!/plc-connector

+ 2 - 2
box-pc/Dockerfile

@@ -1,5 +1,5 @@
 # syntax=docker/dockerfile:1
-FROM python:3
+FROM python:3-slim
 ENV PYTHONDONTWRITEBYTECODE=1
 ENV PYTHONUNBUFFERED=1
 WORKDIR /plc-connector
@@ -11,4 +11,4 @@ COPY ./plc-connector /plc-connector/
 
 EXPOSE 102
 
-CMD ["python3", "main.py", "2>&1"]
+CMD ["python3", "main.py"]

+ 13 - 1
box-pc/docker-compose.yml

@@ -11,7 +11,7 @@ services:
       - 102:102
 
     volumes:
-      - ./logs:/plc-connector/logs
+      - ./plc-connector:/plc-connector/
 
     networks:
       - influxdb
@@ -32,6 +32,18 @@ services:
       - "./conf:/etc/influxdb2"
       - "./influxdbv2:/var/lib/influxdb2"
 
+  influxdb-replay:
+    container_name: influxdb-replay
+    image: influxdb:latest
+    
+    restart: unless-stopped
+
+    networks:
+      - influxdb
+
+    volumes:
+      - "./influxdbv2-replay:/var/lib/influxdb2"
+
 networks:
   influxdb:
     name: influxdb

+ 32 - 14
box-pc/plc-connector/inputs/replay_influxdb.py

@@ -9,8 +9,8 @@ from structures.plant import CompactLogixState, S7State
 dataclasses = [
   Measurement24v,
   Measurement480v,
+  S7State,
   CompactLogixState,
-  S7State
 ]
 
 logger = logging.getLogger(__name__)
@@ -23,11 +23,11 @@ class Replay(Input):
     self.bucket = bucket
 
     self.query_api = self.client.query_api()
-    self.current_time = datetime.strptime(start_time, "%d.%m.%Y %H:%M:%S")
+    self.current_time = datetime.strptime(start_time, "%d.%m.%Y %H:%M:%S %z")
+    self.time_offset = datetime.now().astimezone() - self.current_time
   
   def read_handler(self):
     start = self.current_time
-    logger.info(start)
     end = start + timedelta(seconds=1)
     for result in self.query(start, end):
       self._q.put(result)
@@ -35,21 +35,39 @@ class Replay(Input):
 
   def query(self, start, stop):
     query = f'from(bucket:"{self.bucket}")\
-      |> range(start: {start}, stop: {stop})'
+      |> range(start: {start.isoformat()}, stop: {stop.isoformat()})\
+      |> yield(name: "m")'
     result = self.query_api.query(query=query)
     results = []
+    fields = {}
+    old_dataclass = None
     for table in result:
-      for dataclass in dataclasses:
-        if table in dataclass.__name__.lower():
-          break
+      
+      if table.records:
+        record = table.records[0]
+        for cls in dataclasses:
+          if record.get_measurement() == cls.series:
+            dataclass = cls
+            break
+      
+      if old_dataclass != dataclass:
+        results.extend(self.populate_dataclasses(old_dataclass, fields))
+        fields = {}
+        old_dataclass = dataclass
 
       for record in table.records:
-        res = dataclass(
-          series = table,
-          timestamp = record.get_time(),
-          **record.values
-        )
-        results.append(res)
+        if not record.get_time() in fields:
+          fields[record.get_time()] = {}
+        field = fields[record.get_time()]
+        if 'channel' in record.values:
+          field[record.get_field()] = field[record.get_field()] + (record.get_value(), ) if record.get_field() in field else (record.get_value(), )
+        else:
+          field[record.get_field()] = record.get_value()
+        field['source'] = record['source']
+
+    results.extend(self.populate_dataclasses(dataclass, fields))
     return results
 
-    
+  def populate_dataclasses(self, dataclass, fields):
+    for time, values in fields.items():
+      yield dataclass(time + self.time_offset, **values)

+ 79 - 0
box-pc/plc-connector/replay-config.yml

@@ -0,0 +1,79 @@
+
+Inputs:
+  - SiemensCPU: siemens.snap7_connect
+    enabled: False
+    host: "192.168.0.10"
+
+  - SiemensServer: siemens.snap7_server
+    enabled: False
+    port: 102
+
+  - Balluff: balluff.balluff_html
+    enabled: False
+
+  - AllenBradleyCPU: rockwell.allen_bradley_connect
+    host: "192.168.1.15"
+    enabled: False
+
+  - Replay: replay_influxdb
+    enabled: True
+    url: "http://influxdb-replay:8086"
+    token: "XPBViJ3s4JL9_wPffwd5M2EgXj5hcUgT0n4jNhv7m6-NC-6SSxQ3run4kXtWBvOk-FYr1VG5Tj5WcoHgjge9jw=="
+    org: "laempe"
+    bucket: "energy-monitor"
+    start_time: 03.05.2022 13:55:00 +02:00
+
+Middlewares:
+  - PrintStats: debug
+    enabled: True
+  - TimeCorrelation: time_correlation
+    enabled: False
+    enableOutput: False
+    submodules:
+    - PrintStats: debug
+
+Outputs:
+  - CSVStorage: csv_file
+    path: logs
+
+  - InfluxDB: influxdb
+    url: "http://influxdb:8086"
+    token: "XPBViJ3s4JL9_wPffwd5M2EgXj5hcUgT0n4jNhv7m6-NC-6SSxQ3run4kXtWBvOk-FYr1VG5Tj5WcoHgjge9jw=="
+    org: "laempe"
+    bucket: "energy-monitor"
+
+  - SqliteDB: sqlite_db
+    enabled: False
+
+Logging:
+  version: 1
+  formatters:
+    standard:
+      format: "%(asctime)s [%(levelname)s]   \t%(name)s: \t%(message)s"
+  handlers:
+    default:
+      level: INFO
+      formatter: standard
+      class: logging.StreamHandler
+      stream: ext://sys.stderr
+  loggers:
+    '':
+      handlers:
+      - default
+      level: DEBUG
+      propagate: false
+    inputs.rockwell.allen_bradley_connect:
+      handlers:
+      - default
+      level: WARNING
+      propagate: false
+    snap7.server:
+      handlers:
+      - default
+      level: WARNING
+      propagate: false
+    __main__:
+      handlers:
+      - default
+      level: DEBUG
+      propagate: false

+ 76 - 89
diagrams/hengli-timing.plantuml

@@ -3,97 +3,84 @@
 title Betriebszyklus der LFB65 
 right footer jomueller, 08.2022
 
-clock Takt with period 500
-
-@0 as :start
-@5 as :en_high 
-@10 as :en_low
-
-concise Unterteil
 concise Auswerfer
-concise "Abdrücker Seitenteile" as Abdruecker
-concise Seitenteile
+concise Unterteil
 concise Rolltor
-concise Gaswagen
-concise Schwenkplatte
-concise "Losteil 1" as LT1
-concise Sandschleuse
-concise "Sandmessung 3-Wege-Ventil" as S3WV
+concise Seitenteile
+concise Seitenteile
 concise Hubtisch
-concise Oberteil
-robust Schuss
-
-@:start
-
-Unterteil is Idle
-Auswerfer is Idle
-Abdruecker is Idle
-Seitenteile is Idle
-Rolltor is Idle
-Gaswagen is Idle
-Schwenkplatte is Idle
-LT1 is Idle
-
-Sandschleuse is Idle
-S3WV is Idle
-Hubtisch is Idle
-Oberteil is Idle
-Schuss is Idle
-
-@500
-
-Unterteil is Einfahren
-Auswerfer is Heben
-Abdruecker is Einfahren
-Seitenteile is Schließen
-Rolltor is Schließen
-Gaswagen is Einfahren
-Schwenkplatte is Einklappen
-LT1 is Einfahren
-
-Sandschleuse is Schließen
-S3WV is Schließen
-Hubtisch is Senken
-Oberteil is Heben
-
-@2000
-Schuss is Aktiv
-
-@3000
-
-Schuss is Idle
-
-@4000
-
-Unterteil is Ausfahren
-Auswerfer is Senken
-Abdruecker is Ausfahren
-Seitenteile is Öffnen
-Rolltor is Öffnen
-Gaswagen is Ausfahren
-Schwenkplatte is Abklappen
-LT1 is Ausfahren
-
-Sandschleuse is Öffnen
-S3WV is Öffnen
-Hubtisch is Heben
-Oberteil is Senken
-
-@5000
-
-Unterteil is Idle
-Auswerfer is Idle
-Abdruecker is Idle
-Seitenteile is Idle
-Rolltor is Idle
-Gaswagen is Idle
-Schwenkplatte is Idle
-LT1 is Idle
-
-Sandschleuse is Idle
-S3WV is Idle
-Hubtisch is Idle
-Oberteil is Idle
-Schuss is Idle
+concise Schuss
+concise Gaswagen
+
+@-0.999
+Auswerfer is {-}
+Unterteil is {-}
+Rolltor is {-}
+Seitenteile is {-}
+Hubtisch is {-}
+Gaswagen is {-}
+Schuss is {-}
+
+@0:00:00
+
+Auswerfer is Senken #pink
+
+@0.860
+
+Auswerfer is {-}
+Unterteil is Einfahren #pink
+
+@3.420
+
+Rolltor is Schließen #pink
+Seitenteile is Schließen #pink
+Unterteil is {-}
+
+@5.920
+Rolltor is {-}
+
+@6.400
+Seitenteile is {-}
+Hubtisch is Heben #pink
+
+@8.380
+Schuss is Schuss #lightblue
+Hubtisch is {-}
+
+@11.300
+Hubtisch is Senken #palegreen
+Schuss is {-}
+
+@13.740
+Gaswagen is Einfahren #pink
+Hubtisch is {-}
+
+@15.580
+Rolltor is Öffnen #palegreen
+Gaswagen is {-}
+
+@17.940
+Rolltor is {-}
+
+@22.52
+Seitenteile is Öffnen #palegreen
+
+@24.540
+Unterteil is Ausfahren #palegreen
+Seitenteile is {-}
+
+@27.120
+Gaswagen is Ausfahren #palegreen
+Unterteil is {-}
+
+@29.000
+Auswerfer is Heben #palegreen
+Gaswagen is {-}
+
+@30.480
+Auswerfer is {-}
+
+@33.480
+Auswerfer is Senken #pink
 
 @enduml

Plik diff jest za duży
+ 0 - 0
out/diagrams/hengli-timing/Hengli-Timing.svg


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików