Reads data from PLCs of different vendors, processes it and saves it to different kinds of databases

jm-hsa 51f8668414 init 2 éve
app 51f8668414 init 2 éve
config 51f8668414 init 2 éve
.gitignore 51f8668414 init 2 éve
Dockerfile 51f8668414 init 2 éve
README.md 51f8668414 init 2 éve
docker-compose.yml 51f8668414 init 2 éve

README.md

Software des Energiemonitoring-Systems

Installation mit Docker

Voraussetzungen:

  • Linux-Umgebung
  • Git
  • Docker
  • docker-compose
git clone https://github.com/jm-hsa/plc-connector.git
cd plc-connector
sudo docker-compose build
sudo docker-compose up -d

Installation ohne Docker

Voraussetzungen:

  • Git
  • Python 3.9
  • Python-Paketmanager pip
  • optional Admin-Rechte (für den snap7-Server auf Port 102)
  • influxdb-Server
git clone https://github.com/jm-hsa/plc-connector.git
cd plc-connector
python -m pip install -r requirements.txt
python main.py -c config.yml

Einrichtung des Influxdb-Servers

Der influxdb-Server lässt sich unter http://localhost:8086 verwalten. Dort legt man einen Benutzer an und erzeugt anschließend Tokens für die Anwendungen, die auf die Datenbank zugreifen. Über die Explore-Ansicht kann man grafisch individuelle Queries erstellen und dann zu einem Dashboard in z. B. Grafana zusammenstellen.

Konfiguration

Die PLC-Connector Anwendung wird über die Datei config.yml konfiguriert.

Dabei kann eine Auswahl von Modulen aktiviert werden, welche wiederum in drei Kategorien unterteilt sind:

Inputs:
  # Eingangsmodule zum Lesen von Messwerten und Anlagenzuständen
  
  # Definiton des ersten Moduls
  #   ClassName: Name der Python-Klasse des Moduls
  #   path.to.module: relativer Importpfad des Input-Moduls
  - ClassName: path.to.module
    # Ob das Modul geladen werden soll
    # Default: True
    enabled: True
    # Parameter, die an den Konstruktor des Moduls übergeben werden
    param1: "value 1"
    param2: "value 2"

  # Definition weiterer Module
  - ClassName2: path.to.module2
    enabled: True

Middlewares:
  # Zwischenmodule zum Verarbeiten von Messwerten und Anlagenzuständen
  
  # Definiton des ersten Moduls
  #   ClassName: Name der Python-Klasse des Moduls
  #   path.to.module: relativer Importpfad des Middleware-Moduls
  - ClassName: path.to.module
    enabled: False

  - TimeCorrelation: time_correlation
    # Zwischenmodule können geschachtelt werden, so dass sie die Ergebnisse des überliegenden Moduls weiterverarbeiten
    submodules:
    - PrintStats: print_stats
      # Standardmäßig werden die Ergebnisse von Middleware-Modulen ohne Untermodulen für die Ausgabe gesammelt und dedupliziert 

Outputs:
  # Ausgabemodule zum Schreiben von Ergebnisse in eine beliebige Anzahl von Datenbanken  
  # Definiton des ersten Moduls
  #   ClassName: Name der Python-Klasse des Moduls
  #   path.to.module: relativer Importpfad des Output-Moduls
  - CSVStorage: csv_file
    path: logs

  - InfluxDB: influxdb
    url: "http://localhost:8086"
    token: "<token>"
    org: "myorg"
    bucket: "energy-monitor"

Input-Module

  • SiemensCPU: siemens.snap7_connect verbindet sich zu einer Siemens-Steuerung und fragt aktiv einen Datenbaustein ab yaml host: "192.168.0.10" # Addresse der CPU
  • SiemensServer: siemens.snap7_server emuliert eine S7-PLC und stellt passiv Datenbausteine zum Beschreiben bereit yaml port: 102 # Port des S7-Servers
  • Balluff: balluff.balluff_html fragt periodisch einen Balluff IO-Link-Master nach Prozessdaten ab. Sollte wegen schlechter Performance nicht verwendet werden!

  • AllenBradleyCPU: rockwell.allen_bradley_connect stellt eine EtherNet/IP Verbindung zu einer Compact Logix Steuerung her und fragt aktiv eine Liste von Tags ab

    host: "192.168.1.10" # Addresse der CPU
    
  • Replay: replay_influxdb gibt aufgezeichnete Messwerte aus einer Influxdb-Datenbank wieder. Dadurch können Messversuche ohne Hardware wiederholt werden ```yaml

    Influxdb Parameter

    url: "http://localhost:8086" token: "" org: "myorg" bucket: "energy-monitor"

  • # Zeitstempel, an dem mit der Wiederholung begonnen wird start_time: 01.01.2000 00:00:00

    
    ## Middleware-Module
    
    - `PrintStats: print_stats` zeigt Inputstatistiken in der Konsole an. Warnt, wenn ein Input keine Daten liefert.
    
    - `TimeCorrelation: time_correlation` kombiniert mehrere Datenströme zu einem zeitlich monotonen Datensatz. Beispiel:
      ```json
      [
        {"timestamp": "00:00:00", "series": "24V", "value": 123}, 
        {"timestamp": "00:00:02", "series": "24V", "value": 789}
        {"timestamp": "00:00:01", "series": "480V", "value": 456}, 
      ]
    

    wird korreliert zu:

      [
        {
          "timestamp": "00:00:00",
          "24V": {"value": 123}
        }, 
        {
          "timestamp": "00:00:01", 
          "24V": {"value": 123},
          "480V": {"value": 456}
        }, 
        {
          "timestamp": "00:00:02", 
          "24V": {"value": 789}, 
          "480V": {"value": 456}
        }
      ]
    

    Output-Module

    Ergebnisse der Middleware-Module werden anhand des series Feldes in separaten Messreihen gespeichert. Wenn kein series Feld vorhanden ist (z.B. nach time_correlation), dann werden alle übrigen Felder als eigenständige Messreihen angesehen. Zu jedem Zeitpunkt kann immer nur ein Messwert (eine CSV-Zeile / ein Influx-Record) je series existieren.

    • CSVStorage: csv_file speichert die Ergebnisse in CSV-Dateien und fügt diese periodisch zu einem ZIP-Ordner hinzu

      path: logs # Ordner, in dem die Dateien gespeichert werden 
      
    • InfluxDB: influxdb speichert die Ergebnisse in einen Influxdb-bucket.

      # Influxdb Parameter
      url: "http://localhost:8086"
      token: "<token>"
      org: "myorg"
      bucket: "energy-monitor"