TC3: Anomalie beim Erstellen einer Textdatei

chriss95

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo werte Forenmitglieder,

ich beschäftige mich seit 4 Wochen mit Twincat 3 und hab die Aufgabe, eine Textdatei (in diesem Fall .json) mit späteren Prozessvariablen zu erzeugen und zu speichern, um später darauf zugreifen zu können.
Der Quellcode ist im Moment erstmal nur ein Prototyp und soll im Laufe der Zeit ausgebaut und verfeinert werden.

Code:
PROGRAM MAIN
VAR
 jsonDatei    : STRING(255);
 dateiNummer   : INT   := 1;
 dateiNamen   : STRING;
 
 bInitCreate   : BOOL  := FALSE;
 bInitFile   : BOOL  := FALSE;
END_VAR




IF NOT bInitCreate THEN                                                                  //wenn noch kein Sring erzeugt wurde -> erzeuge einen neuen String
 jsonDatei   := FUN_CreateJson();                                                    //erzeugt einen String im Json-Stil
 bInitCreate  := TRUE;    
END_IF

dateiNamen := concat('Default', INT_TO_STRING(dateiNummer));     //erstellt einen Namen, unter der die Datei gespeichert wird

IF NOT bInitFile THEN                                                                      //wenn noch keine Datei erstellt wurde -> erstelle neue Datei
 IF bInitCreate THEN                                                                       //wenm ein zu speichernder String erstellt wurde
   FUN_SafeFile(jsondatei, dateiNamen);                                           //Funktion für das Erstellen/Speichern/Schließen einer .json Datei
   bInitFile := TRUE;       
   dateiNummer := dateiNummer +1;                                              //Nummer für den Dateinamen wird erhöht, um bei nächsten Aufruf
                                                                                                   //eine separate Datei anzulegen
 END_IF
END_IF

Die Funktion FUN_SafeFile:
Code:
VAR_INPUT
 input : STRING;
 name : STRING;
END_VAR
VAR
 open : FB_FileOpen;
 write : FB_FileWrite;
 close : FB_FileClose;
 datei : STRING := concat(name, '.json');
 y : STRING := concat('C:\', datei); 
  i: INT := 0;

END_VAR



WHILE i <> 30 DO
 CASE i OF 
  0: open (bExecute := FALSE);
   open ( sNetId   := '',
     sPathName := y,
     nMode   := FOPEN_MODEWRITE,
     tTimeout := T#3S,
     bExecute := TRUE);
   i := 5;
   
 
  5: open(bExecute := FALSE);
   IF NOT open.bBusy THEN
    i := 10;
   END_IF
 
  10: write(bExecute := FALSE);
   write( sNetId  := '',
     hFile  := open.hFile,
     pWriteBuff := ADR(input),
     cbWriteLen := SIZEOF(input),
     tTimeout := T#3S,
     bExecute := TRUE);
   i := 15;
  15: write(bExecute := FALSE);
   IF NOT write.bBusy THEN
    i := 20;
   END_IF
  
  20: close(bExecute := FALSE);
   close( sNetId  := '',
     hFile  := open.hFile,
     bExecute := TRUE);
   i := 25;
  25: close(bExecute := FALSE);
   i := 30;
  
  30: //....ende
  END_CASE 
END_WHILE

Das Problem, was hier allerdings auftaucht, ist dass wenn ich das Programm ausführe, erstellt es mir eine Datei, welche jedoch ohne Inhalt ist (0kB). Auch wenn ich eine zweite und dritte Datei erzeuge, sind diese dann ohne Inhalt.
Interessant ist aber, wenn ich mir Breakpoints setze in der Funktion, schreibt das Programm auch den String in die Datei.

Hat vielleicht jemand eine Idee woran das liegen könnte und wie ich das Problem beheben kann?

Ich bedanke mich schon mal im Voraus für die Hilfe.
 
Moin

Ich kenne Twincat nicht, doch ich vermute, der Daten-Schreibauftrag muß solange aktiviert bleiben bis er nicht mehr busy meldet. Bei Dir wird der Auftrag schon nach 1 Zyklus abgebrochen. Versuche mal so:
Code:
  15: 
   IF NOT write.bBusy THEN
    [COLOR="#0000FF"]write(bExecute := FALSE);[/COLOR]
    i := 20;
   END_IF

PS: ich sehe gerade Deine WHILE-Schleife. Die mußt Du komplett entfernen!
Ein SPS-Programm darf nicht in einer Schleife auf etwas warten was länger als ein paar Millisekunden dauert. Vermutlich muß für die Datei-Operationen auch mehrmals die Bearbeitung ans Betriebssystem abgegeben werden - sprich, der Durchlauf muß mehrere Zyklen dauern.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Moin

danke für die schnelle Antwort.
Leider hat das nichts gebracht.

Habe die WHILE-Schleife ganz schnell wieder rausgenommen :D

Scheinbar lässt sich das nicht in eine separate Funktion auslagern. Wenn ich die Case Anweisung in der Main laufen lasse funktioniert es einwandfrei.
 
Scheinbar lässt sich das nicht in eine separate Funktion auslagern. Wenn ich die Case Anweisung in der Main laufen lasse funktioniert es einwandfrei.
Hallo,
bei diesem Kommentar läuten bei mir sämtliche Alarmglocken auf. Hast Du das Ganze (Inklusive Deklaration) tatsächlich in eine Funktion gepackt? Falls ja, ist das die Ursache (neben der While-Schleife) für Deine Probleme. Funktionen können keine Daten speichern (Außer mit Tricks), sie verhalten sich bei jedem Aufruf so als würden sie zum ersten mal aufgerufen und das gilt auch für alle in dieser Funktion deklarierten FBs. Du musst statt einer Funktion einen Funktionsbaustein nehmen.

Von irgendwas mit Internetzugang gesendet
 
Hallo Oliver.tonn,

danke für die Antwort.
habe es jetzt mit einem FB realisiert und siehe da, es klappt. :D
Ich dachte eigentlich, eine Funktion würde dafür ausreichen (habe versucht, nachdem ich die WHILE-Schleife entfernt habe, die CASE-Variable i einer Variablen in der Main zu übergeben und diese dann im nächsten Zyklus wieder an die Funktion zu übergeben. Leider auch ohne Erfolg.).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich dachte eigentlich, eine Funktion würde dafür ausreichen (habe versucht, nachdem ich die WHILE-Schleife entfernt habe, die CASE-Variable i einer Variablen in der Main zu übergeben und diese dann im nächsten Zyklus wieder an die Funktion zu übergeben. Leider auch ohne Erfolg.).
Die Variable die für die CASE-Anweisung genutzt wird ist dabei Dein geringstes Problem. Wie ich schon schrieb, verliert alles was in der Funktion deklariert ist seine Werte am Ende der Funktion, außer man ergreift besondere Maßnahmen und FBs die in der Funktion und in allem was unter dieser liegt deklariert wurden verhalten sich bei jedem Aufruf so als ob sie zum ersten mal aufgerufen wurden. Aus diesem Grunde funktionieren ja auch in Funktionen deklarierte Flankenbausteine nicht, weil sie sich an ihren vorherigen Zustand nicht erinnern können und somit auch nie eine Flanke erkennen werden oder aber ständig eine Flanke erkennen, je nach Situation.
 
Zurück
Oben