CmpAPP aber wie?

RoHa1965

Level-2
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich versuche gerade Daten auf einem Raspberry Pi 3+ auch über eine Stromunterbrechung hinaus zu erhalten.
Das einzige was ich dazu bisher brauchbares gefunden habe war ein Tutorial im Automatisierungkanal und eine Beschreibung hier aus dem Jahr 2017.
Bei beiden wird auf das App(Re)StoreRetainsin/fromFile aus der CmpAPP verweisen. Allerdings funktionieren beide Lösungen bei mir nicht. Die Lösung aus dem Atomatisierungskanal habe ich zwar soweit angepasst das sie keine Fehlermeldung rausgiebt, nur wird leider keine Datei geschrieben.
Die Lösung aus dem Post hier bringt nur zig Fehler beim Kopieren, und da ich nicht verstehe wie die Funktion funktionieren soll kann ich sie auch nicht anpassen.
Leider gibt es nirgends eine Anleitung in der beschrieben wird wie die Funktionsweise ist.

Kann mir da jemand weiterhelfen?
Die Speicherung soll immer ausgeführt werden wenn der Hauptbildschirm aufgerufen wird. Das entsprechende Bit welches dann für 200ms gesetzt wird habe ich bereits gebildet. Eine USV (wie in dem Beitrag erwähnt) ist keine Option - da nicht einsetzbar - aber in dem Fall dann auch nicht nötig da die Speicherung dann ca alle 5 Minuten erfolgt .... reicht.. Zurückgeladen werden soll dann nach Neustart. Das entsprechende Rücklesebit sollte ja dann kein Problem sein, im Moment setze ich es manuell.

Bin für jeden Tip dankbar
Gruß
RoHA
 
Da scheint es ja keine Experten zu geben die helfen können ...

Folgendes habe ich bisher als Code implementiert:

PROGRAM AppRetain (wird im PLC_PRG aufgerufen)

VAR
application_ptr : POINTER TO CmpApp.APPLICATION;
res : DINT;
END_VAR


// Anwendungspointer abrufen
application_ptr := CmpApp.AppFindApplicationByName('Application', ADR(res));



// Retaindaten speichern
IF GlobalDB.Speicherbit = TRUE THEN
CmpApp.AppStoreRetainsInFile(pApp:= application_ptr,
pszFilName:= '/home/admin/store.ret');
END_IF



// Retaindaten zurücklesen
IF GlobalDB.Lesebit = TRUE THEN
CmpApp.AppRestoreRetainsFromFile(pApp:= application_ptr,
pszFilName:= '/home/admin/store.ret');
END_IF

Das Speicher-/Lesebit wird jeweils im Programm durch Tastendruck für 200ms aufgerufen. Später soll das Lesebit beim starten der SPS einmalig gesetzt werden, aber gerade ist das so einfacher zu simulieren.

Den Dateipfad auf dem Raspi habe ich mit
sudo chmod 777 /home/admin/store.ret
freigegeben. Es sollte also geschrieben werden können.

Es gibt RETAIN Daten in verschiedenen Datenbausteinen, wie auch PERSISTENT_RETAIN Daten.
Auch habe ich noch Daten im PersistentVars angelegt.
Mir ist nicht ganz klar welche Daten denn eigentlich gesichert werden, daher habe ich überall welche angelegt. Eigentlich sollten ja "alle" RETAIN gesichert werden, egal wo sie liegen.

Aber, es wird einfach nix geschrieben. Die Datei auf dem Raspi bleibt absolut leer und unberührt.

Vielleicht kommt ja doch noch ein Held mit einer zündenden Idee wo ich den Fehler mache!?!
Würde mich freuen und mein Dank sei Dir sicher ;-))


Gruß
RoHa
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. ... aus Security Gründen ist es nicht (mehr) erlaubt außerhalb /var/opt/codesys/PlcLogic zu schreiben denke wenn du das änderst,
dann wirds dir das File anlegen.
2. naja das so zu machen über "ich schreibe das Retain File selber" ist halt schon eher der Workaround für "ich habe keine USV" - nur damit gehts halt echt zuverlässig (mit USV ohne das man was tun muss)

