# Phoenix ILC 350 PN - Werte auf Speicherkarte schreiben/lesen



## Vaninger (17 Januar 2009)

Hallo,
ich verwende für meine Hobbybrauerei eine Phoenix ILC 350 PN. In dieser Steuerung/SPS ist eine Speicherkarte inbegriffen, die per FTP auch beschrieben werden kann.
Ich würde jetzt gerne Werte (z. B. Zähler, Parameter für Temperatur, etc.) von der SPS bzw. aus dem Programmierprogramm PCWorx 5.00 auf diese Speicherkarte speichern und z. B. nach einem Kaltstart wieder auf die SPS laden.

Leider sind die Funktionsbausteine (z. B. FILE_OPEN; FILE_CLOSE; (diese Bausteine sind ja noch verständlich) FILE_WRITE) in PCWorx ziemlich kompliziert. Hat hier schon einmal jemand einen Funktionsbaustein bzw. ein Programm geschrieben, der diese Funktionen beinhaltet bzw. die Handhabung für das Speichern/Lesen erleichtert?

Bin für jeden Tipp dankbar.

Vielen dank die Antworten.

Gruß
Daniel


----------



## Oerw (18 Januar 2009)

Hallo Daniel


ich kann dir gerne weiterhelfen bzgl. des Dateihandling-

Gruß
Erwin


----------



## Vaninger (18 Januar 2009)

Hallo Erwin,

das Öffnen/Erstellen einer Datei ist soweit klar. Ebenfalls das Schließen dieser Datei. 
Leider finde ich das Schreiben in die Datei ziemlich schwierig, da hier ziemlich viel Parameter abgefragt werden.
Wie schon erwähnt, würde ich gerne Werte (z. B. Laufzeitzähler; Dateityp Dint oder Temperaturwerte Typ Real) in diese Datei speichern, damit ich nach einem Kaltstart diese Werte wieder aus der Datei auslesen kann und der Zähler weiterzählen kann.

Falls du mir hier ein Beispiel mit Erklärung oder ähnliches zeiegn könntest, wäre mir schon viel geholfen.

DAnke

DAniel


----------



## Marc (19 Januar 2009)

Möchtest Du Die Werte als CSV gespeichert haben (also über den FTP lesbar) oder wirklich nur als Backup für die SPS? Falls letzteres würde ich einfach eine Struktur mit allen Werten erzeugen, diese an den Parameter BUFFER des File_Write FBs übergeben, und die Länge der Struktur am Parameter LENGTH übergeben und mit EXECUTE die Datei schreiben.


Gruß Marc


----------



## Vaninger (19 Januar 2009)

Hi Marc,

danke für die Antwort. Abgespeicherte Werte in CSV wären auch klasse, darum geht es mir aber erstmal nicht. Hast du hierzu wohl eine Lösung?
Ich würde gerne die Werte als Backup abspeichern und nach dem Kaltstart wieder laden.

"würde ich einfach eine Struktur mit allen Werten erzeugen, diese an den Parameter BUFFER des File_Write FBs übergeben"

Hier liegt mein Problem, ich weiß nicht genau, wie ich das bewerkstelligen soll. Falls du hierzu ein Beispiel oder dergleichen hättest...

Danke

Gruß
Daniel


----------



## Marc (19 Januar 2009)

Hier ein kleines Besipiel.
Dem FB wird eine Struktur übergeben bei setzten der Variable BeckUp auf 1 wird diese gespeichert, bei Kaltstart wird diese von der CF zurück gelesen.


----------



## Vaninger (19 Januar 2009)

Hallo Mark,

vielen Dank für das Beispiel. Nur leider gibt es ein Problem. Als ich das Modul in PCWorx öffnen wollte, wurde mir die Fehlermeldung "Das Projekt wurde mit einer neueren Version von PCWORX/Config+ erstellt" und ich konnte ihn nicht öffnen. Kann man dies irgendwie umgehen?

