PCWorx - Daten/Variablen wie z. B. Zählerstände auf SPS speichern - Warm-/Kaltstart

Vaninger

Level-2
Beiträge
160
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich habe verschiedene Anwendungen, bei denen ich Zähler (Impulse Stromzähler; Laufzeit von diversen Verdichtern, etc.) in meiner SPS auswerte. Hierzu verwende ich den in der Oscat Bibliothek vorhandenen Baustein ONTIME.
Leider gibt es hier das Problem, dass bei Warm-/Kaltstart diese Werte wieder weg sind und somit kein kontinuierliches Zählen/Aufsummieren dieser Werte möglich ist. Nun gäbe es ja die Möglichkeit, die Werte stündlich oder dergleichen auf die Speicherkarte der SPS zu speichern und nach einem Warm-/Kaltstart wieder einzulesen.
Hierzu hatte ich bereits einen Baustein von Marc (auch aus diesem Forum), leider funktioniert dieser nicht bzw. nicht immer.

Hat jemand hierzu eine andere Lösung und könnte mir ein wenig behilflich sein?

Vielen Dank und schöne Grüße
Daniel

Controller: Phoenix ILC 350 PN
Software: PCWorx 6.00
 

Anhänge

  • FC_BackUP.zip
    166,1 KB · Aufrufe: 37
Zuletzt bearbeitet:
Hallo,

und wo sind jetzt die Zähler in dem Projekt???

Also ich habe es bei mir so gelöst. Ich habe einen kleinen FB geschrieben fürs toggeln von Ausgängen, und damit der letzte Zustand vor einem Spannungsausfall immer gespeichert ist, habe ich den Ausgang als Remanent/Retain gemacht. Und das klappt wunderbar. Du musst natürlich aufpassen. Du musst den Baustein so schreiben, dass er auch dann den gespeicherten Wert nach einem Warmstart wieder behält und nicht einfach überschrieben wird. Das war am Anfang mein Fehler. Man bekommt es auch nicht im Debug-Modus mit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Vaninger

der Ansatz mit deinem Projekt ein BackUp Datei zu schreiben ist okay, wo hast du hier Probleme ? Werden die Daten nicht geschrieben oder nicht zurückgelesen ?

Die Lösung von Mobi funktioniert lediglich bei Warmstart, bei Kaltstart werden auuch die Retain Werte zurückgesetzt

PS: lass das FileOpen Execute solange anstehen bis du es wieder schließen möchtest
 
Das mit dem Kaltstart weiß ich. Aber wann sollte schon ein Kaltstart stattfinden. Außer man macht es über den Kontrolldialog.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mobi, hallo Oerw,

vielen Dank für eure Antworten. Habe den Baustein jetzt nochmals getestet, dieser funktioniert nun doch. Hatte diesen auf einer anderen Steuerung laufen, hier gab es immer irgendwie Probleme. Eventuell waren hier auch meine Datentypen falsch deklariert oder dergleichen. Habe den Baustein jetzt in Verbindung mit dem ONTIME BAustein (hier Laufzeit) von Oscat laufen, erste Tests bei KAlt- sowie Warmstart waren erfolgreich und die vorherigen Daten wurden wieder eingelesen... Habe vorher den Datentyp des Bausteins auf DINT geändert, da der Oscat Baustein dies als VarInOut hat...
Ich mache öfters einen Kaltstart, da ich sehr oft große Änderungen mache und da ein Kaltstart ab und an angebracht ist...

Anbei noch ein Screenshot, wenn irgendjemand noch was wissen will, gerne.

Schöne Grüße
Daniel


Backup.JPG
 
Probleme bei anderem Datentyp

Hallo Leute,

jetzt habe ich doch nochmal eine Frage zu dem Baustein. Anbei habe ich euch hierzu mal mein Testprojekt angehängt. Folgendes Problem: Ich habe den Baustein in meinem Projekt zweimal drin, einmal in Originalversion, einmal den Datentyp des Buffers geändert/angepasst. Leider speichert nur die Originalversion die Werte auf die SPS, die abgewandelte nicht. Hierzu jemand eine Idee?

Danke und schöne Grüße
Daniel
 

