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

"Ausnahmefehler" seit 3.5.9

grauerwolf
2016-12-08
2016-12-09
  • grauerwolf - 2016-12-08

    Hallo,
    ich bekomme seit einigen Tagen (vielleicht tatsächlich seit dem Update auf 3.5.9) einen Ausnahmefehler.
    Die Befehlszeilen sind wie folgt:

    (*Anzeige-String-Array: alle Saetze 1 nach oben, letzten Satz frei machen, damit kontinuierlicher Prozess gesichert *)
    Persistent_Vars.Log_Nr_text:=Globale_Konstanten.Log_Arr_Text_max;   
    WHILE Persistent_Vars.Log_Nr_text>0  DO   
         Persistent_Vars.Log_Arr_Text[Persistent_Vars.Log_Nr_text]
                                                   :=Persistent_Vars.Log_Arr_Text[Persistent_Vars.Log_Nr_text-1];
       Persistent_Vars.Log_Nr_text:=Persistent_Vars.Log_Nr_text-1;
    END_WHILE
    

    Aus meiner Sicht dürfte im Code der dann angezeigte Fehler nie auftreten:
    Persistent_Vars.Log_Nr_text wird 65535 !!!
    Die Frage ist:
    wie kann die Variable so einen Wert annehmen. Ich glaube, wenn die Variable 0 erreicht hat und die Whileschleife verlassen werden sollte, dann wird immer nochmal in die Schleife verzweigt, die Variable "läuft über" und steht auf 65768 (eigentlich -1). Da die Variable als WORD definiert ist, ist der Wert wieder erheblich größer 0 und dann ist verständlich, daß die Verschieberei in verbotene Zonen hineinläuft.

    Ich kann jetzt die Variable als INT definieren, dann müßte sie kleiner 0 werden und bei -1 die while-schleife spätestens verlassen.
    Aber das würde bedeuten, das ich mich nicht mehr darauf verlassen kann das eine while-Schleife bei =0 verlassen wird.
    Diese Prozedur ist nicht neu und kannte das Problem noch nicht.
    Ich habe auch mal Bildchen rangehängt, wo ich neben dem Fehler auch nach der Variable im ganzen Projekt gesucht habe. Sie wird woanders nicht bewegt.

    Da der Code ja nicht besonders umfangreich ist, sollte doch jemand Schlaues entweder meinen Fehler benennen oder einen Lösunsgvorschlag machen. Ich bin auf Grund der Suche schon ziemlich "benebelt" - könnte also ständig über den Fehler wegschauen.

    Viele Grüße
    Thomas

    IMG: Ausnahmefehler_2.jpg

    IMG: Ausnahmefehler_1.jpg

     
  • eschwellinger

    eschwellinger - 2016-12-09

    Hallo,

    ich würde mal die Impliziten Checkbausteine - Checkbounds usw einfügen.

    Dann dort einen Brakepoint drin setzten (für die Fälle das über ein Array hinausgeschrieben wird)
    So mal ansetzen.

    Grüße
    Edwin

    IMG: Boundschecker.jpg

    IMG: checks.jpg

     
  • grauerwolf - 2016-12-09

    Hallo Edwin,
    das werde ich mal ausprobieren. Das Schlimme ist, es passiert ja nur ab und zu...

    Ich habe noch den Verdacht, das es an der Existenz mehrerer Tasks liegt, die auf ein und dieselbe Prozedur zugreifen. Aber innerhalb so einer dünnen While-Schleife habe ich so ein Problem nie erwartet.

    Vielen Dank
    Thomas

     

Log in to post a comment.