TIA Unzuverlässige Programmausführung

Beiträge
110
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin gerade am Programmieren mit einer Schrittkette. Innerhalb der Schrittkette erfolgt eine Ausführung mittels einer Berechnung die ich mit scl geschrieben habe. Ich habe die Berechnungen mehrmals überprüft und ich bin mir sicher das sie richtig ist. Dennoch erfolgen ein paar Berechnungen Falsch. Ich habe das Gefühl das die For Schleife in der Berechnung nicht immer zu Ende ausgeführt wird und ab einem bestimmten Moment stoppt. Manchmal wird auch der alte Wert, den ich im vorherigen lauf in die variable geschrieben hatte nicht aktualisiert. Was könnten die Probleme sein? Danke

Code:
FOR i := 0 TO 24 DO
        diff := ABS(Val_1 - Values[i]);   
    IF diff < minDiff THEN
        minDiff := diff;
        closestIndex := i;
    END_IF;
END_FOR;

closestValue := Values[closestIndex];
 
Dennoch erfolgen ein paar Berechnungen Falsch. Ich habe das Gefühl das die For Schleife in der Berechnung nicht immer zu Ende ausgeführt wird und ab einem bestimmten Moment stoppt. Manchmal wird auch der alte Wert, den ich im vorherigen lauf in die variable geschrieben hatte nicht aktualisiert.
Was bedeutet "Falsch"? Kommt irgendwann nur noch 0 raus oder völlig unerklärliche oder "krumme" Ergebnisse? Zeige mal ein Screenshot der Programmausführung, wo ein falsches Ergebnis rauskommt.

Was könnten die Probleme sein?
- Code wird nicht oder zur falschen Zeit ausgeführt
- Variablen sollen sich was merken, aber merken sich nichts, weil z.B. in TEMP deklariert
- minDiff und closestIndex werden da gar nicht initialisiert. Wo kommen die Werte her?
- sind garantiert aktuelle und vollständige Werte im Values-Array?
- ... ?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dann zeig doch mal den vollständigen Code ...
In dem Netzwerk ist dann nur noch die IF Bedingung dabei
Code:
IF #Step = 10 THEN
    FOR i := 0 TO 24 DO
        diff := ABS(Val_1 - Values[i]);   
        IF diff < minDiff THEN
               minDiff := diff;
               closestIndex := i;
        END_IF;
    END_FOR;
    closestValue := Values[closestIndex];
END_IF;
Gibt es die Probleme wenn der Schritt aktiv ist oder nur wenn er nicht (mehr) aktiv ist?
Ist die Variable "closestValue" bzw. "closestIndex" static oder temp?
Der Schritt ist immer nur Kurzzeitig an, aber ich weiß dass das keine Auswirkungen auf den Ablauf des Programms hat. Die beiden Variablen sind beide Static.
Was bedeutet "Falsch"? Kommt irgendwann nur noch 0 raus oder völlig unerklärliche oder "krumme" Ergebnisse? Zeige mal ein Screenshot der Programmausführung, wo ein falsches Ergebnis rauskommt.


- Code wird nicht oder zur falschen Zeit ausgeführt
- Variablen sollen sich was merken, aber merken sich nichts, weil z.B. in TEMP deklariert
- minDiff wird da gar nicht initialisiert. Wo kommt der Wert her?
- ... ?

Harald
Die Zahlen werden nicht richtig berechnet. Das bedeutet dass das berechnete #closestindex nicht dem entspricht was es sein sollte. Zum Beispiel erwarte ich den #closestindex 10 erhalte aber nur 3. MinDiff habe ich schon im Datenbaustein mit einer Hohen Zahl initialisiert, da dieser nicht immer überschrieben werden sollte. Aber mir fällt gerade ein, das ich es auch oberhalb der for-Schleife hätte machen können.
Werden irgendwelche Variablen davon von Visu oder einem Rechner geschickt?
Die Variablen wurden alle Intern in anderen Programmabschnitten bestimmt,

Ist dann bei dem nächsten Schritt als Bedienung, dass das Script durch ist?
Durch das Brainstorming hier, fällt mir ein, das dies tatsächlich sein kann. Laut meinem Programm, kann in den nächsten Schritt gesprungen werden, auch wenn das Ergebnis noch nicht feststeht. Dann setze ich im Programm nach Ende der Berechnung noch eine Variable auf #true und setze das dann als Bedingung, damit in den nächsten Schritt übergegangen werden kann und vorher nicht. Ich probiere mal und melde mich.

danke an alle
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Variablen wurden alle Intern in anderen Programmabschnitten bestimmt,
Gib uns blos nicht zu viele Details... ;)
Wo/wie sind z.B. minDiff und closestIndex und Val_1 und Values [Array 0..24] of ... deklariert? Sind da vor Ausführung der FOR-Schleife auch garantiert aktuelle Werte (des Schrittkettendurchlaufs) drin?