Anhänge

  • FILE.rar
    1,1 MB · Aufrufe: 11
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieso hast du denn FILE_READ_WRITE kopiert und den neuen FILE_READ_WRITE2 genannt? Wieso nimmst du nicht einfach FILE_READ_WRITE. Oder ist an FILE_READ_WRITE2 irgendwas anders, sodass es mir gerade nicht aufgefallen ist? Das ist doch der Grund warum es Funktionsbausteine gibt. Damit man einmal den Baustein erstellt und man ihn mehrmals verwenden kann. Und pass mal ein bisschen auf deine Variablennamen auf, z.B. heißt das nicht utd sondern udt. Und irgendwie hast du noch keinen Standard drin, bei der Benennung von Variablen. Mal klein, mal groß, mal mit Datentyp-Präfix, mal ohne. Und wieso haben die Dateien keine Endung, z.B. .txt oder .log oder so?
 
Übriegens solltest du xKaltStart und xWarmtStart erst rücksetzen wenn xFileDone UND xFileDone2 True ist. Ansonsten hat der zweite Write-Baustein von dem xKaltStart bzw. xWarmStart nix.
 
Hallo Leute,

vielen Dank für euere Antworten.

@ oerw:
Habe den Fehlercode beobachtet, hat eigentlich keinen Fehler angezeigt. Hat die Datei auch geschrieben, nur leider die Werte nicht eingelesen oder gespeichert?

@ Mobi:
Wieso hast du denn FILE_READ_WRITE kopiert und den neuen FILE_READ_WRITE2 genannt?
Ich habe bei dem FILE_READ_WRITE2 einen anderen Datentyp als Buffer verwendet. Siehe hierzu den Datentyp FileTypes2. Ich denke auch, dass dies der Grund für das fehlerhafte Einlesen bzw. Speichen der Datei ist.

Und pass mal ein bisschen auf deine Variablennamen auf, z.B. heißt das nicht utd sondern udt

Stimme dir voll und ganz zu, ich war etwas in Eile wegen Championsleague und habe dabei wohl nicht so auf die "Einheitlichkeit" geachtet...

Übriegens solltest du xKaltStart und xWarmtStart erst rücksetzen wenn xFileDone UND xFileDone2 True ist. Ansonsten hat der zweite Write-Baustein von dem xKaltStart bzw. xWarmStart nix.

Wird erledigt, danke für den Hinweis :)

Und wieso haben die Dateien keine Endung, z.B. .txt oder .log oder so?

Hatte bisher nicht gewusst, dass dies unbedingt notwendig ist. Das Beispiel (Baustein), das ich damals erhielt, hatte eben auch keine Endung. Werde jetzt aber mal eine Endung verwenden.

Vielleicht könntet ihr mir auch einfach eine kleine Frage zu dem Datentyp beantworten. Am Liebsten hätte ich eine Struktur, bei der ich einfach eine Zählernummer angebe und zu dieser dann die Laufzeit und die Starts gespeichert werden. Mein Vorschlag hierzu wäre dieser, stimmt das überhaupt so?

Code:
TYPE
    ZaehlerData    :
    STRUCT
        laufzeit            :    UDINT;
        starts                :    UDINT;
    END_STRUCT;

    Zae_Data_Arr: ARRAY [0..500] OF ZaehlerData;

END_TYPE

Wie müsste ich dann den Aufruf dieses Arrays gestalten, wenn ich für Zähler 1 die Laufzeit möchte? Doch so, oder ist dies so falsch?

Code:
Zae_Data_Arr[1].ZaehlerData.laufzeit


Danke und schöne Grüße
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

eigentlich lautet auf den Punkt gebracht die Frage ja: Wie baue ich einen zuverlässig funktionierenden Betriebsstundenzähler? Bei SAIA SPS muss ich einfach für die Zählerstände feste Registeradressen vorgeben. Deren RAM-Nutzung ist so aufgebaut, dass bestimmte Speicheradressen (R 0 für eine Integerzahl im Register 0) einfach vom Programm aus angesprochen werden können. Da kann ich so viele Programmänderungen machen wie ich will, die Werte in so einem Register werden nur geändert, wenn ich das Programm explizit eine entsprechende Operation mit einem Schreibzugriff auf eben diese Speicherstelle durchführen lasse. Ansonsten wird der Inhalt so eines Speicherplatzes unter keinen Umständen angetastet, ist die einzige Gefahr für diese Werte ein Spannungsausfall bei fehlender Pufferbatterie.

Nach meiner Kenntnis gibt es auf einer ILC 1xx keinen Speicher, der einen RESET übersteht. Auch der interne Flash wird offenbar irgendwie gelöscht, (sonst wäre die IP-Adresse der Station nach einem Reset noch erhalten), also gibt es offenbar keine Möglichkeit?

Gruß

Rainer
 
Die Dateien auf dem FTP bleiben trotzdem erhalten. Aber wieso sollte es im Betrieb einen Reset geben?
 
