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

SysLibFile Problem

S Hinck
2005-12-12
2005-12-13
  • S Hinck - 2005-12-12

    Hallo,

    ich habe derzeit ein Problem mit den File-Funktionen der SysLibFile Bibliothek.

    In meinem mittlerweile recht umfangreichen Projekt nutze ich die Funktionen unter anderem um ein Konfigurationsfile auszulesen und Änderungen in diesem wieder abzuspeichern.

    Dieses klappt mittlerweile recht gut.

    Wenn ich allerdings in einer anderen Funktion eine völlig andere Textdatei öffne um in diese etwas völlig anderes zu schreiben, so wird ein Teilstring der vorher ausgelesenen Datei in diese Datei mit hineingeschrieben.

    Um das Problem einzugrenzen habe ich die Funktion soweit reduziert, dass ich nur noch das File öffne und einen leeren String hineinschreibe.

    Trotzdem enthält das File schliesslich einen bekannten Teilstring und Datenmüll.

    dataInfo:=SysFileOpen (fileName,mode);

    SysFileWrite (dataInfo, ADR(header),SIZEOF(header));

    SysFileClose (dataInfo) ;

    //der String header ist mit header:=''; initialisiert.

    // mode= 'w'

    Wenn ich nun den mode auf 'a' gesetzt habe, um noch etwas an das File anzuhängen, wurde dieser unerwünschte Teilstring noch einmal in das File geschrieben.

    Kann mir jemand die Ursache für dieses Problem nennen, und vielleicht Tips geben, wie ich es lösen kann?

     
  • Erik Böhm - 2005-12-13

    Hallo

    Ich hatte vor geraumer Zeit ein ähnliches Problem.

    Aus deinem Text entnehme ich, dass du das ganze als FUNCTION erstellt hast. Ich habe einen FUNCTION_BLOCK benutzt und wenn ich von verschiedenen Stellen im Programm (oder auch aus verschiedenen Tasks) darauf zugreife, dann erstelle ich mir eine neue Instanz dieses Funktionsblocks.

    Seither ist das Problem gelöst.

    Anbei ein Ausschnitt aus einem Log File mit diesem Fehler.

    Der erste Fehler tritt in Zeile 10 mit dem doppelten Zeitstempel und diversen Verschiebungen auf.

    Ab zeile 41 wird das ganze dann extrem, weil eine Fehlermeldung zyklisch geschrieben wurde (das war aber ein Programmierfehler...).

    Hoffe das hilft dir weiter.

    Gruss

     
  • S Hinck - 2005-12-13

    Danke für die Antwort,

    leider wird mir das weniger helfen. Ich greife aus unterschiedlichen Funktionen auf die Funktionen der SysLibFile Bibliothek zu. Leider wüsste ich nicht wie ich von diesen eine neue Instanz erstellen kann.

    Aber ich bin dankbar für die Hilfe und werde mein Glück mit Funktionsbausteinen und dann mehreren Instanzen versuchen. Allerdings müsste ich mein Programm dann an mehreren stellen entscheidend verändern. Ein Versuch ist es dennoch wert.

    An der Nachricht hing allerdings kein Log-File

    Ich bin auch weiterhin für andere Lösungsvorschläge offen, da es sich hier anscheinend um ein Grundlagenproblem zu handeln scheint.

    Grüße

    Steffen Hinck

     
  • Erik Böhm - 2005-12-13

    Hier nochmal das Log File.

    Mal sehen obs diesmal funktioniert.

     
  • Erik Böhm - 2005-12-13

    Er hängts einfach nicht dran...

    Dann eben als Ausschnitt:

    04.10.2004|00:28:19,125|StartScan

    04.10.2004|00:28:19,265|5 LP wurden von Trayloader abgeholt

    04.10.2004|00:28:19,359|Portal1 ScanReceived: CT0220000000010142207

    04.10.2004|00:28:23,000|Z-Achse Portal 2 auf Kollisionsschalter.

    vvv FEHLER vvv

    04.10.2004|00:28:23,000|04.10.2004|00:28:23,000|Z-Achse Portal 2 a04.10.2004|00:28:25,984|: Eingabelift Spur 1 WT an N+1 übergeben

    ^^^FEHLER ^^

    04.10.2004|00:28:44,234|Initialisierungslauf gestartet

    04.10.2004|00:28:49,281|Starte Referenzlauf Z-Achse Portal 2.

    04.10.2004|00:28:49,453|Starte Referenzlauf Z-Achse Portal 1.

     
  • Uwe - 2005-12-13

    Die Funktion SIZEOF() liefert die resevierte Speichergrösse einer Variablen.

    Also bei einem String normalerweise 80.

    Es wird also nicht die tatsächliche Stringlänge sondern der für einen String zur Verfügung stehende Speicherplatz geliefert.

    Wenn der String nur wenige Zeichen enthält, dann wird dieser mit einem Null-Byte terminiert und dahinter stehen noch "Altlasten" im Speicher.

    Probieren Sie statt SIZEOF(Header) -> LEN(Header).

    LEN() liefert die tatsächliche Stringlänge.

     
  • S Hinck - 2005-12-13

    Obwohl es heute zur Gewohnheit werden zu scheint, muss ich mich noch einmal bedanken.

    Ich habe einige Testläufe gemacht, und seit ich die Aufrufe mit LEN() anstatt SIZEOF() mache, läuft alles ohne Problem.

    Das Forum hier ist wirklich sehr nützlich und eine gute Sache.

    Somit sind erstmal meine gröbsten Probleme alle gelöst. Danke.

    Grüße,

    Steffen Hinck

     

Log in to post a comment.