Hallo,
an einer Anlage in der Firma möchten wir den Profibus kontinuierlich 'abhorchen' und bei bestimmten Meldungen auf dem Profibus (z.B. Sensorzustandsänderungen) mitloggen (Zeitpunkt und Zustand).
Die Daten sollen zu einem späteren Zeitpunkt analysiert werden.
Was muss Soft- (Python) oder Hardwareseitig gemacht werden, damit die Sensorzustandsänderungen und der Zeitpunkt mitgeloggt werden kann?
Weiterhin habe ich die Frage, wie der 'RevPi Gate PROFIBUS Slave' Softwareseitig in den Siemens Profibus integriert werden kann?
Danke schon einmal für die Antworten,
Karl
Abhorchen des Profibus an einer Siemens S7
- RevPiModIO
- KUNBUS
- Posts: 335
- Joined: 20 Jan 2017, 08:44
- Contact:
Re: Abhorchen des Profibus an einer Siemens S7
Hallo Karl!
Fast so ein Projekt haben wir momentan in der Entwicklung - bzw. schon in der Testphase Forumsbeitrag.
Ist zwar mit ModbusTCP aber wir haben das auch schon mit dem ProfiNet Modul getestet - Ich gehe davon aus, dass ProfiBus genau so gut funktioniert. Unser Programmierer hat einfach die GSD-Datei von KUNBUS geladen und sie in seine TIA-Umgebung importiert. Dann konnte er die Hardware konfigurieren und beliebige Werte der Anlage auf die Outputs legen. (An der Stelle kann ich jedoch nicht wirklich helfen, da ich mit Siemens nie programmiert habe).
Auf dem RevPi haben wir dann die Hardwarekonfiguration über piCtory durchgeführt - Bei ModbusTCP haben wir 512 Bytes für Inputs und 512 für Outputs eingestellt.
Dann habe ich mich mit dem Modbus-Programmierer abgestimmt bei welchen Bytes er welche Daten ablegt und habe das mit Python in dem RevPiModIO-Modul als Inputs definiert (so ist das Modul auch entstanden).
Beispiel:
self.iodev[32].reg_inp("timestamp", "Input_5", "Q")
Der Buchstabe "Q" steht für die Python struct Format Characters - 8 Byte langer unsigned integer...
So kann man in Python alle Bytes eben wieder Zuordnen und dann einfach mit "timestamp" einen int() Wert erhalten.
Der Programmierer sendet mir ein "logbit", wenn das True wird, soll ich eine Zeile loggen:
self.iodev[32].reg_inp("logline", "Input_1", "?", bit=0, event=self.logline)
Wenn er das nullte Bit am nullten Byte auf True setzt, führt mein Python-Programm die Funktion "logline" aus.
In "logline" sammle ich dann alle Daten die geloggt werden sollen und übergebe diese an eine queue in Python. Ein Thread kümmert sich dann darum, diese Daten als CSV-Datei auf den eingesteckten USB-Stick zu schreiben.
self.iodev[32]["timestamp"].value -> schreiben
Man kann natürlich noch mehr Inputs mit Events bestücken, die dann auch eine Zeile schreiben...
Und natürlich auch Rückmeldungen geben - Auch hier erstmal die Bytes vom Device definieren:
self.iodev[32].reg_out("logged", "Output_1", "?", bit=0)
Ich setze dem Programmierer das nullte bit auf dem nullten Byte auf True, wenn ich eine Zeile geloggt habe:
self.iodev[32]["logged"].value = True
Gruß, Sven
Fast so ein Projekt haben wir momentan in der Entwicklung - bzw. schon in der Testphase Forumsbeitrag.
Ist zwar mit ModbusTCP aber wir haben das auch schon mit dem ProfiNet Modul getestet - Ich gehe davon aus, dass ProfiBus genau so gut funktioniert. Unser Programmierer hat einfach die GSD-Datei von KUNBUS geladen und sie in seine TIA-Umgebung importiert. Dann konnte er die Hardware konfigurieren und beliebige Werte der Anlage auf die Outputs legen. (An der Stelle kann ich jedoch nicht wirklich helfen, da ich mit Siemens nie programmiert habe).
Auf dem RevPi haben wir dann die Hardwarekonfiguration über piCtory durchgeführt - Bei ModbusTCP haben wir 512 Bytes für Inputs und 512 für Outputs eingestellt.
Dann habe ich mich mit dem Modbus-Programmierer abgestimmt bei welchen Bytes er welche Daten ablegt und habe das mit Python in dem RevPiModIO-Modul als Inputs definiert (so ist das Modul auch entstanden).
Beispiel:
self.iodev[32].reg_inp("timestamp", "Input_5", "Q")
Der Buchstabe "Q" steht für die Python struct Format Characters - 8 Byte langer unsigned integer...
So kann man in Python alle Bytes eben wieder Zuordnen und dann einfach mit "timestamp" einen int() Wert erhalten.
Der Programmierer sendet mir ein "logbit", wenn das True wird, soll ich eine Zeile loggen:
self.iodev[32].reg_inp("logline", "Input_1", "?", bit=0, event=self.logline)
Wenn er das nullte Bit am nullten Byte auf True setzt, führt mein Python-Programm die Funktion "logline" aus.
In "logline" sammle ich dann alle Daten die geloggt werden sollen und übergebe diese an eine queue in Python. Ein Thread kümmert sich dann darum, diese Daten als CSV-Datei auf den eingesteckten USB-Stick zu schreiben.
self.iodev[32]["timestamp"].value -> schreiben
Man kann natürlich noch mehr Inputs mit Events bestücken, die dann auch eine Zeile schreiben...
Und natürlich auch Rückmeldungen geben - Auch hier erstmal die Bytes vom Device definieren:
self.iodev[32].reg_out("logged", "Output_1", "?", bit=0)
Ich setze dem Programmierer das nullte bit auf dem nullten Byte auf True, wenn ich eine Zeile geloggt habe:
self.iodev[32]["logged"].value = True
Gruß, Sven
python3-RevPiModIO - https://revpimodio.org/ || Der RevPi ist das Beste, was passieren konnte!