Laut meinem Programm, kann in den nächsten Schritt gesprungen werden, auch wenn das Ergebnis noch nicht feststeht.
Wie meinst Du das??? Die FOR-Schleife wird immer komplett durchlaufen.
Oder könnten vielleicht noch nicht alle 25 Werte im Values-Array stehen, wenn zum nächsten Schritt gesprungen wird?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gib uns blos nicht zu viele Details... ;)
Wo/wie sind z.B. minDiff und closestIndex und Val_1 und Values [Array 0..24] of ... deklariert? Sind da vor Ausführung der FOR-Schleife auch garantiert aktuelle Werte (des Schrittkettendurchlaufs) drin?


Wie meinst Du das??? Die FOR-Schleife wird immer komplett durchlaufen.
Oder könnten vielleicht noch nicht alle 25 Werte im Values-Array stehen, wenn zum nächsten Schritt gesprungen wird?

Harald

Wenn du nicht über mehrere Schritte die kleinste Differenz haben willst, dann MUSST du minDiff direkt über der FOR-Schleife mit einem hohen Wert initialisieren.
Alle Werte waren im Datenbaustein oder in der Variablenliste oben im Baustein definiert. Ich meinte, die Bedingungen um in den nächsten Schritt zu springen, könnten schon erfüllt worden sein, bevor die Berechnung komplett durchlaufen hat, dachte ich. Die For-Schleife wird auch durchlaufen, wenn die obere IF-Bedingung im Programm nicht mehr erfüllt ist? OKay, das habe ich nicht so richtig verstanden.
Die ersten Tests zeigen aber, dass das Problem an der Deklarierung von #mindiff gelegen haben könnte. Den hatte ich nämlich nur im Datenbaustein definiert und nicht im Netzwerk überhalb der For-Schleife. Es scheint zu funktionieren erstmal. Danke an alle beteiligten.
 
Alle Werte waren im Datenbaustein oder in der Variablenliste oben im Baustein definiert.
Und in der "Variablenliste" oben im Baustein ist es essentiell wichtig, in welchem Abschnitt eine Variable steht ("deklariert" ist), z.B. IN, OUT, TEMP. Wenn Du uns das nicht mit Worten mitteilen kannst, dann mach' halt ein Bild davon, wo man die interessierenden Variablen sieht.

Die For-Schleife wird auch durchlaufen, wenn die obere IF-Bedingung im Programm nicht mehr erfüllt ist?
Nein. Code der in einem THEN- oder ELSE-Abschnitt einer IF-Anweisung steht, wird nur ausgeführt, wenn die IF-Bedingung erfüllt bzw. nicht erfüllt ist. Eine FOR-Schleife wird immer komplett durchlaufen, wenn man die Schleife nicht extra vorzeitig verlässt.

Die ersten Tests zeigen aber, dass das Problem an der Deklarierung von #mindiff gelegen haben könnte. Den hatte ich nämlich nur im Datenbaustein definiert und nicht im Netzwerk überhalb der For-Schleife.
Schon wieder ein falsches Fachwort. An der Deklarierung im Datenbaustein wird es wohl nicht gelegen haben, sondern an der Initialisierung vor dem FOR-Schleife-Durchlauf. Wird #mindiff vor der Schleife nicht initialisiert (ein Anfangswert zugewiesen), dann ist in der Variable der Wert von der letzten Zuweisung (z.B. vom letzten Durchlauf des Programms) oder bei Deklaration in TEMP ein mehr oder weniger zufälliger Wert, und Deine FOR-Schleife ermittelt nur noch Differenzen die kleiner als dieser Wert sind.

Warum schreibst Du #mindiff mit # davor? Wenn das so in Deinem Programmcode steht, dann wurde die Variable nicht in einem Datenbaustein deklariert, sondern "oben in der Variablenliste" (lokale Variable aus der Bausteinschnittstelle).

Harald
 
@TrainerLaverCup67 :
Was du hier machst, mit den Teil-Antworten, die du dir zurecht-interpretierst, ist ein reines Rätselraten. Programmfehler-suchen geht anders.
Falls du irgendwann einmal den Ablauf deiner Schrittkette sauber haben möchtest so solltest du folgendes tun :
- poste die Variablen-Deklaration (KOMPLETT)
- poste den Code (KOMPLETT)
.... dann könnte es etwas werden ...

Selbstverständlich kann es auch sein, dass hier die richtige Antwort schon dabei war - manche von uns haben ja eine richtig gute Glaskugel, da geht dann schon was ... du solltest aber trotzdem mal darüber nachdenken ... :cool:
 
Zurück
Oben