Codesys 2.3 mit Cr451 IFM Display ****invalid*** Anzeige

Manuel1995

Level-1
Beiträge
32
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
bin noch relativ neu im programmieren und bitte deshalb um Rücksicht. :)
Ich habe folgendes Problem, ich will per Taster am Display eine Kammer 1-8 auswählen.
Das funktioniert auch super. Das Problem dabei ist, immer wenn ich über 8 komme wird erst ***INVALID: 8***
angezeigt, bevor es wieder bei 1 beginnt. Vielen Dank schonmal für eure Hilfe.
Bild davon seht ihr im Anhang(hoffe das hat funktioniert ist mein erster Beitrag).
 

Anhänge

  • forum.jpg
    forum.jpg
    23,9 KB · Aufrufe: 9
Zuletzt bearbeitet:
Das bedeutet, dass der Variablenwert nicht gültig ist, passiert innerhalb von Codesys z.B. wenn an der Speicheradresse eines BOOLs etwas anderes als 0 oder 1 steht, wobei ich bei der Zahl 9 schon überrascht bin, dass er diese als INVALID kennzeichnet. Vermutlich wird im Programm immer erst um 1 hochgezählt und dann, wenn der Wert 8 überschritten wurde die Variable wieder auf 1 gesetzt und das Ganze so langsam, dass am Display das kurz erscheint.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
erstmal vielen Dank für deine Erklärung bin gerade verwundert wie schnell du warst :D.
da Steht allerdings solange INVALID, bis ich nochmal drücke. Habe das ganze als Enum deklariert und
dachte evtl wenn ich nach K8 nochmal für 9 was vergebe ändert sich das. Leider Nein.
Gibt es eine Lösung wie ich das Problem beheben kann?
 
Hallo,

Deine enum geht nur von 0 bis 7, daher zeigt er bei 8 Fehler an.

Ich weiß nicht ob RT_F4 flankengestuert ist oder nicht, aber erst zählt Deine Funktion auf 8 hoch und erst im nächsten Zyklus bzw. beim nächsten RT_F4 wird in den ELSIF Zweig gesprungen.

Mach die Abfrage auf größer 7 gleich mit in den IF Zweig.

Gruß
 
Das sollte reichen:
Code:
IF RT_F4 THEN
  GLOB_DISP.KammerAuswahl := KammerAuswahl +1;
  IF GLOB_DISP.KammerAuswahl > 7 THEN
    GLOB_DISP.KammerAuswahl := 0;
  END_IF
END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... Mach die Abfrage auf größer 7 gleich mit in den IF Zweig.
Damit hast Du nicht Unrecht, aber - wenn man's mit einer IF-Abfrage regeln will - warum warten, bis der Wert nach der Addition von 1 grösser als 7 wird?
Ich würde vor der Addition abfragen, ob der Wert > 6 (oder >= 7) ist und in diesem Fall die Addition gar nicht erst ausführen und direkt den Wert löschen.

Z.B. (wenn's unbedingt mit einem ELSIF sein soll):
Code:
IF NOT RT_F4 THEN
;
ELSIF GLOB_DISP.KammerAuswahl > 6 THEN
    GLOB_DISP.KammerAuswahl := 0 ;
ELSE
    GLOB_DISP.KammerAuswahl := GLOB_DISP.KammerAuswahl + 1 ;
END_IF ;
Oder, wenn's auch ohne eine Abfrage des Wertes sein darf:
Code:
IF RT_F4 THEN
    GLOB_DISP.KammerAuswahl := (GLOB_DISP.KammerAuswahl + 1) MOD 8 ;
END_IF ;
 
Zuletzt bearbeitet:
Hallo,
Damit hast Du nicht Unrecht, aber - wenn man's mit einer IF-Abfrage regeln will - warum warten, bis der Wert nach der Addition von 1 grösser als 7 wird?
Ich würde vor der Addition abfragen, ob der Wert > 6 (oder >= 7) ist und in diesem Fall die Addition gar nicht erst ausführen und direkt den Wert löschen.

ich hatte keine Zeit, mußte in eine Besprechung, daher mußte es schnell gehen. Das war die einfachste und verständlichste Erklärung. Außerdem hege ich die Hoffnung, daß der Kollege dadurch seinen Gedankenfehler besser nachvollziehen kann.

Die Modulus Variante wäre auch meine bevorzugte Variante, aber da die Grundlagen zu erklären hätte zu lange gedauert, auch vergesse ich immer ob das jetzt eine Funktion oder ein Operator ist, bei letzterem versuche ich es auch immer erst in der C Variante (%) bevor ich daran denke, daß es hier mod heißt.

Gruß
 
hey,
das Problem ist mittlerweile gelöst und aufgrund eurer Erklärungen und Lösungen hab ich was dazu gelernt und auch verstanden, was ich falsch gemacht habe.
Wollte mich deshalb nochmal bei allen für die schnellen Antworten bedanken :)
 
Zurück
Oben