Es gibt noch eine weitere Variante :
den Persistenz Manager zu verwenden -
aber auch hier gilt:
Man muss echt sorgfältig überlegen uns sparsam sein mit den Variablen die persistent sein sollen,
da dieses letztlich ja immer auf Schreibzugriffe auf die SD Karte beim PI endet. (was bei übermäßiger) Verwendung irgendwann eventuell killt.(SD Karte)
 
Zuletzt bearbeitet:
Hallo HausSPSler,

ich wusste doch das es einen Held geben wird der helfen kann !!!! DANKE!!

Ja so hat es dann am Ende geklappt.
Allerdings der Vollständigkeit halber (für alle die diesen Thread am Ende einmal lesen und das gleiche Problem haben) noch folgendes:
Die Pfade für die Speicherung und das Rücklesen müssen nicht lauten:

// Retaindaten speichern
IF "deine Anweisung" = TRUE THEN
CmpApp.AppStoreRetainsInFile(pApp:= application_ptr,
pszFilName:= '/var/opt/codesys/PlcLogic/store.ret');
END_IF

// Retaindaten zurücklesen
IF "deine Anweisung" = TRUE THEN
CmpApp.AppRestoreRetainsFromFile(pApp:= application_ptr,
pszFilName:= '/var/opt/codesys/PlcLogic/store.ret');
END_IF

sondern lediglich:

// Retaindaten speichern
IF "deine Anweisung" = TRUE THEN
CmpApp.AppStoreRetainsInFile(pApp:= application_ptr,
pszFilName:= 'store.ret');
END_IF

// Retaindaten zurücklesen
IF "deine Anweisung" = TRUE THEN
CmpApp.AppRestoreRetainsFromFile(pApp:= application_ptr,
pszFilName:= 'store.ret');
END_IF

("deine Anweisung" muss dann natürlich durch deine Bedingung ersetzt werden ;-))

Zu finden ist die Datei (hier store.ret) dann aber automatisch in /var/opt/codesys/PlcLogic.
Gibt man den kompletten Pfad an, dann funktioniert es nicht.
Warum das nirgendwo bei Codesys dokumentiert wird frage ich mich allerdings. Ohne die Hilfe von HausSPSler wäre ich da wohl niemals drauf gekommen, daher Danke nochmal. Ich hatte da schon Tage dran gesessen.

Somit nun Ende des Thread.
Ich hoffe es hilft auch dem einen oder anderen später einmal.

Gruß
RoHa


P.S.: Es werden übrigens sämtliche RETAIN Daten gesichert. Daher ist die Anmerkung von HausSPSler sicherlich ernst zu nehmen, dass die Bedingung für die Ausführung mit Bedacht zu wählen ist. Hier sollte keineswegs eine Auslösung bei jedem Zyklus erfolgen, da dies die SD-Karte in kürzester Zeit grillen würde. Wenn aber eine Speicherung nur alle paar Minuten oder auf Tastendruck erfolgt, dann sollte die Karte das auch mitmachen. Natürlich bleibt am Ende die Gefahr, dass eine Stromunterbrechung genau während des Speicherns auftritt. Dies kann zu Datenverlusten oder dem kompletten Ausfall führen. Daher auch darauf bei der Wahl der Bedingung achten.
In meinem Fall ergibt sich die zu erwartende Stromunterbrechung durch das Abschalten der Maschine, bei der der Raspi im Kioskmodus läuft.
Ein kontrolliertes Herunterfahren ist da zwar möglich, wird aber wohl vom User eher nicht ausgeführt (Stecker ziehen ist halt einfacher).
Ich habe meine Bedingungen daher so gewählt, dass der User genau an dem Punkt wohl eher nicht den Stecker zieht.
Und falls doch ?!? .... geil > Serviceeinsatz bringt Kohle ;-) steht ja in der Bedienungsanleitung das er das nicht darf ......


P.P.S.: OK ich hab mir mal einen USV-Hat für nen Raspberry bestellt (wusste garnicht das es die gibt). Vielleicht ja doch auch eine Idee ;-))
 
Zuletzt bearbeitet:
Zurück
Oben