Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Verständnisfrage zu Bytearray - Datei nach senden leer

2013-03-05
2013-03-08
  • JokoMeister - 2013-03-05

    Hallo liebe Forengemeinde,

    Ich habe folgendes Problem mit einem Bytearray:

    Ich lese alle 12h 2 Wasserzähler per MBUS aus. Klappt super und die Werte werden auch korrekt in der CSV Datei abgespeichert.
    Damit ich mich nicht selbst um den Download der Daten aus der WAGO 750-881 selbst bemühen muss, möchte ich die Daten gern per Mail an meine Adresse senden.
    Testmails senden klappt auch ohne Anhang super.
    Jetzt kommt mein Problem, die gespeicherte Datei als Anhang zu versenden. Es wird "irgend etwas" angehangen, mit ein paar lustigen Sonderzeichen, aber nicht der eigentliche Inhalt wird versendet.

    Hier mal ein Auszug vom Code:

       hFile:= SysFileOpen(szFilePath, 'a');
       dwWritten:= SysFileWrite(hFile, ADR(szText), LEN(szText));
       dwWritten:= SysFileWrite(hFile, ADR(wNewLine), SIZEOF(wNewLine)); (*bis hierhin ist alles OK  *)
    maildata := maildata + (hfile, ADR(bytearray));   (* hier wird erwartet: ptAttachment : POINTER TO ARRAY[0..MAX_SEND_TCP_CLIENT] OF BYTE;  von der WagoLibMail*)
    datasize := SIZEOF(maildata);  (* hier wird erwartet: diAttachmentLength   : DINT;  ebenfalls von der WAGO Lib
       SysFileClose(hFile);
    

    die letzten beiden Zeilen hab ich quasi als Dateigrößenermittlung dazugefügt, um die Infos den beiden Eingängen Mail_ESMTP_Client zu übergeben.
    gemeint ist also die WagoLibMail_02.lib Baustein Mail_ESMTP_Client

    ich verstehe nicht ganz, wie ich anhand der Datei das Bytearray festlegen kann.
    An der Dateigröße liegt es auch nicht, da ich den MAX_SEND_TCP_CLIENT in den glob. Variablen mit einem höheren Wert überschattet habe.
    Die Dateigröße selbst beträgt ebenfalls nur max. 7-9kb. (Also auch noch im Standard-Modus vertretbar)

    Wer kann mir hier weiter helfen?

    vielen Dank
    der Joko

     
  • Oberchefe - 2013-03-05

    Zitat:
    An der Dateigröße liegt es auch nicht, da ich den MAX_SEND_TCP_CLIENT in den glob. Variablen mit einem höheren Wert überschattet habe.

    das hilft nichts wenn der DSL-Router nicht mehr durchlässt.

    vom Code bräuchte ich noch etwas mehr um Deine Gedanken verstehen zu können. Ich sehe keine Deklaration (z.B. was soll maildata sein?) noch verstehe ich was die CSV-Geschichte mit E-Mail zu tun hat. Ich verwene nicht den gleichen E-Mail client, aber so wie ich den Codeauszug verstehe wird ein Pointer auf die Daten im Ram erwartet, das hat mit der CSV erst mal gar nichts zu tun.
    Im Zweifelsfall mal das ganze Projekt posten.

     
  • JokoMeister - 2013-03-06

    Hallo cheffe,

    ok, hab mal das Projekt in den Anhang gepackt.
    Das Projekt kann "etwas" wirr aussehen, da ich es nach und nach - wie man eben Zeit hat - aufgebaut habe.
    Ebenfalls habe ich noch ein paar Modbus Tests durchgeführt. Daher sind auch ein paar nicht mehr genutze Variablen vorhanden, die später aber wieder ihren Dienst verrichten sollen.

    EDIT:\ Eines wollte ich noch angemerkt haben: Dies ist mein erstes WAGO Projekt und das eher im "privaten" Bereich, da ich so den Einstieg in und mit WAGO lernen wollte.
    Mit simplen DI und DO wollte ich nicht anfangen, daher dachte ich mir, visualisierst du eben deine Bus-Zähler.

    Also bitte seid nicht all zu hart, falls meine Programmstruktur für euch nicht als "Struktur" ersichtlich sein sollte. Es sind immer nur abends 1-2 Stunden zur Verfügung und das nach der Arbeit

    wasser.pro [129.47 KiB]

     
  • Oberchefe - 2013-03-07

    also erst mal musst Du dafür sorgen dass Du die zu versendenden Daten wieder in einem Array landen. Entweder gleich parallel mit dem Schreiben ins Filesystem auch in ein Array packen, alternativ wieder aus dem Dateisystem lesen (was den Vorteil hat dass die Daten bei Stromausfall nicht weg sind).

    Reihenfolge:
    SysFileGetSize -> wir müssen wissen wieviel geladen werden soll
    SysFileOpen
    SysFileRead, bei Size die Rückmeldung vom SysFileGetSize angeben, bei Buffer reicht ADR(bytearray), das scheint ja sonst nirgendswo verwendet zu sein. Hier ein Auszug aus einer Schrittkette (mit Case Anweisung):

    If Startbedingung Then
       Schritt:=1;
    End_If
    CASE Schritt OF
    1:   ErgebnisVomSysFileGetSize:= SysFileGetSize(szFilePath);
          Schritt:=2;
    2:    hFile:=SysfileOpen(szFilePath, 'r');
          Schritt:=3;
    2:   BytesDone:=   SysFileRead(hFile, ADR(bytearray), ErgebnisVomSysFileGetSize);
             IF BytesDone = ErgebnisVomSysFileGetSize THEN
                Schritt:=3;
             END_IF
    3: Hier den Code für Startbedingung E-Mail-Versand platzieren
     Schritt:=0;
    END_CASE
    maildata:= ADR(bytearray);
    datasize:=ErgebnisVomSysFileGetSize;
    

    dann sollte das funktionieren. Code natürlich jetzt nicht getestet, sollte aber ungefähr so funktionieren

     
  • JokoMeister - 2013-03-08

    Hallo Cheffe,

    besten Dank für die Info.

    Ich glaube auch zu wissen, warum er nicht richtig gesendet hatte:

    • ich habe lediglich die neu geschriebenen Werte als Dateigröße abgefragt.
      Wie du beschrieben hast, muss ich aber die komplette Dateigröße ermitteln...

    Ich denke mal, dies war der eigentliche Fehler.

    Ich werd den Code mal testen, und melde mich, wenn ich Ergebnisse hab.

    Vielen Dank nochmals...

    mfg
    Joko

     

Log in to post a comment.