Das sehr rudimentäre API Gateway der Musterlösung wird hier mit dem leicht zu erlerndenden Mikro Framework Flask realisiert (apiGateway.py). 

DIe Installation erfolgt mit 

pip install flask flask-cors

Flask unterstützt sogenanntes Routing. Fünf Routen werden implementiert:

@app.route('/user/login', methods=['POST'])
@app.route('/user/logout/<token>', methods=['DELETE'])

## get info about which PLC of an user is registered and of online or not
@app.route('/info/<token>', methods=['GET'])

## get info about status PLC(s) of an user
@app.route('/info/<user_opc_clients>/<token>', methods=['GET'])

## give command to PLC(s)
@app.route('/control', methods=['POST'])


Der Port des Webservers wird bei dessen Start in Zeile 156 auf 5000 festgelegt. Damit ist die URI der ersten Route z.B. https://IP_WEBSERVER:5000/user/login und muss mit der HTTP-Methode POST aufgerufen werden.

Alle Routen sind mit OpenAPI 3.0 dokumentiert. Die Dokumentation erfolgt durch die Definition in der YAML-Datei openapi.yaml. Mit dem OpenAPI-Werkzeug Swagger-Editor kann die Datei geöffnet werden womit gleichzeitig die Dokumentation und das Testen der API möglich ist:

Swagger-Editor mit geladenem openapi.yaml
Swagger-Editor mit geladenem openapi.yaml

Um die Performance des API-Gateway zu erhöhen, wird bereits vor dem Start des Webserver versucht, zu allen in settings.py konfigurierten SPSen die OPC UA-Verbindung aufzubauen (Zeile 155). Die Ergebnisse dieser Funktion wird in der Liste opc_clients gespeichert (Definition in Zeile 23):

[
['opcUser:opcUser123', '192.168.178.25:4840', 'online', -1, SyncClient(opc.tcp://192.168.178.25:4840)],
['opcUser:opcUser123', '192.168.178.24:4840', 'offline', -1, SyncClient(opc.tcp://192.168.178.24:4840)],
['YOUR_OPC_USER2:YOUR_OPC_USER_PASSWORD2', '192.168.178.23:4840', 'offline', -1, SyncClient(opc.tcp://192.168.178.23:4840)]
]
Wie oben ersichtlich, ist hier lediglich die erste SPS in der Liste online.
Gespeichert werden dabei jeweils
OPC_USER:OPC_USER_PASSWORD, IP_ADRESSE_SPS:PORT_SPS, status, token, SyncClient-Objekt

Da hier noch kein Login erfolgt ist, lautet das Token noch -1. Um eine extra Benutzerverwaltung zu sparen, erfolgt der Login der Einfachheit halber auf der HTTP-Seite mit der gleichen Kombination aus Benutzername und -kennwort, mit der auch der Verbindung auf der OPC-UA-Seite vollzogen wird.

Ist die Anmeldung erfolgreich, so wird anstelle der -1 ein gültiges Token eingetragen:

[
['opcUser:opcUser123', '192.168.178.25:4840', 'online', 123456, SyncClient(opc.tcp://192.168.178.25:4840)],
['opcUser:opcUser123', '192.168.178.24:4840', 'offline', -1, SyncClient(opc.tcp://192.168.178.24:4840)],
['YOUR_OPC_USER2:YOUR_OPC_USER_PASSWORD2', '192.168.178.23:4840', 'offline', -1, SyncClient(opc.tcp://192.168.178.23:4840)]
]
Oben wurde das im DEBUG-MODUS erzeugte Token 123456 für die erste SPS eingetragen (Zeile 18). 123456 anstelle einer zufälligen Zahlen-Buchstaben-Kombination deshalb, weil sich sonst die Antwort der API nicht automatisch testen lassen würde.
Nun lässt sich diese erste SPS duch die API lesen und steuern.
Durch eine erfolgreichen Abmeldung wird das jeweilige Token wieder durch -1 ersetzt.










Last modified: Sunday, 13 April 2025, 11:57 PM