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
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.
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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________________ifnotboOpenthen
  boOpen:=TRUE;
  File_open :=SysFileOpen('test.txt','r');end_if
Des weiteren solltest du das Schließen nicht vergessen.
MfG
KlOis
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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_IFEND_FOR
Danke für eure Antworten!
Mfg
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:
  FORk:=1TOtat_maxDO
  FORl:=0TOzlenDO
    IFmidi_b[k,l]=9THEN
      l:=l+6;
      IFl>=zlenTHEN
        l:=l-zlen;
        k:=k+1;
      END_IF
            IFmidi_b[k,l]=8THEN
              FORi:=0TO1DO
                a:=LEN(wert[i]);
                IFa=0THEN
                  wert[i]:=BYTE_TO_STRING(midi_b[k,l]);
                  l:=l+1;
                  IFl>=zlenTHEN
                    l:=l-zlen;
                    k:=k+1;
                  END_IF
                ELSEEXIT;
                END_IF
              END_FOR
              FORi:=0TO1DO
                b:=LEN(wert_2[i]);
                IFb=0THEN
                  wert_2[i]:=BYTE_TO_STRING(midi_b[k,l]);
                  l:=l+1;
                  IFl>=zlenTHEN
                    l:=l-zlen;
                    k:=k+1;
                  END_IF
                ELSEEXIT;
                END_IF
              END_FOR
                c:=LEN(wert_ge);
                IFc=0THEN
                  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);
                IFd=0THEN
                  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_FOREND_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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
END_IF
Meiner Meinung nach liegt es an der Pfadangabe der Datei.
Ich bitte um eure Hilfe und danke schon im Voraus.
Mfg
Patrick
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
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
Hey,
wo liegt denn die Datei auf der Steuerung...leg sie mal da ab wo dein Programm (DEFAULT.PRG) auch gespeichert wird.
Dann
Des weiteren solltest du das Schließen nicht vergessen.
MfG
KlOis
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
Danke für eure Antworten!
Ich hab das Problem schon lösen können!
Vielen, vielen Dank! =)
Beitrag kann geschlossen werden!
mfg
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
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:
Danke für eure Antworten!
Mfg
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.
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:
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
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:
Ich kann auch nicht erkennen als was dein l deklariert ist, ist es eine signed Variable?
MfG
KlOis