Problem mit Sysfileopen

DarkDog

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Forumsgemeinde!

Nachdem ich das Internet für längere Zeit durchfostet habe um mein Problem zu lösen und nichts relevantes gefunden habe wende ich mich an euch.

Ich möchte in CodeSys V2.3 eine .txt-Datei einlesen und darin den Inhalt auswerten.

Meine Informationssuche hätte mich da auf den Befehl "sysfileopen" gebracht, doch der liefert nur eine "0" als Funktionswert. Also einen Fehler.

Die sysfile.lib ist eingebunden.

Das Zielsystem ist eine ABB AC500-eCo.

Der Kundenservice von ABB Deutschland hat mir als Antwort geschrieben, dass er nicht dafür zuständig ist.

Ihr seit also meine letzte Hoffnung.

Ich danke schon im voraus für euer Bemühen.

Mfg
 
Ohne jedes Stück Quellcode kann man da nur raten.

Hast Du den Dateipfad richtig und für das System passen angegeben?
 
Sorry, an den hatte ich nicht gedacht.
Hier ist der relevante Programmiercode:

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

IF myTON.Q THEN

File_open := SysFileOpen('C:\1.Versuche.txt','R');

END_IF

Das mit dem Sekunden Oszi habe ich aus diesem Forum übernommen.
Wie gesagt, ich hab schon einiges durchstöbert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es steht der Hex-Code eines Midifiles in der Textdatei.
Ich kann ja denn Code mal hier rein kopieren falls es relevant sein sollte.

4D546864000000060001000200F04D54726B0000001300FF58040202180800FF510307F60B00FF2F004D54726B000004C100B0077F00B0077F00B0077F00B0077F00B0077F00B0077F00B0077F00B0077F009041506080414018904350608043401890455060804540189046506080464018903950009048506080394018903750488048401880374018903950009048506080394018903550488048401880354018903A500090465000904A5060804A40008046401890465000904A5048803A4018804A400080464018903E500090465000904A5060804A40008046401890465000904A5048803E4018804A400080464018904150009045500090485060804140189040506080404018903E5060803E4018903E50188048400080454048803E4018903A500090465000904A5060804A40008046401890465000904A5048803A4018804A400080464018903E500090465000904A5060804A40008046401890465000904A5048803E4018804A4000804640189041500090455000904850608041401890405060804040189041508110804840008045403080414030903C5000904650009043506080434000804640189046500090435048803C40188043400080464018903D5000904650009043506080434000804640189046500090435048803D40188043400080464018903E50009045500090415060803E401890405048804140008045401880404018903E50009045500090415081408041400080454000803E4030903A5000904350009041506080414000804340189043500090415048803A40188041400080434018903C5000904350009041506080414000804340189043500090415048803C40188041400080434018903950009041506080394018903A5060803A401890395081108041403080394030903550009041506080414000803540189037500090435060804340008037401890395000904550608045400080394018903A50009046506080464000803A4018903C5000904850814080484000803C4030903C5000904850814080484000803C4030903A500090465000904A5060804A400080464000803A4018903C500090465000904A5060804A400080464000803C4018903E500090465000904A5060804A400080464000803E40189040500090465000904A5060804A4000804640008040401890415000904550009048508140804840008045400080414030903550814080354030903A500090465000904A5060804A400080464000803A4018903C500090465000904A5060804A400080464000803C4018903E500090465000904A5060804A400080464000803E40189040500090465000904A5060804A4000804640008040401890415000904550009048508140804840008045400080414030903550814080354030903A500090435000904650608046400080434000803A401890305000904350009046506080464000804340008030401890325000904350009046506080464000804340008032401890345000904350009046506080464000804340008034401890355000904150009045508140804540008041400080354030902950009045500090415081408041400080454000802940309030500090405060804040008030401890325000904150608041400080324018903450009043506080434000803440189030500090405060804040008030401890355000903950009041508140803940008035403090295081108041403080294000FF2F00

Aber ich denke es sollte ja egal sein was in der Textdatei steht, oder?
 
