[TwinCAT 3] Riesige Mengen Daten speichern/verwalten

Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn busy auf True bleibt wird als nächstes das error-Flag und error-State interessant.
Die Codes des error-state findest Du an verschiedenen Stellen im Infosys.
Irgendwo im Infosys gibt es auch ein Codebeispiel für die Bausteine, hab es aber gerade nicht zur Hand. Da ist eine beispielhafte Aufrufstruktur drin.
 
Ja, den Errorcode von dem FileWrite habe ich ja schon geschrieben.

Komme aber trotzdem nicht weiter...
Warum ist es denn so schwer einen Array abzuspeichern? :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei dem Abspeichern in einer Datei würde ich noch folgenden Dinge realisieren:
- Begrenzung auf max. Dateigröße, danach eine neue aufmachen, z.B. nur 100 MByte pro Datei
- Eine Art Doppelpufferung realisieren. D.h. während die eine Datei geschrieben wird schon eine zweite öffnen und zum Schreiben vorbereiten. Wenn die erste Datei "voll" ist kannst du direkt ohne Zeitverzug umschalten und dann im Hintergrund die andere Datei schließen und wieder eine neue aufmachen. Das Öffnen und Schließen dauert länger als einen Zyklus, je nach Betriebssystem im Hintergrund.
 
