# Codesys - Einen Text mit Erstellen



## Pepper (5 November 2009)

Hallo liebe Community,
ich habe mal wieder ein Problem wo ich nicht weiterkomme und ihr mir bestimmt wieder helfen könnt.

Da ich keine Experte auf dem Gebiet "SPS" bin sondern eher hobbymäßig rumspiele, würde ich euch bitten eure Antworten so zu formulieren, dass ein leihe (wie ich) sie verstehen kann.

Zu meinem Problem:

Ich habe ein 750-841 mit dem ich Messdaten sammel und per Email verschicken möchte. 

Mein Problem ist das Abspeichern der Daten. Die Daten sollten alle 5 min abgespeichert werden (Ich habe 10 Messpunkte) und mit einem Zeitstempel versehen werden. Also quasi wie eine Tabelle aus , Datum/Uhrzeit, Text und Messwert. 

z.B. : 10:36 - 05.11.09 Temperaturfühler1:  23.45 °C

Die Messwerte sollen dann alle untereinander geschrieben als Email versendet werden.

Die Messwerte sollten nicht lokal in eine txt Datei gespeichert werden, sondern nur innerhalb der Codesys.



Grüße Pepper


----------



## witkatz (8 November 2009)

Hi Pepper,

unter Benutzung der Oscat könnte das Bilden der Texte so aussehen:

```
VAR
    loop: INT;
    dtAktDatumUhrzeit: SDT;
    arrMesswerte: ARRAY[1..10] OF REAL;
    arrMesswerteKlartext: ARRAY[1..10] OF STRING;
END_VAR
FOR loop:= 1 TO 10 DO
    (* Textzeile bilden: Zeitstempel Messstelle Wert Einheit CRLF, Vorgabe: 10:36 - 05.11.09 Temperaturfühler1: 23.45 °C *)
    arrMesswerteKlartext[loop]:= DWORD_TO_STRF(dtAktDatumUhrzeit.HOUR, 2);
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], ':');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], DWORD_TO_STRF(dtAktDatumUhrzeit.MINUTE, 2));
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], ' - ');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], DWORD_TO_STRF(dtAktDatumUhrzeit.DAY, 2));
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], '.');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], DWORD_TO_STRF(dtAktDatumUhrzeit.MONTH, 2));
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], '.');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], DWORD_TO_STRF((dtAktDatumUhrzeit.YEAR MOD 100), 2));
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], ' ');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], 'Temperaturfühler');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], INT_TO_STRING(loop));
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], ': ');
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], REAL_TO_STRF(arrMesswerte[loop], 1));
    arrMesswerteKlartext[loop]:= CONCAT(arrMesswerteKlartext[loop], ' °C$N');
END_FOR
```
Ich kann dir leider nicht sagen, wie man auf der 750-841 eine Email versendet.

Gruß,
witkatz


----------



## Pepper (9 November 2009)

Hallo Witkatz,
erstmal vielen Dank für deine Mühe. Deine Lösung hat mich schon mal ein ganzes Stück weitergebracht. Leider wird bei mir der Zeitstempel nicht richtig angezeigt. Ich habe dazu mal ein Bild angehängt. Alles was ich vom Zeitstempel bekomme ist: "009". Leider komme ich nicht drauf wo das Problem liegt. Ich benutze die neuste Version von Oscat. 

Mein Emailproblem habe ich mittlerweile gelöst bekommen mit der WagolibMail_02.

Grüß Pepper


----------



## Pepper (9 November 2009)

hm, da war ich ein bisschen voreilig mit meiner Antwort . Wenn ich das Programm direkt auf der Steuerung laufen lasse funktioniert es einwandfrei. Nur im Simulationsmodus bekomme ich den beschriebenen Fehler.

Gruß Pepper


----------



## Pepper (13 November 2009)

So, ich habe nochmal ein paar Tests gemacht und bin zu der Erkenntnis gekommen, das ich meinen Text-String am besten in ein "Array of Byte" (ASCII) schreiben sollte um diesen dann zu in einer txt zu verschicken. Dann hätte ich keine Probleme mehr mit der Formatierung.
Hat jemand ne Idee oder eine Lösung wie ich sowas anstellen könnte.

Ich hatte ja oben schon mal meinen Code gepostet. Dort erstelle ich einen String. Kann man diesen eventuell umschreiben, sodass ich meinen Text direkt in ein Bytearray scheiben kann? Oder gibt es irgendwelche interessanten Convert-funktionen? (Hab bisher leider keine gefunden)

Interessant wär auch eine Funktion, die meinen kompletten String in ein Byte Array schreibt.

Ich bin gespannt auf eure Vorschläge


----------



## witkatz (13 November 2009)

Hallo Pepper,

hast du in deiner Umgebung die Funktion MEMCPY? Du könntest die Daten aus dem Text in dein Array of Byte per Memcpy übertragen. 

Gruß,
witkatz


----------



## Pepper (13 November 2009)

Danke für den Tip witkatz,
Das bringt mich schon wieder ein ganzes Stück weiter an mein Ziel.

Da ich gerade erst angefangen habe in ST zu programmieren, bin ich leider noch nicht ganz so fit.

Ich kann jetzt also mein String in ein ASCII-Byte umwandeln. Aber wie sage ich dem Byte-Array ab wann er den String dahinter setzen soll und nicht ersetzen?

Ich habe jetzt meine Messdaten nicht mehr in in "ARRAY OF STRING" geschrieben, sondern in ein "STRING". Dieser String bekommt jetzt alle t#n ms einen neuen Text reingeschrieben. Ich möchte, das die ASCII-Werte bei veränderung des "Text-Strings" hinten (am Byte-Array) angefügt werden. So wie bei CONCAT nur eben für "Byte-Arrays".


----------

