# Problem mit Sysfileopen



## DarkDog (3 März 2011)

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


----------



## zotos (4 März 2011)

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

Hast Du den Dateipfad richtig und für das System passen angegeben?


----------



## dante (5 März 2011)

ohne mehr zu wissen versuch 
FB_FileOpen 
FB_FileRead
FB_FileClose

schönen abend


----------



## DarkDog (7 März 2011)

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.


----------



## dante (7 März 2011)

Was steht denn in der Textdatei?


----------



## DarkDog (7 März 2011)

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?


----------



## zotos (7 März 2011)

DarkDog schrieb:


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



Ich kenne die ABB Steuerung nicht. Aber hat die wirklich ein DOS/Windows Dateisystem? 

Hast Du schon mal versucht eine Datei zu erstellen?


----------



## dante (7 März 2011)

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


----------



## DarkDog (7 März 2011)

@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.


----------



## Commander_Titte (7 März 2011)

Hallo DarkDog,
Wenn dein Zielsystem ein Filesystem besitzt, dann versuch mal in den Ordnername keinen Punkt zu setzten. 



DarkDog schrieb:


> File_open := SysFileOpen('C:\*1.Versuche*.txt','R'); --> Ändern in
> 
> File_open := SysFileOpen('C:\*1_Versuche*.txt','R');



MFG
Christoph


----------



## zotos (7 März 2011)

DarkDog schrieb:


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

```
SysFileOpen('/1.Versuche.txt','r');

bzw.

SysFileOpen('\1.Versuche.txt','r');
```
versuchen.


----------



## Oberchefe (7 März 2011)

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:
	
	



```
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
```


----------



## DarkDog (9 März 2011)

Ich habe all eure Vorschläge ausprobiert doch leider funktioniert keiner.

@Oberchefe:
Der Wert von RGWW bleibt immer 0.


----------



## Oberchefe (10 März 2011)

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!


----------



## DarkDog (10 März 2011)

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?


----------



## DarkDog (15 März 2011)

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

Danke für eure Antworten und Tipps!

Thread kann geschlossen werden!

mfg


----------



## PN/DP (15 März 2011)

DarkDog schrieb:


> Hab das Problem lösen können!
> Es geht doch mit sysfileopen!
> 
> Danke für eure Antworten und Tipps!
> ...


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


----------



## DarkDog (18 März 2011)

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:


```
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


----------



## Cerberus (18 März 2011)

DarkDog schrieb:


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


 
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.


----------



## DarkDog (19 März 2011)

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;

                                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


----------

