Botimperator
Level-2
- Beiträge
- 635
- Reaktionspunkte
- 279
-> Hier kostenlos registrieren
Werte Freunde des Bitschubsens,
mein Häuptling will malwieder ulkige Dinge von mir & da das große G nicht viel zu diesem speziellen vorhaben ausgespuckt hat, bräuchte ich mal eure Meinung dazu.
Vorhaben/Anforderung:
- Kleine S7-1500 CPU (insgesammt ca. 40 jeweils eigenständige Anlagen), die verschiedene (noch zu definierende) Prozessdaten generieren
- Die Prozessdaten werden für gewöhnlich von einem Leitsystem in Empfang genommen & gespeichert
- Die SPSen sollen bei Ausfall der Verbindung zum Leitsystem die Prozessdaten für mindestens 24h zwischenspeichern können
- Nach Wiederherstellung der Verbindung zum Leisystem sollen die gepufferten Daten dem Leitsystem zur Abholung bereit gestellt werden.
- Sollte während der Ausfallphase die Stromversorgung der lokalen SPSen unterbrochen werden, darf es zu keinem Verlust der bereits gepufferten Prozessdaten kommen.
Bereits definierte Hardware:
- Die lokalen 1500er SPSen werden vermutlich 1510SP f-1 PN (6ES7 510-1SK03-0AB0)
- Tia V19
Mengengerüst Daten:
Abtastrate 1s
=> 86400 Datensätze je 24h
=> würde je Datensatz einen DTL-Timestamp und max. rund 180 byte Prozessdaten ermöglichen (wenn wir in den 16MB grenzen der SPS bleiben wollen).
Ich hab zum groben Ablauf bzw. der Struktur schon etwas gehirnt.
Generell würde ich das in einen Puffer und eine Handshake-Funktion zum Leitsystem aufteilen.

Die Handshake-Funktion zum Wegschaufeln der Daten soll uns an diesem Punkt mal nicht interessieren, problematisch ist für mich grade die Umsetzung des Puffers.
Prinzipiell hatte ich mir den internen Ablauf mal so etwa vorgestellt:

Soweit so undramatisch...dachte sich der kleine @Botimperator.
Knackpunkt ist das Thema "Remanenz & verfügbarer Datenspeicher".
Die 1510 hat 1MiB Datenspeicher und rund 216KiB remanente Daten.
Da bis zu 16MB Daten remanent unterzubringen könnte... a bissle eng werden.
Aber wir haben ja noch ne Speicherkarte & nur im Ladespeicher vorhandene DBs sind ja auch quasi remanent.
Da solche Verbindungsausfälle zum Leitsystem recht selten sein sollten, stellt diese geplante Funktion eher eine art Notfallsicherung dar.
=> sollte keine Probleme mit der Lebensdauer der SMC geben.
Bei der eigentlichen Umsetzung gestaltet sich die Angelegenheit aber nicht so einfach....
Idee: den zweiten FIFO-Puffer auf der SMC-Karte wie einen normalen DB behandeln
Wäre die einfachste Idee gewesen, funktioniert aber nicht.
Verschiedene Funktionen funktionieren mit Ladespeicher-DBs nicht.
"CountOfElements" gibt beispielsweise bei einem "Array[0..99] of UDT" (welches im Ladespeicher liegt) 0 zurück.
Eine normale Zuweisung auf ein Testarray im Ladespeicher...

...schickt die SPS mit einem Programmierfehler in STOP.

Idee: Die DataLog Funktionen als Speicher zu missbrauchen (づ ̄ 3 ̄)づ
...funktioniert aber nur vom Programm ins Log.
Zurücklesen im SPS-Programm ist wohl nicht möglich.
Und die übergelaufenen Daten vom Leitsystem per SPS-Webserver und .csv-File abholen zu lassen ist nicht gewünscht.
Idee FileHandling per FileReadC/WriteC
Würde (theoretisch) funktionieren, allerdings würden die Daten dann, wenn ich das richtig verstanden habe, als ein Haufen Bytes geschrieben werden.
Da mal was im laufenden Betrieb kontrollieren sehe ich als schwierig.
Oder was tun wenn meine Funktion aus irgendeinem Grund den Schreib/Lese-Index verloren hat (=> Datenbaustein versehentlich initialisiert).
Idee: Datenbausteinfunktionen Read_DBL/Write_DBL für Zugriff auf Ladespeicher
Funktioniert aber nur mit dem kompletten DB, nicht mit Elementen des DBs.
Für nen Fifo eher doof....
Eine letzte Idee meinerseits wäre noch gewesen den Datenspeicher des FIFO vollaufen zu lassen & dann immer per "Create_DB" zur Laufzeit einen neuen DB auf der SMC zu erzeugen & dann die Daten aus dem vollen Puffer per "Write_DBL" in den neuen DB zu verschieben.
Meine Fragen wären:
- Hatte jemand von euch schonmal so eine Anwendung? Wie hab ihr das gelöst?
- Gibt es von euch aus Erfahrungen zum Thema "DBs zur Laufzeit zu erzeugen"? Gibt es da irgendwelche Fallstricke auf die ich achten muss? (Bin in dem Thema komplett jungfräulich)
- Gibt es ggf. noch eine elegantere Lösung auf die ich noch nicht gekommen bin?
mein Häuptling will malwieder ulkige Dinge von mir & da das große G nicht viel zu diesem speziellen vorhaben ausgespuckt hat, bräuchte ich mal eure Meinung dazu.
Vorhaben/Anforderung:
- Kleine S7-1500 CPU (insgesammt ca. 40 jeweils eigenständige Anlagen), die verschiedene (noch zu definierende) Prozessdaten generieren
- Die Prozessdaten werden für gewöhnlich von einem Leitsystem in Empfang genommen & gespeichert
- Die SPSen sollen bei Ausfall der Verbindung zum Leitsystem die Prozessdaten für mindestens 24h zwischenspeichern können
- Nach Wiederherstellung der Verbindung zum Leisystem sollen die gepufferten Daten dem Leitsystem zur Abholung bereit gestellt werden.
- Sollte während der Ausfallphase die Stromversorgung der lokalen SPSen unterbrochen werden, darf es zu keinem Verlust der bereits gepufferten Prozessdaten kommen.
Bereits definierte Hardware:
- Die lokalen 1500er SPSen werden vermutlich 1510SP f-1 PN (6ES7 510-1SK03-0AB0)
- Tia V19
Mengengerüst Daten:
Abtastrate 1s
=> 86400 Datensätze je 24h
=> würde je Datensatz einen DTL-Timestamp und max. rund 180 byte Prozessdaten ermöglichen (wenn wir in den 16MB grenzen der SPS bleiben wollen).
Ich hab zum groben Ablauf bzw. der Struktur schon etwas gehirnt.
Generell würde ich das in einen Puffer und eine Handshake-Funktion zum Leitsystem aufteilen.