Aber so viel kann man da doch gar nicht falsch machen. Ich rufe die FileOpen FB solange auf, bis meine busyflag auf false geht... danach dann die write fb solange bis davon die flag false wird und danach dann die close ...
verstehe meine Fehler nicht :(
 
Leute, ich verzweifle gerade wirklich. Das kann doch nicht so schwer sein, einen verdammten Array in ein txt-File zu schreiben?

Ich bekomme das echt nicht hin. Kann mir wirklich keiner helfen? Probiere das schon seit einigen Stunden.
Ich habe das Infosys schon tausendmal gelesen und ich erkenne wirklich keinen Fehler...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich rufe die FileOpen FB solange auf, bis meine busyflag auf false geht... danach dann die write fb solange bis davon die flag false wird und danach dann die close ...
Ja was denn jetzt? In Beitrag #20 schreibst Du, dass Du die Befehle nur einmal ausführst und jetzt schreibst Du, dass Du Sie immer wieder ausführst. Bei der Gelegenheit, ich bin Dir noch eine Antwort schuldig. "ePath" ist ein Eingang von FB_FileOpen und wenn ich die Doku richtig verstanden habe sollte dieser Eingang für Deinen Fall auf "PATH_GENERIC" gesetzt werden. Wenn Dein Programm immer noch so aussieht wie in Beitrag #12 kann nichts funktionieren, denn da werden die Befehle ausgeführt und nicht auf Busy = FALSE gewartet. Die Dateibefehle müssen über mehrere Zyklen immer wieder aufgerufen werden, erst FB_FileOpen, wenn der Busy = FALSE setzt und keinen Fehler meldet darfst Du FB_FileWrite aufrufen und wenn der Busy auf FALSE setzt FB_FileClose.
 
Code:
FOR iState := 0 TO 10 DO
    aArray[iState] := iState;
END_FOR


CASE i OF
    
0:    fb_FileOpen( bExecute := FALSE );
    fb_FileOpen(sNetId:='',sPathName:='C:\Users\Desktop\test4499994tt.txt',nMode:=FOPEN_MODEWRITE,tTimeout:=T#3S,bExecute:=TRUE);
    i:=5;
        
    
    
5:        fb_FileOpen( bExecute := FALSE );
        
        IF NOT fb_FileOpen.bBusy THEN
            i := 10;
        END_IF

        
        
        
10:    fb_FileWrite( bExecute := FALSE );
    fb_FileWrite(sNetId:='',hFile:=fb_FileOpen.hFile,pWriteBuff:=ADR(aArray),cbWriteLen:=SIZEOF(aArray),tTimeout:=T#3S,bExecute:=TRUE);
    i:=15;
    
    
        
15:        fb_FileWrite( bExecute := FALSE );

        IF NOT fb_FileWrite.bBusy THEN
            i := 20;
        END_IF

        
20: fb_FileClose( bExecute := FALSE );
    fb_FileClose(sNetID:='',hFile:=fb_FileOpen.hFile,bExecute:=bStart);
    i:=25;
    
25: fb_FileClose( bExecute := FALSE );
     i:=30;


30: //.... ende

    
    END_CASE


Die Flags werden auf jeden Fall schonmal FALSE. Aber er schreibt immer noch keine Daten in die .txt Datei.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
wo hängt es denn? Gibt denn irgend einer deiner Bausteine eine ErrId aus?
Wird eine Datei an deinem angegebenen Pfad erzeugt oder existiert sie schon? Auf meinem CX-System habe ich die Pfadangaben mit einem / und nicht mit einem \ angegeben. Gibt es den Ordner /Users/Desktop überhaupt und hat TwinCat dort Schreibrechte?
Hast du eine Instanz von den Bausteinen erzeugt? Und dann fällt mir auf, dass du sie mindestens 2mal pro Zyklus aufrufst. Besser wäre (wie Oliver auch schon geraten hat), die Instanzaufrufe außerhalb der Case-Schrittkette zu machen und innerhalb des Case nur die Bits zu setzen.
Dann sehen wir mal weiter.
Gruß
Holger
 
Moin,
wo hängt es denn? Gibt denn irgend einer deiner Bausteine eine ErrId aus?
Wird eine Datei an deinem angegebenen Pfad erzeugt oder existiert sie schon? Auf meinem CX-System habe ich die Pfadangaben mit einem / und nicht mit einem \ angegeben. Gibt es den Ordner /Users/Desktop überhaupt und hat TwinCat dort Schreibrechte?
Hast du eine Instanz von den Bausteinen erzeugt? Und dann fällt mir auf, dass du sie mindestens 2mal pro Zyklus aufrufst. Besser wäre (wie Oliver auch schon geraten hat), die Instanzaufrufe außerhalb der Case-Schrittkette zu machen und innerhalb des Case nur die Bits zu setzen.
Dann sehen wir mal weiter.
Gruß
Holger

Es hängt daran, dass nichts in mein File geschrieben wird. Es bleibt einfach leer.
Es wird erzeugt, aber es wird nicht hineingeschrieben.

Den Ordner gibt es natürlich. Instanz habe ich oben erzeugt. Das habe ich nicht hier rein kopiert.

Das letzte verstehe ich nicht... Was sind Bits?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
FOR iState := 0 TO 10 DO
    aArray[iState] := iState;
END_FOR


CASE i OF
    
0:    fb_FileOpen( bExecute := FALSE );
    fb_FileOpen(sNetId:='',sPathName:='C:\Users\Desktop\test4499994tt.txt',nMode:=FOPEN_MODEWRITE,tTimeout:=T#3S,bExecute:=TRUE);
    
[/QUOTE]

Nehmen wir diese kleine Code-Beispiel von dir: die 1. Frage wäre: hast du vom fb_FileOpen eine lokale Instanz erzeugt oder rufst du quasi den FB aus der Bibliothek auf? Ich kann das hier leider nicht sehen, aber da der Name identisch ist mit dem aus der Bibliothek, fürchte ich, dass du noch keine Instanz erzeugt hast.
Das nächste wäre, dass du in diesem Step den Baustein zweimal aufrufst. Du solltest die Bausteine nur einmal pro Zyklus aufrufen und innerhalb der Case-Anweisung nur mit den einzelnen Ein- und Ausgangsvariablen arbeiten. In etwa so:

VAR
  TextFileOpen  :fb_FileOpen;
  bOpenExecute :BOOL;
END_VAR

CASE i of
0:
  bOpenExecute := true;
 ...
5:
  bOpenExecute := false;
...
end_case;

TextFileOpen(
   sNetId:='',
   sPathName:='C:\Users\Desktop\test4499994tt.txt',
   nMode:=FOPEN_MODEWRITE,
   tTimeout:=T#3S,
   bExecute:= bOpenExecute
   );
 
Code:
j := 11;
test := INT_TO_STRING(j);

CASE i OF


0: bExecute0 := TRUE;   //Wird unten ausgeführt
 i:=5;



5: bExecute0 := FALSE;
 IF NOT fb_FileOpen.bBusy THEN
  i := 10;
 END_IF

10: bExecute1 := TRUE;
 i := 15;



15:  bExecute1 := FALSE;
 IF NOT fb_FileWrite.bBusy THEN
  i := 20;
 END_IF

20: bExecute2 := TRUE;
 i:=25;
 
25: bExecute2 := FALSE;
 IF NOT fb_FileClose.bBusy THEN
  i := 30;
 END_IF

30: //end

END_CASE


fb_FileOpen(sNetId:='',sPathName:='C:\Users\Desktop\1.txt',nMode:=FOPEN_MODEWRITE,tTimeout:=T#3S,bExecute:=bExecute0);
fb_FileWrite(sNetId:='',hFile:=fb_FileOpen.hFile,pWriteBuff:=ADR(test),cbWriteLen:=SIZEOF(test),tTimeout:=T#5S,bExecute:=bExecute1);
fb_FileClose(sNetID:='',hFile:=fb_FileOpen.hFile,bExecute:=bExecute2);

es funktioniert! Ich habe gerade meinen ersten string in ein File geschrieben. Das funktioniert aber nur mit strings, nehme ich an?

Wenn ich ganze Arrays in eine Datei schreiben möchte, dann muss ich jeden einzelnen Wert in einen String umwandeln und dann einzeln in das file schreiben?

Kann man da nicht gewisse Strukturen anlegen, wie eine Tabelle?
 
Zurück
Oben