Meine Version ist die 5.00.26!

Nochmals vielen Dank für die bisherigen Mühen und Antworten!

Gruß
Daniel


----------



## Marc (20 Januar 2009)

Habe das mal versucht in eine alte Version zu konvertieren. Vielleicht klappt es jetzt.


----------



## Vaninger (21 Januar 2009)

Hallo Marc,

schon mal besten dank für den Funktionsbaustein. Konnte ihn schon mal anschauen und probieren, hab leider noch ein paar Probleme (mein ILC 350 PN läuft mit ARM_L_32 und nicht mit ARM_L_40) die ich heute noch versuchen werde zu lösen.
Ich hoffe es funktioniert trotzdem. Sollte ich hier noch Hilfe benötigen, hoffe ich mal, dass du mir nochmal helfen kannst...

Ich probier es aber erst mal allein.

Also nochmal vielen Dank für deine Hilfe. Ist echt klasse von dir...

Gruß
Daniel


----------



## Marc (21 Januar 2009)

Brauchst Du nur in den Einstellungen der POU bei SPS spezifisch von ARM_L_40 auf ARM_L umstellen.
  Bei der aktuellen PC-Worx Version braucht man die Einstellung gar nicht mehr.
Welche FW hast Du auf der SPS? Sieht man im Online Dialog wenn man auf Info klickt.
Falls älter als 2.xx dann würde ich ein update empfehlen.
Dann kannst Du das PC Worx Projekt auch auf ARM_L_40 umstellen.


----------



## Vaninger (21 Januar 2009)

Hallo Marc,

der Funktionsbaustein funktioniert jetzt soweit, habe ihn mit meinem Elektriker heute zum Laufen gebracht. Echt klasse und danke. Was uns dabei aufgefallen ist, kann der Baustein auch Strukturen in Strukturen verarbeiten oder liegt es hierbei an den Strings, die in den Strukturen enthalten sind? Was meinst du dazu?

Wie hast du das mit den CSV Dateien bewerkstelligt? Hier müßte ja zwischen jedem Wert ein Komma oder dergleichen gesetzt werden oder die Werte als String herausgespeichert werden. Hast du das schon mal gelöst? Damit könnte ich Auswertungen meiner Temperaturen bewerkstelligen.

Also nochmal vielen Dank für die Hilfe!!!!!

Gruß
Daniel


----------



## Marc (23 Januar 2009)

Die art der übergebenen Struktur ist egal. Wichtig ist nur das Du den Namen "udtFileData" nicht veränderst.
Wenn Du CSV Dateien erzeugen willst müssen alle Werte in ASCII Zeichen konvertiert werden, und dann mit Kommas getrennt werden. Das Konvertieren kann man mit Funktionen wie REAL_TO_BUFF machen.
Die Programmierung wird schon etwas aufwändiger.
Vielleicht habe ich noch ein Beispiel dafür, wenn ich es finde werde ich es mal posten.


----------



## Vaninger (23 Januar 2009)

Hallo Marc,

wenn ich eine neue Struktur erstelle mit einem anderen Namen, deinen Baustein unter einen anderen Namen nochmals erstelle und hier den Namen vom Dateityp dieser Struktur verwende, müßte das Lesen und Schreiben ja trotzdem wieder klappen.
In diesem Fall wäre dies unabhängig von dem KAltstart und soll Rezeptdaten einlesen. Dies sollte ja eigentlich klappen. Werd ich nochmal probieren.

"Wenn Du CSV Dateien erzeugen willst müssen alle Werte in ASCII Zeichen konvertiert werden, und dann mit Kommas getrennt werden. Das Konvertieren kann man mit Funktionen wie REAL_TO_BUFF machen.
Die Programmierung wird schon etwas aufwändiger.
Vielleicht habe ich noch ein Beispiel dafür, wenn ich es finde werde ich es mal posten."