Die Handshake-Funktion zum Wegschaufeln der Daten soll uns an diesem Punkt mal nicht interessieren, problematisch ist für mich grade die Umsetzung des Puffers.
Prinzipiell hatte ich mir den internen Ablauf mal so etwa vorgestellt:

Soweit so undramatisch...dachte sich der kleine @Botimperator.
Knackpunkt ist das Thema "Remanenz & verfügbarer Datenspeicher".
Die 1510 hat 1MiB Datenspeicher und rund 216KiB remanente Daten.
Da bis zu 16MB Daten remanent unterzubringen könnte... a bissle eng werden.
Aber wir haben ja noch ne Speicherkarte & nur im Ladespeicher vorhandene DBs sind ja auch quasi remanent.
Da solche Verbindungsausfälle zum Leitsystem recht selten sein sollten, stellt diese geplante Funktion eher eine art Notfallsicherung dar.
=> sollte keine Probleme mit der Lebensdauer der SMC geben.
Bei der eigentlichen Umsetzung gestaltet sich die Angelegenheit aber nicht so einfach....
Idee: den zweiten FIFO-Puffer auf der SMC-Karte wie einen normalen DB behandeln
Wäre die einfachste Idee gewesen, funktioniert aber nicht.
Verschiedene Funktionen funktionieren mit Ladespeicher-DBs nicht.
"CountOfElements" gibt beispielsweise bei einem "Array[0..99] of UDT" (welches im Ladespeicher liegt) 0 zurück.
Eine normale Zuweisung auf ein Testarray im Ladespeicher...

...schickt die SPS mit einem Programmierfehler in STOP.

Idee: Die DataLog Funktionen als Speicher zu missbrauchen (づ ̄ 3 ̄)づ
...funktioniert aber nur vom Programm ins Log.
Zurücklesen im SPS-Programm ist wohl nicht möglich.
Und die übergelaufenen Daten vom Leitsystem per SPS-Webserver und .csv-File abholen zu lassen ist nicht gewünscht.
Idee FileHandling per FileReadC/WriteC
Würde (theoretisch) funktionieren, allerdings würden die Daten dann, wenn ich das richtig verstanden habe, als ein Haufen Bytes geschrieben werden.
Da mal was im laufenden Betrieb kontrollieren sehe ich als schwierig.
Oder was tun wenn meine Funktion aus irgendeinem Grund den Schreib/Lese-Index verloren hat (=> Datenbaustein versehentlich initialisiert).
Idee: Datenbausteinfunktionen Read_DBL/Write_DBL für Zugriff auf Ladespeicher
Funktioniert aber nur mit dem kompletten DB, nicht mit Elementen des DBs.
Für nen Fifo eher doof....
Eine letzte Idee meinerseits wäre noch gewesen den Datenspeicher des FIFO vollaufen zu lassen & dann immer per "Create_DB" zur Laufzeit einen neuen DB auf der SMC zu erzeugen & dann die Daten aus dem vollen Puffer per "Write_DBL" in den neuen DB zu verschieben.
Meine Fragen wären:
- Hatte jemand von euch schonmal so eine Anwendung? Wie hab ihr das gelöst?
- Gibt es von euch aus Erfahrungen zum Thema "DBs zur Laufzeit zu erzeugen"? Gibt es da irgendwelche Fallstricke auf die ich achten muss? (Bin in dem Thema komplett jungfräulich)
- Gibt es ggf. noch eine elegantere Lösung auf die ich noch nicht gekommen bin?