Programm fehlerhaft / SysfileOpen zurücksetzen ? (ST)

richie
2011-01-29
2023-10-31
  • richie - 2011-01-29

    moin zusammen,
    ich hab 9 Bilddateien (von 1 bis 9) zu verfügung , das program soll aufm laufwerk( Adresse im Stringvariable) zugreifen und prüfen ob die dateien existiern oder nicht (mittels SysfileLib) , falls ja ..soll er das bild aufrufen..ansonsten prüft er auf dem nächsten usw..
    mein Programm sieht so aus :

    IF (weiter = TRUE ) AND (B < 10)

    THEN
    B:=Bildnummer; >> B=1 z.b
    InstSysFileOpenAsync(bEnable:=True , stFileName:=Stringadresse , stMode:='r' , bError=>Fehler );

       IF
       Fehler = FALSE
       THEN
       bEnable:= False;<span style="color: #FF0000"> eingang der Funktion zurücksetzen</span>
       B:=B+1;<span style="color: #FF0000"> >>>>>B erhöht sich um eins </span>
       Bilddarstellen:= True ; <span style="color: #00BF00"> Bild wird hier dargestellt</span>
    
    ELSE  B:=B+1; <span style="color: #408000">guckt auf dem nächsten</span>
    
    END_IF
    

    END_IF

    allerdings funktionniert mein programm nicht der zähler erhöht sich nur auf 2 und bleibt stehen und die funktion SysFileAsync setzt sich irgendwie nicht zurück ??
    Kann mir bitte jemanden helfen und die programmierung überprüfen ?? ist das richtig so ?
    Danke im voraus !

     
  • Anonymous - 2011-01-29

    Originally created by: blackenslaver666

    Hi.
    Du beschreibst nur die lokale Var "bEnable", diese wird aber nicht an die FUN als Eingangsparameter übergeben. An die FUN übergibst du statisch TRUE, das kann dann nicht funktionieren. Einfach nochmal die FUN aufrufen mit "bEnable := FALSE", dann sollte das gehen.

    Warum dein Zähler nur auf B=2 inkrementiert wird mir anhand des Codes aber nicht ersichtlich. Du kannst ja mal in der Taskkonfig die entsprechende Task als "DebugTask festlegen" und dann das Programm im Einzelschrittmodus Zeile für Zeile abarbeiten. So findet sich idR jeder Fehler.

    Gruß

     
  • richie - 2011-01-31

    ]danke erstmal für den tipp , Ich habe es probiert , funktionniert trotzdem nicht :
    ich habe hier mal ein screenshot für euch im anhang .

    ich kann den eingang immernoch nicht zurücksetzen !
    irgenwas stimmt hier nicht ?? vllt ein laufzeit problem ? kann mir jemandne helfen ...
    Danke im voraus ^!

    IMG: prog.PNG

     
  • Anonymous - 2011-01-31

    Originally created by: blackenslaver666

    Hättest du die Debug-Task mal versucht hättest du ein LZ-Problem feststellen können.

    Zu deinem Code:
    Jetzt ist klar warum B nur auf 2 inkrementiert: Du durchläuft die IF-Anweisung nur 1x und setzt danach "weiter" auf FALSE.

    Zu dem Rücksetzproblem des Eingangs:
    Du rufst du FB(?) VOR der IF-Anweisung auf, d.h. in der Schleife setzt du erst "bEnable" auf TRUE und im nächsten Durchlauf wird der FB auch abgearbeitet. In diesem Fall wird aber die IF-Anweisung nicht mehr durchlaufen, d.h. der FB bleibt enabled.

    Deinen Code kannst du mal so modifizieren:

    IF weiter
    THEN

    IF NOT bEnable THEN
    B:=B +1; ( Zähler inkrementieren wenn Dateizugriff nicht aktiv )
    END_IF

    bEnable:= TRUE;( Datei öffnen )

    IF InstSysFileOpenAsync.bDone THEN ( Datei gelesen )
    bEnable:= FALSE;( Dateihandling beenden )
    weiter := FALSE;
    END_IF
    END_IF

    ( Datei öffnen )
    InstSysFileOpenAsync(bEnable:=bEnable , stFileName:=Stringadresse , stMode:='r' , bError=>Fehler );

     
  • richie - 2011-02-01

    jo es hat geklappt ! ich bin halt nur anfänger mit CoDesSys
    Danke nochmal für die unterstützung !

     
  • Anonymous - 2011-02-01

    Originally created by: blackenslaver666

    richie hat geschrieben:
    ich bin halt nur anfänger mit CoDesSys

    Jeder fängt mal klein an, aber man sollte trotzdem hilfreiche Tipps ausprobieren. Man lernt immer irgendwie dazu.

    Viel Spass noch!

     

Log in to post a comment.