Falls du das Beispiel noch finden solltest und mir zur Verfügung stellen könntest könnte ich nur noch vor dir niederknien...


Also besten nochmals.

Daniel


----------



## Vaninger (30 Januar 2009)

Hallo Marc,

nochmal danke für die Hilfe. Funktioniert soweit. Noch kurz eine Frage zu dem Baustein, der eine CSV Datei speichert. Hast du hier noch was gefunden? Muß ja nicht funktionieren aber ein Ansatz wäre super...

Falls du hier noch was hast, wäre ich dir sehr dankbar.

Gruß
Daniel


----------



## Marc (6 Februar 2009)

Hallo Daniel,
 [FONT=&quot]habe mal den gefunden Code in zwei FBs gebaut.
Einfach entpacken und als Bibliothek einbinden und FBs aufrufen.
Den FB DataLogReal_V0_00 musst Du für jede Real Variable aufrufen.
Den FB DataLogger_V0_00 nur einmalig.
Wenn der DataLogger aktiv ist und der Eingang xReq = true werden die aktuellen Werte der Realvariablen in eine CSV Datei geschrieben.[/FONT]


----------



## Vaninger (13 Februar 2009)

Hallo Marc,

vielen Dank für deine Hilfe und die klasse Bausteine. :TOOL: Vielleicht kannst du mir hier noch eine kurze Erklärung dazu geben. So habe ich deine Baustein aufgerufen, müßte ja stimmen, oder?

Stimmen meine Annahmen?

xActivate = Aktivieren des Bausteins
xReq = schreibt Wert bei TRUE
iCreate = Es wird eine neue Datei nach n Tagen oder Stunden erstellt?
xAddDate = Datum zu Filenamen hinzufügen
strFileName = Dateiname
iSave = nach n Werten werden die Werte gespeichert
xAddTime = Zeit wird Wert in Spalte hinzugefügt
iCreateNewFile = es wird eine neue Datei nach n Tagen erstellt?
udtWriteCSV = Eingang für Wert aus DataLogReal
ActFile = ?
LastFile?
Was gehört hier rein, ein Vorgabewert oder wie?

Also nochmal vielen dank für deine Hilfe.

Gruß
Daniel


----------



## Marc (14 Februar 2009)

In deinem Screenshot sind
iCreate = 5
iCreateNewFile = 5
Dann solltest Du noch xAddDate = true setzten.

Dann hättest Du folgende Funktion, alle 5 Tage wird um 5 Uhr eine neue Datei CSV1_Zeitstempel.csv erzeugt.

ActFile = Der FB würde den Dateinamen anzeigen in die er jetzt schreibt.
LastFile= Der FB zeigt den Dateinamen in die er zuletzt geschrieben hat.

Dann könnte man LastFile nehmen und per Mail verschicken und dein Datenlogger ist komplett!


----------



## Vaninger (18 Februar 2009)

Hallo Marc,

vielen dank für die Informationen. Jetzt ist aber noch eine Frage aufgetaucht. Ich hätte gerne das Format des Wert-Strings auf zwei Stellen nach dem Komma begrenzt. 
Normal könnte ich ja in deinem Programmtext des Bausteins DataLogger das Format auf '%3.2f' anstatt '%f' ändern und somit hätte ich nur noch 2 Nachkommastellen und drei Vorkammastellen. Sobald ich aber hier was ändere, funktioniert das Programm nicht mehr. 
Woran kann das liegen? Außerdem würde mich interessieren, wieso beim Doppelklick auf den Baustein nicht der Programmteil in ST sondern nur die Information bezüglich SizeFiledata?
Wenn der Programmteil "Code" an die dritte Stelle anstatt an der fünften Stelle verschoben wird, kann man ihn zwar anschauen, aber das Programm funktioniet nicht mehr.

Ist der Baustein gesichert oder mit einem Schreibschutz versehen?

Naja, vielen Dank für die Antwort.

Gruß
Daniel


----------



