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

Problem bei Datei einlesen mit sysfileopen

2011-03-10
2011-03-21
  • drummerboy119 - 2011-03-10

    Guten Tag liebe Forumsgemeinde!

    Ich hätte ein Anliegen:

    Ich benutze CodeSys V2.3 und die Steuerung ABB AC500-eCo und möchte eine *.txt-Datei einlesen und in CodeSys auswerten.
    Das Auswerten wäre nicht das Problem, aber beim einlesen hänge ich.

    Nach meinen Recherchen wäre der Befehl 'sysfileopen' dafür geeignet.
    Ich bekomme als Rückgabewert aber nur eine 0, was laut Hilfe ein Fehler ist.

    Hier der Programmcode:

    myTON(IN:=NOT myTON.Q, PT:=t#1s); ( Sekunden oszi )

    IF myTON.Q THEN

    File_open := SysFileOpen('/1_Versuche.txt','r');
    

    END_IF

    Meiner Meinung nach liegt es an der Pfadangabe der Datei.

    Ich bitte um eure Hilfe und danke schon im Voraus.

    Mfg
    Patrick

     
  • Isegrim - 2011-03-10

    Hallo Patrick,

    Ich arbeite zwar mit Wago, aber laß doch mal bei der Pfadangabe den Schrägstrich weg und nenne die Datei nur 'Versuche.txt'.
    Zum Ausschließen von weiteren Fehlern solltest Du auch die IF-Schleife erst mal weg lassen. Ggf. kannst Du auch der Variablen File_open einen Wert (z.B. 50) zuweisen, um zu überprüfen, ob sie den Wert 0 von Sysfileopen zugewiesen bekommt, oder der ganze Funktionsaufruf nicht funktioniert.
    Sysfileopen öffnet/erzeugt die Datei nur, das Einlesen geschieht dann über Sysfileread.

    Grüße
    Klaus

     
  • drummerboy119 - 2011-03-11

    Ich habe die IF-Schleife weggelassen und auch der Variable 'File_open' einen Wert (22) zugewiesen.
    Nach einem Zyklus war 'File_open' wieder 0, es wird also konkret ein Fehler zurückgegeben.

    Ich kämpfe nun schon ziemlich lange mit dem Befehl 'sysfileopen'.
    Gibt es eventuell Alternativen?

    mfg

     
  • KlOis - 2011-03-11

    Hey,

    wo liegt denn die Datei auf der Steuerung...leg sie mal da ab wo dein Programm (DEFAULT.PRG) auch gespeichert wird.
    Dann

    VAR
       File_open:   DWORD;
       boOpen:     BOOL;
    END_VAR
    ________________
    if not boOpen then
       boOpen:=TRUE;
       File_open := SysFileOpen('test.txt','r');
    end_if
    

    Des weiteren solltest du das Schließen nicht vergessen.

    MfG

    KlOis

     
  • Dennis Lo - 2011-03-14

    Wenn noch nichts funktioniert hat pro doch mal folgenden Pfad 'c/1_Versuche.txt' wobei du 'c' durch den speicherort der datei ersetzt wird.
    'c' ist bei meiner Steuerung zB ein USB Stick, 'a' ist der interne speicher usw. musst halt gucken wo du die datei dann abgespeichert hast.

    mfg

     
  • drummerboy119 - 2011-03-15

    Danke für eure Antworten!
    Ich hab das Problem schon lösen können!
    Vielen, vielen Dank! =)

    Beitrag kann geschlossen werden!

    mfg

     
  • Matze001 - 2011-03-16

    Wärest du auch so nett uns zu erzählen WIE du WELCHES Problem gelöst hast
    Falls noch einmal jemand das gleiche Problem wie du bekommst kann er den Beitrag lesen und muss
    nicht selbst fragen.

    Grüße

    Marcel

     
  • drummerboy119 - 2011-03-18

    Also,
    Ich hatte den Adresspfad falsch angegeben und ich war in dem fälschlichen Glauben die Datei befindet sich bereits auf der Steuerung, obwohl sie es nicht war!
    Es gehört 'Versuche.txt' anstelle von irgendwelchen Verzeichnissen oder slashes!
    Falls noch jemand Fragen an mich hat kann er mir gerne schreiben.

    Ich hätt da noch ne Frage so nebenbei:

    Warum bekomm ich einen Laufzeitfehler #16 sobald ich in einer FOR-Schleife die Zählvariable um 1 verringern will? also:

    FOR i:=0 TO 100 DO
              a:=b;
       IF i>50 THEN
          i:=i-1;
       END_IF
    END_FOR
    

    Danke für eure Antworten!

    Mfg

     
  • Matze001 - 2011-03-18

    Weil du die Steuerung solange "anhälst" wie deine FOR-Schleife aktiv ist.

    Denk daran das dein Programm eh schon zyklisch abgearbeitet wird, und nutze dies!

    Grüße

    Marcel

    Edit: Dazu kommt das du nur von 100 bis 50 zählst, danach dekrementierst du nicht mehr, somit hängt die Steuerung endlos in der For-Schleife.

     
  • drummerboy119 - 2011-03-19

    Das war nur ein Beispiel!
    Ich bekomme Allgemein einen Laufzeitfehler #16 sobald ich von einer Schleife den Zählindex verringern will, warum?
    Geht das überhaupt nicht oder gibt es dabei irgendeinen Trick?

    Hier der Echte Code wo es hängt:

        FOR k:=1 TO tat_max DO
        FOR l:=0 TO zlen DO
            IF midi_b[k,l]=9 THEN
                l:=l+6;
                IF l>=zlen THEN
                    l:=l-zlen;
                    k:=k+1;
                END_IF
                            IF midi_b[k,l]=8 THEN
                                FOR i:=0 TO 1 DO
                                    a:=LEN(wert[i]);
                                    IF a=0 THEN
                                        wert[i]:=BYTE_TO_STRING(midi_b[k,l]);
                                        l:=l+1;
                                        IF l>=zlen THEN
                                            l:=l-zlen;
                                            k:=k+1;
                                        END_IF
                                    ELSE EXIT;
                                    END_IF
                                END_FOR
                                FOR i:=0 TO 1 DO
                                    b:=LEN(wert_2[i]);
                                    IF b=0 THEN
                                        wert_2[i]:=BYTE_TO_STRING(midi_b[k,l]);
                                        l:=l+1;
                                        IF l>=zlen THEN
                                            l:=l-zlen;
                                            k:=k+1;
                                        END_IF
                                    ELSE EXIT;
                                    END_IF
                                END_FOR
                                    c:=LEN(wert_ge);
                                    IF c=0 THEN
                                       wert_ge:=CONCAT(wert[0],wert[1]);
                                    END_IF
                                    wert_val:=STRING_TO_WORD(CONCAT('16#',wert_ge));
                                    wert_int:=WORD_TO_INT(wert_val);
                                    d:=LEN(wert_2_ge);
                                    IF d=0 THEN
                                       wert_2_ge:=CONCAT(wert_2[0],wert_2[1]);
                                    END_IF
                                    wert_2_val:=STRING_TO_WORD(CONCAT('16#',wert_2_ge));
                                    wert_2_int:=WORD_TO_INT(wert_2_val);
                                    wert_fert:=wert_int+wert_2_int-1;
                                    l:=l-8;
                                    END_IF
          END_FOR
    END_FOR
    

    Ich lese ja aus einer txt-Datei Informationen aus und er kommt nur alle paar Zeichen in die IF-Bedingung. Dort habe ich zur Programmreduzierung zuerst die spätere Information und dann die frühere ausgelesen, doch dies gefällt ihm leider nicht.
    Wenn ich das l:=l-8 weglasse funktioniert es, falls es dabei ist kommt der Laufzeitfehler #16.
    Wo liegt hier der Fehler? Addieren geht doch, warum nicht subtrahieren?

    Mfg

     
  • KlOis - 2011-03-21

    Generell ist es natürlich schlecht in der FOR-Schleife die Schleifenvariable zu ändern.
    Eigentlich macht das die Schleife selbst. Willst du die Variable runter zählen, dann:

    VAR
       iLoop:   int;
    END_VAR
    ________________
    FOR iLoop:=50 TO 1 BY -1 DO
       Anweisung();
    END_FOR
    

    Ich kann auch nicht erkennen als was dein l deklariert ist, ist es eine signed Variable?

    MfG
    KlOis

     

Log in to post a comment.