FOR Schleife Zähler zählt direkt hoch

Gizzl0r

Level-1
Beiträge
142
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
ich habe folgendes Problem. Ich will nach einer erfolgreichen Messung, Inhalte eines Array mit IST Messwerten, mit 2 Array vergleichen die, die Min und Max Werte beinhalten:




Ist die Messung beendet und der Trigger spricht an. Steigt mein i direkt auf maximal wert 6. Als Kontrolle habe ich ein j eingefügt, welches nach jedem Schleifendurchlauf J+1 macht.
Nach meinem Verständnis müsste das i sich doch auch so verhalten oder?

Mein Ergebnis ist nämlich, dass mein Array mit den Fehlerhaften Messergebnissen immer nur den i Wert 6 als TRUE anzeigt.
Als würde er 1-5 überfliegen und direkt bei 6 landen.


Code:
hoehe_tol_min :ARRAY [1..6] OF REAL :=[12,12,12,12,12,10];

 hoehe_tol_max :ARRAY [1..6] OF REAL := [13,14,13,16,10,10];

 hoehe :ARRAY [1..6] OF REAL :=[12.5,14.2,13.2,15.4,9.4,10.3];

 hoehe_fehlerhaft :ARRAY[1..6] OF BOOL;







r_trig(clk:=GVl.ende_messung);


IF r_trig.Q

    THEN



FOR i := 1 TO i := 6 DO

  



    IF  GVL.hoehe[i] > GVL.hoehe_tol_max[i] OR GVL.hoehe[i] < GVL.hoehe_tol_min[i]

        THEN GVL.hoehe_fehlerhaft[i] :=TRUE;

        ELSE GVL.hoehe_fehlerhaft[i] :=FALSE;

    END_IF

j:=j+1;



END_FOR

END_IF
 
Zuletzt bearbeitet:
Deine FOR
Mein Ergebnis ist nämlich, dass mein Array mit den Fehlerhaften Messergebnissen immer nur den i Wert 6 als TRUE anzeigt.
Wo wird denn in deinem Code ein Array angesprochen? Das sind doch alles fixe Variablen.

Die FOR Schleife ergibt so eigentlich keinerlei Sinn da du keine Arrays mit der FOR Variable "i" ansprichst.
Code:
IF GVL.hoehe > GVL.hoehe_tol_max OR GVL.hoehe < GVL.hoehe_tol_min


FOR i := 1 TO i := 6 DO
:unsure:
Auf welchem System programmierst du eigentlich?

PS:
Das IF THEN ELSE könntest du dir auch sparen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wo wird denn in deinem Code ein Array angesprochen? Das sind doch alles fixe Variablen.
Die [I] werden bei der Beitrags-Anzeige als kursiv-Tag interpretiert und nicht angezeigt, wenn man den Text nicht in CODE-Tags einbettet.
Sein Programmcode aus #1 sieht in Wirklichkeit so aus:
Code:
r_trig(clk:=GVl.ende_messung);



IF r_trig.Q
    THEN

FOR i := 1 TO i := 6 DO
 

    IF  GVL.hoehe[I] > GVL.hoehe_tol_max[I] OR GVL.hoehe[I] < GVL.hoehe_tol_min[I]
        THEN GVL.hoehe_fehlerhaft[I] :=TRUE;
        ELSE GVL.hoehe_fehlerhaft[I] :=FALSE;
    END_IF
j:=j+1;

END_FOR
END_IF

Tip: Die [I] sieht man, wenn man den Beitrag zitiert und die BBCode-Anzeige einschaltet.
 
Ist die Messung beendet und der Trigger spricht an. Steigt mein i direkt auf maximal wert 6. Als Kontrolle habe ich ein j eingefügt, welches nach jedem Schleifendurchlauf J+1 macht.
Nach meinem Verständnis müsste das i sich doch auch so verhalten oder?
Eine FOR-Schleife wird immer sofort komplett mit allen Durchläufen (mit i = 1,2,3,...,6) abgearbeitet, und danach sieht man nur die Werte vom letzten Durchlauf.
Will man immer nur einen Durchlauf, dann darf man keine FOR-Schleife verwenden, sondern muß das I bei Bedarf selbst inkrementieren, z.B. in jedem Zyklus/Task-Durchlauf bedingt oder unbedingt. Beachte, daß eine SPS zyklisch arbeitet, was schon einer (Endlos-)Schleife entspricht.
 
Zuletzt bearbeitet:
Code:
FOR i := 1 TO i := 6 DO
Und das schluckt der CoDeSys Compiler?

Warum nicht einfach
Code:
FOR i := 1 TO 6 DO

Anstatt:
Code:
IF  GVL.hoehe[I] > GVL.hoehe_tol_max[I] OR GVL.hoehe[I] < GVL.hoehe_tol_min[I]
    THEN GVL.hoehe_fehlerhaft[I] :=TRUE;
    ELSE GVL.hoehe_fehlerhaft[I] :=FALSE;
END_IF

könnte man auch schreiben:
Code:
GVL.hoehe_fehlerhaft[I] := GVL.hoehe[I] > GVL.hoehe_tol_max[I] OR GVL.hoehe[I] < GVL.hoehe_tol_min[I];
 
Der springt bei der Anweisung direkt auf die 6. und nimmt gar nicht die Zähler zwischen auf.
Nein. Er sprang da nicht hin. Im Originalzustand arbeitete dein Programm die ersten 5 Durchgänge nur sehr schnell ab und überschrieb im nächsten Durchgang den vorherigen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
FOR i := 1 TO i := 6 DO

Und das schluckt der CoDeSys Compiler?

Der springt bei der Anweisung direkt auf die 6. und nimmt gar nicht die Zähler zwischen auf.
Also eigentlich ist FOR i := 1 TO i := 6 DO ein Syntaxfehler, den der Codesys-Compiler anmeckern müsste. Macht der das wirklich nicht? Oder hast du dich beim Posten fürs Forum vertippt?
 
Mal Codesys edit: Beckhoff fragen, ob/warum das absichtlich (?) ohne Fehler oder Warnung durchgeht. Und ob dieses "spezielle" Verhalten irgendwo dokumentiert ist.
 
Zuletzt bearbeitet:
Zurück
Oben