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

Kontrollieren ob Verzeichnis existiert

Anonymous
2012-07-25
2012-08-02
  • Anonymous - 2012-07-25

    Originally created by: xx5198

    Hallo,
    ich als Neuling bei CoDeSys sage erstmal hallo.

    Zu mir:
    Ich studiere Elektrotechnik und erstelle gerade meine Abschlussarbeit.
    Ziel ist es eine Steuerung mit dem Wago 750-880/025-001 zu erstellen.

    Unter anderem sollen Fehlermeldungen und Messwerte auf eine SD-Karte geschrieben werden.
    Das Speichern funktioniert so weit ganz gut. Ich kann die Werte meiner Variablen auf der SD-Karte speichern und sogar die nötigen Verzeichnisse mittels "SysDirCreate(filepath)" erstellen, nur bei folgendem habe ich Probleme:
    Und zwar möchte ich natürlich überprüfen ob die Verzeichnisse exisitieren oder nicht und das funktioniert nicht richtig.
    Ordner erstellen mache ich im Moment wie folgt:

    IF SysDirOpen(FilePath)=0 THEN
            IF SysDirCreate(FilePath)=FALSE THEN
                 (*Hier wird eine Fehlermeldung generiert, wenn das Verzeichnis nicht geöffnet UND erstellt werden konnte*)
            END_IF;
    END_IF;
    

    FilePath stellt hier das Zielverzeichnis bzw. Ordner als String dar.
    Ich möchte folgende Ordnerstrucktur erstellen bzw. kontrollieren ob sie vorhanden ist:
    s:/Unterstation_x/Art/Jahr

    Hierfür stelle ich den String dann Stück für Stück zusammen und rufe dann jeweils obigen Code auf.
    Also zb für s:/Unterstation_x, s:/Unterstation_x/Art usw.

    Der Speichervorgang funktiniert mit diesem Code zwar im ersten Moment aber nach etwa 15 Zeilen Text in meiner Zieldatei wird das Speichern eingestellt und obige IF-Schleife gibt die beschriebene Fehlermeldung ab.

    Wenn ich obigen Code weg lasse, dann funkioniert zwar das Speichern wie es soll aber ich möchte natürlich gerne, dass die Ordner erstellt werden und usw.

    Kann mir da jemand weiter helfen?

    Danke schon mal im Vorraus.

    Gruß
    Andreas

     
  • Erik Böhm - 2012-07-25

    Servus

    Du sagst nach 15 Zeilen tritt der Fehler auf.
    Das würde ja heissen du prüfst in jedem Zyklus, auch während die Datei bereits geschrieben wird ?
    Sehe ich das richtig ?

    Das wäre ja dann völlig unnötig.
    Erst prüfen ob das Verzeichnis OK ist, dann Datei schreiben und fertig.

    Gruß Erik

     
  • Anonymous - 2012-07-25

    Originally created by: xx5198

    Hallo und danke für deine Antwort.
    Mir ging es auch darum, dass es mal sein kann, dass man die SD-Karte spontan entnehmen will und die Daten einsehen will.
    Weil ich mir nicht sicher bin wie das Programm reagiert wenn ich keine Kontrolle für jeden Zyklus habe wenn man die Karte entfernt hab ich das halt so gemacht.

    Hier hab ich ein mal das ganze Programm: https://dl.dropbox.com/u/2780701/SD-Schreiben.rtf

    So weit ich bisher gelesen hab düfte wohl SysDirRead() die Lösung sein aber ich hab es damit auch noch nicht hinbekommen...

     
  • Erik Böhm - 2012-07-26

    Moin

    Ich hab mir mal ein Projekt für die RTE erstellt und getestet. AKtuelle Version anbei.

    Diverse Fragen tauchen auf:

    1. Wenn die Karte jemand entfernt, dann wirst du das beim nächsten Schreibversuch schon merken...

    2. Wozu ist der (mehrfache) Aufruf SysDirRead ?
      Die Beschreibung zu der Funktion hast du gelesen ? und verstanden ?
      Function to read directory entries.
      Returns 1, if further entries to search in the directory is available.
      Must be called until 0 is returned by this function. This closes the directory.

    Bei mir wird im Moment des Aufrufs sowohl dwOrdner als auch strFilePath mit 0, bzw '' überschrieben, weil dwOrdner zu diesem Zeitpunkt immer 0 ist.
    Wird ja im IF darüber auch so abgefragt.

    Gruß
    Erik

    CheckDir.zip [7.65 KiB]

     
  • Anonymous - 2012-07-27

    Originally created by: xx5198

    Hallo und danke für deine Antwort.

    Ja die Beschreibung hab ich verstanden aber ich hatte noch etwas Probleme sie an zu wenden...
    Den mehrfachen Aufruf von SysDirRead hab ich gemacht weil ich ja Stück für Stück das Verzeichnis überprüfe mit SysDirOpen.
    Also ich öffne s:/unterstation_i und dachte mir ich muss es danach auch wieder mittels SysDirRead schließen.
    Dann öffne ich s:/Unterstation_i/Art, wieder SysDirRead usw....

    Das "i" ist übrigens nicht initialisiert weil es als der Funktion von außen übergeben wird.

    Ich habe meine Funktion jetzt so weit, dass kontrolliert wird ob die entsprechenden Ordner existieren und sie gegebenen Falls erstellt werden.
    Das funktioniert auch ganz gut.

    Meine Fehler waren scheinbar:
    SysDirRead funktionierte nicht in meiner CASE Anweisung
    Ich verwende jetzt also keine CASE-Anweisung mehr und gucke mittels SysDirRead nach ob meine Unterorder existieren oder nicht.

    Was jedoch noch nicht funkioniert ist das überprüfen ob die SD-Karte eingesteckt ist und wenn man zb mittels FileZilla über das Netzwerk die Ordner löscht, dann werden sie nicht automatisch neu erstellt.
    Aber zu mindestens werden die Ordner beim Hochfahren des Controllers erstellt. Dann darf man halt die Ordner nicht löschen. Damit kann ich auch leben...

    Ich hab den Teil mit dem erstellen der Ordner in einen eigenen Funktionsblock gepackt: https://dl.dropbox.com/u/2780701/ORDNER_ERSTELLEN.EXP
    Vielleicht hat ja jemand verbesserungsvorschläge.

     
  • Erik Böhm - 2012-07-27

    Moin
    1. Zu SysDirRead:
    Mir scheint dass du die Funktion jetzt verstanden hast.

    Zitat:
    Also ich öffne s:/unterstation_i und dachte mir ich muss es danach auch wieder mittels SysDirRead schließen.

    Das Verzeichnis wird nur geschlossen, wenn SysDirRead aufgerufen wird bis die Rückgabe 0 ist, also das Verzeichnis komplett eingelesen wurde.
    Bei deiner ersten Methode wurde nur der 1. Eintrag eingelesen. Das ist (je nach Dateisystem) evtl. nur '.' oder '..'

    2. Feststellen ob SD-Karte gesteckt ist:
    Du rufst ja schon

    Zitat:
    DirHandle:=SysDirOpen( 's:\' );

    auf. Wenn du jetzt noch prüfst ob das Handle gültig ist, dann weisst du auch ob die SD-Karte drin ist.

    3. Da es deine Abschlussarbeit sein soll: lies mal folgendes Kapitel in der Hilfe: "Namensvergabe für Bezeichner"

    4. Einige dich mit deinem Quellcode auf eine Sprache. Deutsch ODER Englisch. Mischen sieht immer komisch aus.

    5. FUNCTION_BLOCK lohnt sich nur, wenn du den Ablauf mehrfach verwendest, sprich Instanzierts.
    Siehe auch: Instanzen von Funktionsblöcken

    Gruß
    Erik

     
  • Anonymous - 2012-07-27

    Originally created by: xx5198

    Zu 5:
    Ich verwende FB weil ich das ganze Mehrfach benötige also in Instanzen.

    Kannst du mir evtl. noch einen Tipp geben wie ich in CoDeSys am einfachsten 1/4h Mittelwerte berechnen lassen kann?
    Mein erster Ansatz wäre es mit Arrays die Werte zwischen zu speichern, die Summe zu bilden und durch die entsprechende Anzahl zu teilen.
    Müsste dann natürlich in einigen kleinen Schritten passieren (ich glaub die Anzahl der Objekte ist auf 70 begrentzt?)...

     
  • Erik Böhm - 2012-07-27

    Servus

    Zitat:
    Müsste dann natürlich in einigen kleinen Schritten passieren (ich glaub die Anzahl der Objekte ist auf 70 begrentzt?)...

    Wer begrenzt die Anzahl der Objekte ? Du kannst auch ein Array[1..10000] deklarieren, wenn dein Speicher ausreicht.
    Mittelwerte berechnen gibts auch in der Oscat.lib

    Gruß
    Erik

     
  • Anonymous - 2012-07-30

    Originally created by: xx5198

    Hallo noch mal und danke für deine (und kommende) Antworten.

    Mein Programm läuft jetzt ganz gut und ich bin so weit zufrieden.
    Hab meinen Mittelwert durch aufsummieren auf eine Variable und am ende durch die entsprechende Anzahl teilen gelöst.

    Mir ist aber jetzt aufgefallen, dass die Werte, die von der Steuerung in die cs. Datei gespeichert werden Punkte statt Kommata haben.
    Wenn ich die Datei in Excel öffne dann sieht das etwa so aus:
    aus 2,365 wird 2365 da Excel Kommata haben will...
    Das kann man in Excel sicher irgendwie umstellen aber mir wäre es lieber wenn es gleich mit Kommata statt Punkt gespeichert würde.

    Kann mir da jemand weiter helfen?

    Im Moment wandle ich mittels REAL_TO_STRING() meine Messergebnisse und speichere sie dann auf SD Karte.

     
  • Erik Böhm - 2012-07-30

    Servus

    Das REAL Format sieht eben den Punkt vor, nicht das Komma.
    Wenn du das geändert haben willst, musst du vor dem schreiben mit REPLACE die Zeichen von 'Hand' ersetzen.

    Gruß Erik

     
  • Erik Böhm - 2012-07-31

    Und in Excel ist das unter: >Zitat:
    Ändern des Dezimal- und 1000er-Trennzeichens
    zu finden

     
  • Anonymous - 2012-08-02

    Originally created by: Eckhard

    Hallo xx5198
    So eine Funktion, die mir den Punkt in ein Komma verwandelt habe ich auch mal gebraucht (auch für Excel).
    Hier ist sie: (Datei: Punkt_zu_Komma.exp)
    Als Ergebnis bekommst Du einen String nach dem Muster 3,1415 der gleich in die csv Datei geschrieben werden kann.

    Gruß Eckhard

    PUNKT_ZU_KOMMA.EXP [1.23 KiB]

     

Log in to post a comment.