## Marc (22 Februar 2009)

Der Baustein ist offen!
Wenn man einen Doppelklick in FBD auf den FB mach öffnet man automatisch das erste Codearbeitsblatt des Fbs.
Wenn Du ein anderes öffnen möchtest musst Du über den Reiter Bibliotheken das Arbeitsblatt öffnen.
Ich habe mal ein anderes Format getestet und es hat geklappt.
  Ich habe noch ein paar Funktionen in einer V0.01 eingebaut, werde ich mal hochladen wenn es fertig ist.


----------



## Vaninger (22 Februar 2009)

Hi Marc,
vielen Dank für die Antwort. Habe es gestern noch einmal pobiert, habe die Module einzeln und nicht als Bibliothek eingebunden und nun funktioniert es auch nach den Änderungen...
Da bin ich ja gespannt, was du noch für Änderunegn eingebaut hast...
Du programmierst doch sicherlich auch beruflich oder? Die Bausteine sind ja doch ziemlich komplex und für mich als Hobbyprogrammierer sowieso...

Vielen Dank

Daniel


----------



## Vaninger (18 März 2009)

*Zählerwerte speichern funktioniert nicht*

Edit: Funktioniert jetzt, nur leider nicht mit der unten gezeigten Variante des Datentypes. Wieso auch immer nicht...

Hallo Marc,

hab leider immer noch ein Problem mit meinen Zählerwerten. Wie schon am Anfang gesagt, möchte ich die Zählerwerte periodisch auf meine Speicherkarte speichern und nach einem Stromausfall, Kaltstart, etc. wollte ich den Wert auslesen/laden und danach bei diesem Wert weiterzählen.
Hierzu habe ich mir den ONTIME Baustein der Oscat Bibliothek modifiziert. Ist zwar sicher nicht ganz richtig programmiert (bin halt Anfänger...), aber naja.
Leider speichert der Baustein von Marc (der im Übrigen super ist) meine Werte nicht auf die Speicherkarte.
Anbei der Aufbau sowie der Code meiner Programmierung. Vielleicht sieht einer der Profis hier im Forum sofort, was ich verkehrt mache...

Bin für jeden Tipp dankbar!

Daniel

*Deklaration des Datentypes:*










Vielleicht fällt ja jemanden was auf...

Dankeschön!!!


----------



## marc_76 (22 Mai 2009)

*Datalogger PCWorx*

Hallo,
wie bekomme ich denn nun mehrere Werte in die Datei? An dem Eingang "udtWritecsv" kann ich doch nur eine Variable vom Baustein DataLogReal anschließen. 
Was bedeutet iSave after Records?

Danke und Gruß


----------



## Marc (24 Mai 2009)

"udtWritecsv" ist nur eine Schnittstelle zwischen dem FB DataLogReal und dem FB DataLogger. 

Den FB DataLogReal instanziert Du für jede Real Variable die Du loggen möchtest. 

Den FB DataLogger instanziert Du nur einmal. Wenn dann der Parameter am DataLogger xActivate = true ist und dann am Eingang xReq eine positive Flanke angelegt wird, wird ein Datensatz im RAM gepuffert. Wenn am Eingang iSaveAfter_n_Records 5 parametriert ist, wird nach 5 Datensätzen im RAM die Daten in die Datei geschrieben.


----------



## marc_76 (24 Mai 2009)

*ftp*

Danke, ok das habe ich verstanden! Nun habe ich eine csv Datei auf dem Controller, kann sie aber nicht kopieren oder löschen. Wie löscht man Dateien auf dem Controller? Ich besitze nicht die Rechte als anonymous um diese Dateien zu löschen oder zu kopieren.

Gruss
Marc


----------



## Marc (25 Mai 2009)