Vielleicht könntet ihr mir auch einfach eine kleine Frage zu dem Datentyp beantworten. Am Liebsten hätte ich eine Struktur, bei der ich einfach eine Zählernummer angebe und zu dieser dann die Laufzeit und die Starts gespeichert werden. Mein Vorschlag hierzu wäre dieser, stimmt das überhaupt so?

Code:
TYPE
    ZaehlerData    :
    STRUCT
        laufzeit            :    UDINT;
        starts                :    UDINT;
    END_STRUCT;

    Zae_Data_Arr: ARRAY [0..500] OF ZaehlerData;

END_TYPE

Wie müsste ich dann den Aufruf dieses Arrays gestalten, wenn ich für Zähler 1 die Laufzeit möchte? Doch so, oder ist dies so falsch?

Code:
Zae_Data_Arr[1].ZaehlerData.laufzeit


Danke und schöne Grüße
Daniel
Also,

als Datentyp sieht das so aus:
Code:
TYPE
    udtData :
    STRUCT
        Runtime : UDINT;
        Starts : UDINT;
    END_STRUCT;

    ARRAY_OF_COUNTER_0_499 : ARRAY [0..499] OF udtData;
END_TYPE

Wie du drauf zugreifst siehst du im Anhang. Der Datentyp heißt dann ARRAY_OF_COUNTER_0_499. Ich habs mal bis 499 gemacht, dann hast du 500 Elemente.
 

Anhänge

  • Struct.jpg
    Struct.jpg
    96 KB · Aufrufe: 40
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Dateien auf dem FTP bleiben trotzdem erhalten. Aber wieso sollte es im Betrieb einen Reset geben?

Hallo,

das ist nicht die Frage. Ein Betriebsstundenzählerinhalt muss (wie der Tachostand eines Autos) unter allen Umständen (außer SPS-Ableben) erhalten bleiben, also auch bei Programmänderungen. Dabei wird zwar in der Regel nur ein Kaltstart fällig , aber ein Reset (mit Kugelschreiber-Knopfdruck auf Reset-Knopf vor Spannungs-Zuschaltung, bis LED FF und FR im Wechsel blinken) ist durchaus nicht ausgeschlossen.

Ich weiß nicht recht, was der FTP ist, aber die Daten im webs-Ordner sind nach dem Reset einer ILC 130 ETH jedenfalls futsch? Der IE zeigt zwar beim Wieder-Aufsuchen nach einem Reset noch die aufgespielten Dateien an, das scheint mir aber Unfug zu sein, jedenfalls sieht mein Seamonkey da nichts mehr (da weiß ich, wie ich den Browsercache lösche), und die Visualisierung funktioniert auch erst wieder, wenn ich die Dateien erneut mit WebVisit aufgespielt habe. Damit fehlt mir bisher weiterhin eine Lösung, wie die Werte übliche "Alltagsaktivitäten" überstehen.

Im Handbuch OSCAT BASIC:LIBRARY Version 3.33 gibt es zum ONTIME eine Tabelle, welche VAR RETAIN PERSISTENT und ähnliche bei welcher Aktion erhalten bleiben, aber ich kann leider die dort verwendeten Begriffe Reset, Reset kalt, Reset Ursprung etc. nicht recht zuordnen. Vermutlich ist "mein Reset" der "Reset Ursprung", der alle Variablen löscht.

Gruß

Rainer
 
Also laut dem Startpost sieht das mir nicht nach Betriebsstundenzähler aus. Eher dier Erfassung von Werten von Geräten, aber nicht deren Laufzeit.
Und wenn ich bei mir den Reset-Taster betätige (lang und kurz) bleibt alles im FTP trotzdem erhalten. Achja die Visu läuft auch. Und bei einer Programmänderung bleiben die Dateien auch erhalten.
 
Also laut dem Startpost sieht das mir nicht nach Betriebsstundenzähler aus.

Hallo,

also das Posting 19.11.2012, 12:26 "Laufzeit von diversen Verdichtern" sieht mir schon sehr nach einem Betriebsstundenzähler aus, und Oscat-ONTIME ist genau ein Betriebsstundenzähler. Allerdings ist dort lediglich nach "Kaltstartfestigkeit" gefragt, was schon mal die meisten Probleme abdeckt, die Lösungen aus der Diskussion werde ich in den nächsten Tagen mal ausprobieren.