ich würds immernoch mit den FB_FileOpen ... usw machen. das wird auf jeden fall klappen! Die dos befehle kann ich mir net vorstellen das es wirklich geht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@zotos:
Ich bin mir nicht sicher ob die SPS ein DOS/Windows - Dateisystem hat.
Eine Datei zu schreiben hätte ich schon versucht und hat nicht funktioniert.

@dante:
Erläuter mir mal das mit den FB_FileOpen bitte etwas genauer.
In der Hilfe hätte ich davon nichts gefunden.
 
@zotos:
Ich bin mir nicht sicher ob die SPS ein DOS/Windows - Dateisystem hat.
Eine Datei zu schreiben hätte ich schon versucht und hat nicht funktioniert.

Wenn das Betriebsystem nicht gerade Windows ist, denke ich nicht das es ein Dos Dateisystem hat.

Ich würde es eher mit:
Code:
SysFileOpen('/1.Versuche.txt','r');

bzw.

SysFileOpen('\1.Versuche.txt','r');
versuchen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Erst mal die Pfadangabe weglassen, einfach nur den Dateinamen

Dann ist die Sysfileopen zwar eine Funktion, bringt das Ergebnis aber nicht im gleichen Zyklus. Also:
Schrittkette aufbauen. Sysfileopen ausführen und warten bis Rückgabewert >0. Wenn das ok, dann weiter im nächsten Schritt.
Also hier mal ein funktionierendes Beispiel (in diesem Fall Schreiben), ist zwar für Wago, sollte aber auch mit anderen Steuerungen ähnlich aussehen:
Code:
IF stat <0  THEN
    stat:=stat*-1;
END_IF

CASE stat OF

100:
        Filename:='Setting.txt';
        Mode:='w';
        stat:=-101;
101:
        RGWW:=SysFileOpen(FileName, Mode);
        IF RGWW>0 THEN
            stat:=-102;
        END_IF
102:
        BytesDone:=    SysFileWrite(RGWW, ADR(G_HMI), SIZEOF(G_HMI));
        IF BytesDone = SIZEOF(G_HMI) THEN
                stat:=-103;
        END_IF
103:
        SysFileClose(RGWW);
        Stat:=    -104;
END_CASE
 
Zuletzt bearbeitet:
Ich habe all eure Vorschläge ausprobiert doch leider funktioniert keiner.

@Oberchefe:
Der Wert von RGWW bleibt immer 0.
 
die sysfileopen stanmmt aber nicht von ABB? Ich finde bei denen nur Libs wie z.B. " FLASH_READ "


Einfach eine Lib von einer anderen Hardware nehmen funktioniert nicht!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, die library stammte nicht von ABB, ich hatte den Kundendienst schon kontaktiert.

So erfahren bin ich (noch) nicht mit SPSen, das ich so etwas in Betracht gezogen hätte! =)

Wo kann librarys von ABB herunterladen. In der Schnelle fand ich nur einen ABB Library Downloadmanger. Ich glaub nicht, dass der das ist was ich brauche, oder irre ich mich?
 
Hab das Problem lösen können!
Es geht doch mit sysfileopen!

Danke für eure Antworten und Tipps!

Thread kann geschlossen werden!

mfg
 
Hab das Problem lösen können!
Es geht doch mit sysfileopen!

Danke für eure Antworten und Tipps!

Thread kann geschlossen werden!

mfg
Könntest Du uns auch mitteilen, WIE Du das Problem gelöst hast?

Andere User stehen vielleicht mal vor dem gleichen Problem wie Du, hoffen auf eine Lösung und finden dann nur ein "Es geht". :(

Threads werden hier nicht geschlossen, vielleicht hat ja irgendwann jemand eine alternative Lösung oder eine Nachfrage.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry Harald!

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:

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

Danke für eure Antworten!

Mfg
 
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:

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

Danke für eure Antworten!

Mfg

Weil du dir quasi eine Endlosschleife gebaut hast:

Bis i=50 kein Thema. Wenn dann i=51 ist, wird in der IF-Schleife i wieder 50. Bei Neueinstieg in die For-Schleife wird i inkrementiert auf 51 und du hast wieder den gleichen Fall. Aus diesem kommst du nicht mehr heraus.
 
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:

Code:
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;

                                a:=0; b:=0; c:=0; d:=0;
                                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 ja auch!

Mfg
 
Zurück
Oben