[FONT=&quot]Kann es sein das Du als Dateinamen z.B. webs/name.csv angegeben hast?
Falls ja wird die Datei nicht im Unterverzeichnis webs angelegt sondern im Hauptverzeichnis mit dem Namen "webs/name.csv".
Wenn man nun per FTP die Datei löschen oder kopieren möchte meldet der FTP Server das es keine Datei "name.csv" im Unterverzeichnis gibt.
Die einzigste Möglichkeit die Datei zu löschen ist dem FB FileRemove.
Und dann ändern den Dateinamen in einen Namen ohne Unterverzeichnis.[/FONT]


----------



## Vaninger (14 April 2010)

*Änderungen an Baustein*

Hallo Marc,

dein Baustein funktioniert bis jetzt einwandfrei und ich bin sehr zufrieden damit. Nochmal danke für deine Hilfe!!!

Jetzt wollte ich nur mal kurz nachfragen, ob du hier nochmals Änderungen oder Verbesserungen in diesem Baustein vorgenommen hast.

Wäre interessant zu wissen...

Danke für die Antwort.

Gruß
Daniel


----------



## Marc (8 Mai 2010)

Ja, einige, der FB kann jetzt auch auf FTP - und SQL Server loggen. Das Zeitformat ist MS Konform damit ist es möglich XY Diagramme in Excel zu erzeugen. Ein Sceduler zum Loggen ist dazu gekommen. Ringbuffer mit bis zu 10 Dateien ist jetzt möglich. Außerdem bin ich grade dabei ein Trendobjekt mit Ajax Technologien zu Bauen um die Daten in einer Webvisu als Trend darstellen zu können.


----------



## Vaninger (18 Mai 2010)

Hallo Marc,
erstmal sorry für die späte Antwort und auch danke für deine Antwort. Wie schon gesagt, dein Baustein funktioniert soweit echt prima. Logge ab und an meine Kälteanlage sowie andere Temperaturen mit und werte diese Daten dann per Excel aus. Ist ein wenig Formatierungsarbeit dabei, geht aber trotzdem ziemlich gut.
Lediglich bei dem Loggen der Umgebungstemperatur habe ich ein Problem. Wollte an vier verschiedenen Uhrzeiten pro Tag die Temperatur mitloggen. Also gebe ich um z. B 8 Uhr morgens einen kurzen Impuls (Zykluszeit) auf deinen Baustein. Leider schreibt dieser dann immer 4 bis 5 Temperaturwerte mit, alle mit Zeitstempel acht Uhr.
Weiß leider nicht wieso, aber egal.

Hier noch meine Verbesserungsvorschläge, die du aber ja scheinbar sowieso schon in deiner aktuellen Version berücksichtigt hast 

- Zeitstempel MS konform
- Eingabe von Abtastrate (Zeit zwischen Loggen) direkt in den Baustein
- evtl. Eingabe von Start und Endzeit des Loggens

Jetzt bin ich natürlich wieder absolut "heiß" auf deine aktuelle Version. Gibt es hier die Möglichkeit, dass du uns diese wieder zukommen läßt? 

Nochmal vielen Dank für den klasse Baustein.

Schöne Grüße

Daniel


----------



## Vaninger (13 Dezember 2011)

Hallo Marc,

bin gerade beim Stöbern wieder auf diesen Beitrag gestossen und wollte deshalb nochmal bei dir nachfragen, ob du mir bzw. uns deinen aktuellen Baustein nochmals zur Verfügung stellen würdest.

Ich finde den Baustein nach wie vor klasse und da ich im Moment mal wieder aktuell mit dem Baustein zu tun habe werde (Energiezählererfassung (verschiedene Stromzähler meiner Kältemaschine) über ein S0-Signal), wäre dieser sicher hilfreich. Außerdem hören sich deine Ergänzungen/Änderungen ja wirklich super an!

Falls du dafür einen kleinen Obolus haben willst, melde dich einfach per PM bei mir. Deine Arbeit soll ja auch belohnt werden...

Vielen Dank für deine Antwort und deiner Hilfe.

Schöne Grüße
Vaninger


----------