Mir geht geht es aber ganz allgemein um die Frage, wie solche wirklich Daten dauerhaft abgelegt werden können, und das heißt für mich auch über einen Reset hinaus. Gegenwärtig sehe ich da nur die Möglichkeiten, solche Daten auf einen anderen Netzwerkteilnehmer auszulagern, bei bedarf zurückzulesen (1 Betriebsstunde dazugekommen), zu ändern und dann wieder auszulagern (siehe unten).

Und wenn ich bei mir den Reset-Taster betätige (lang und kurz) bleibt alles im FTP trotzdem erhalten. Achja die Visu läuft auch. Und bei einer Programmänderung bleiben die Dateien auch erhalten.
Das ist kein Reset entsprechend meiner Beschreibung, also ist das Ergebnis auch nicht unerwartet.

Grüße

Rainer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jo, ich hatte es vorhin einfach gemacht, wenn sie läuft. Habs jetzt nochmal gemacht mit Spannungszuschaltung. Hab genau das beschriebende Verhalten von dir. Also müsste er die Sachen auf einen externen Server Speichern.

Aber "Impulse Stromzähler" sieht mir nicht nach Betriebsstundenzähler aus, sondern eher kWh-Zähler.
 
Hallo Leute,

vielen dank für eure Antworten und eure Hilfe.

also das Posting 19.11.2012, 12:26 "Laufzeit von diversen Verdichtern" sieht mir schon sehr nach einem Betriebsstundenzähler aus, und Oscat-ONTIME ist genau ein Betriebsstundenzähler

Wie du schon richtig erkannt hast, möchte ich gerne von diversen Geräten (Verdichter, Ventilatoren, Magnetventile, Pumpen, etc.) die Laufzeit sowie die Starts mittels des Bausteins ONTIME aufnehmen. Verbrauch kann dann ja ganz leicht durch Multiplikation mit der Leistung errechnet werden. Da ich ab und an einen Warmstart bzw. Kaltstart machen muss, sind diese Daten dann natürlich immer weg.

Hierfür würde ich eben einen Baustein verwenden wollen, der mir die Stände in einem bestimmten Abstand speichert, und diese dann nach dem Warm-/ bzw. Kaltstart wieder einliest. Der Baustein FC_Backup funktioniert auf meiner Test SPS, sobald ich diesen aber in die laufende SPS verwende, zeigt er nach jedem Einlesen wieder null an.

Anbei ein paar Screenshots meines Aufbaus...

Kurz noch eine andere Frage. Wie macht ihr das oder habt ihr diesen Anwendungsfall gar nicht? Wäre schön, hier endlich eine funktionierende Lösung zu haben.

In diesem Sinne noch einen schönen Abend.

Daniel
 

Anhänge

  • image0001.jpg
    image0001.jpg
    273,8 KB · Aufrufe: 28
  • image0002.jpg
    image0002.jpg
    248,3 KB · Aufrufe: 25
  • image0003.jpg
    image0003.jpg
    343,5 KB · Aufrufe: 23
  • image0004.jpg
    image0004.jpg
    265,7 KB · Aufrufe: 25
Hallo Vaninger


der Weg ist schon richtig, um keine Werte nach einem Kaltstart zu verlieren müssen diese auf der FlashCard gespeichert werden. Dies entspricht etwa einem DB auf einer S7.
Ebenfalls ist das Schreiben und Lesen einer Struktur richtig, da dies den Vorteil bietet schnell schreiben und lesen zu können.

Wenn der Baustein auf deiner TestSPS läuft und in der realen nicht, gehe ich hier von einem Unterschied aus. Dieser Unterschied kann in der Hardware oder Software liegen.
Welche SPS Typ ist die TestSPS und welcher Typ die reale ?
Hast du in deinem Baustein ein Fehlerhandling eingebaut, wo du sehen kannst, ob der Baustein fehlerhaft durchlaufen wurde ?
Kann es sein, das die Größe des Buffers anders ist als in deiner TestSPS ?
Es sind zwei verschiedene runtime system bei PxC, hier unterscheiden sich auch der Speicherverbruach einer Struktur.
Wird die Datei erzeugt ? Prüfen mit einem ftp client

Um die Größe einer Struktur/Array zu erhalten gehe ich wie folgt vor:

- Erzeuge die Variable mit dem Strukturtyp
- Projekt neu erzeugen
- notiere der Speicherverbrauch, steht unter Info
- Erzeuge eine weitere Variable mit dem gleichen Strukturtyp
- Projekt neu erzeugen
- nehme den aktuellen Speicherverbrauch und subtrahiere den vorherigen
- die Differenz gibst die als Größe des Buffers zum Schreiben bzwl. Lesen an
- die zweite Variable löschen
- Projekt neu erzeugen
 
Zurück
Oben