CASE_OF

Zuviel Werbung?
-> Hier kostenlos registrieren
"Also habe ich es getestet, und es zeigt keine Warnungen oder Fehler, aber die Berechnung ist dann falsch, was zu fehlerhaften Informationen führen kann.
PPS: anscheinend muß man in Codesys explizit die Funktionen CheckRangeSigned und CheckRangeUnsigned implementieren. Wenn nicht, dann lässt Codesys die Laufzeitfehler wegen Bereichsüberschreitung ohne Fehlermeldung "durchgehen". Naja ...
Eigentlich hat jeder mir bekannte Prozessor Flags, die nach jeder Operation ggf. Fehler anzeigen - man muss sie nur auswerten. Anscheinend wird in Codesys (V2) standardmäßig auf die Fehlersignalisierung verzichtet, um schnelleren Prozessorcode zu erhalten. Da müsste der Programmierer beim Programmieren überlegen, ob Fehler auftreten könnten und ob man sie einfach ignorieren kann oder doch besser drauf reagiert ...
 
Such mal in der CoDeSys-Hilfe:
Funktion
Wenn Sie in Ihrem Projekt eine Funktion mit Namen CheckBounds definieren, können Sie damit Bereichsüberschreitungen in Arrays automatisch überprüfen (siehe 'Die Datentypen').
Wenn Sie die Funktionen CheckDivByte, CheckDivWord, CheckDivDWord und CheckDivReal definieren, können Sie damit bei Verwendung des Operators DIV den Wert des Divisors überprüfen, beispielsweise um eine Division durch 0 zu verhindern (siehe 'Die IEC Operatoren..').
Wenn Sie die Funktionen CheckRangeSigned und CheckRangeUnsigned definieren, können Sie damit im online-Betrieb automatisch Bereichsüberschreitungen bei Variablen, die mit Unterbereichstypen deklariert sind, abfangen.
Die genannten Funktionsnamen sind aufgrund der hier beschriebenen Einsatzmöglichkeit reserviert.
Die Funktionsnamen sind reserviert, die Implementierung mußt Du selbst übernehmen, da gibts aber in der Hilfe Vorlagen für.
Ist die Funktion im Programm vorhanden, wird sie aufgerufen, sonst nicht.
 
Such mal in der CoDeSys-Hilfe:

Die Funktionsnamen sind reserviert, die Implementierung mußt Du selbst übernehmen, da gibts aber in der Hilfe Vorlagen für.
Ist die Funktion im Programm vorhanden, wird sie aufgerufen, sonst nicht.
Achso ja ich habe es definiert für DIV/0, und dann kamen alle dazun.
ich sehe es jzt ganz unter CheckRangeUnsigned.
ich kann dann ein Bit setzen, wenn es aktiviert wird stimmt, sowie bei Div/0 ?
 
Zuletzt bearbeitet:
wie lösche eine Zitat hier 😥
Löschen kannst Du Beiträge nie komplett, nur den Inhalt innerhalb von 24h bearbeiten oder entfernen, bestimmte Nutzer können dies auch länger.
Löschen können nur die Admins.
Das Entfernen von Inhalten sollte aber gegebenenfalls unterbleiben. Hat man Blödsinn geschrieben, kann man seinen Beitrag durch einen Hinweis ersetzen, das der Beitrag Blödsinn war. Aber es kann in bestimmten Situationen auch besser sein, bei einem Gedankenfehler den "Blödsinn" stehen zu lassen und unten drunter einen Hinweis zu setzen. Eventuell hat ein anderer auch diesen Gedankenfehler, das kann er dann aber nur erkennen, wenn der Beitrag noch existiert und dort nicht nur steht, "Meine Idee war Blödsinn.".
 
@JSEngineering
kann man es dann so machen, oder wie macht man es ?
weil anscheinend gibt es einen Fehler ?
und wie kann ich wissen, was für Fehlern die Blauen Striche haben ?
danke
 

Anhänge

  • 3.png
    3.png
    22,9 KB · Aufrufe: 17
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
weil anscheinend gibt es einen Fehler ?
Das ist kein Fehler, sondern eine Warnung, ein Fehler wäre rot.
und wie kann ich wissen, was für Fehlern die Blauen Striche haben ?
danke
Einfach mit der Maus darauf zeigen, dann kommt ein Hinweis, Ansonsten steht das nach dem Übersetzen auch in der Fehlerliste.
Was soll die Zeile übehaupt machen?
Das Variablen nicht Case Sensitiv sind und Du somit in Zeile 3 und 4 die selbe Variable setzt ist Dir bewusst.
Übrigens, was ist an der markierten Zeile so missverständlich, dass Du die Anweisung ignorierst?
1713863328362.png
Es ist nur erlaubt lokale Variablen hinzuzufügen und die deklariert man zwischen VAR und END_VAR.
1713863445311.png
 
Das ist kein Fehler, sondern eine Warnung, ein Fehler wäre rot.

Einfach mit der Maus darauf zeigen, dann kommt ein Hinweis, Ansonsten steht das nach dem Übersetzen auch in der Fehlerliste.
Was soll die Zeile übehaupt machen?
Das Variablen nicht Case Sensitiv sind und Du somit in Zeile 3 und 4 die selbe Variable setzt ist Dir bewusst.
Übrigens, was ist an der markierten Zeile so missverständlich, dass Du die Anweisung ignorierst?
Anhang anzeigen 77578

Es ist nur erlaubt lokale Variablen hinzuzufügen und die deklariert man zwischen VAR und END_VAR.
Achso danke
ich denke ich habe mal gesehen letzte Woche wie die einen BitMeldung erzeugen, wenn ein DIV/0 gibt.
und das versuche ich mit UINT zu machen, aber ich weiß es nicht wie
ich will nur damit wissen, wenn mein Wert negativ ist, damit ich weiß, dass etwas nicht stimmt, falls ein falscher Wert angezeigt wird
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du deklarierst in einer GVL (Globalen Variablenliste) eine Variable, entweder einen INT und zählst hoch oder einen BOOL und setzt den.
Diese Variable nutzt Du dann in der Check-Funktion. Dann kannst Du in der GVL nachsehen, ob da was passiert.
Und wenn was passiert, dann setzt Du im Debug-Modus einen Breakpoint in der Check-Funktion an der Stelle, wo die Variable gesetzt wird und kannst dann schrittweise weitergehen, bis Du aus der Check-Funktion raus zurück zu Deinem Code springst, da siehst Du dann, wo es passiert.
 
Du deklarierst in einer GVL (Globalen Variablenliste) eine Variable, entweder einen INT und zählst hoch oder einen BOOL und setzt den.
wie meinst Hochzählen ?
komme leider nicht gut mit :(
Diese Variable nutzt Du dann in der Check-Funktion. Dann kannst Du in der GVL nachsehen, ob da was passiert.
4.png

Und wenn was passiert, dann setzt Du im Debug-Modus einen Breakpoint in der Check-Funktion an der Stelle, wo die Variable gesetzt wird und kannst dann schrittweise weitergehen, bis Du aus der Check-Funktion raus zurück zu Deinem Code springst, da siehst Du dann, wo es passiert.
leider verstehe ich nur Bahnhof :´(
 
1713864920926.png
Dort in der GVL deklarierst Du eine Variable.
Entweder CheckRangeUnsigned_Upper : BOOL; oder CheckRangeUnsigned_Upper : INT;

In der Funktion, an der Stelle, wo Du bereits editierst, schreibst Du dann entweder CheckRangeUnsigned_Upper := TRUE; oder CheckRangeUnsigned_Upper := CheckRangeUnsigned_Upper + 1;

Entweder wird Dir nun das Bit TRUE gesetzt (und Du mußt es ggf. während des Testens zurücksetzen, um weiterzutesten) oder der Integer wird raufgezählt in jedem Zyklus.
leider verstehe ich nur Bahnhof :´(
Hab im Moment gerade hier kein TC3...
Aber irgendwo hast Du ein Menü zum Debuggen. Dort kannst Du Haltepunkte (Breakpoints) setzen. Wenn das Programm dann im Debug-Modus dort ankommt, hält es genau an der Zeile dann an.
Und dann findest Du in dem Menü auch Befehle wie z.B. "Einzelschritt". Damit führst Du dann genau nur eine Zeile Code aus, die nächste. Damit kannst Du Dich dann "durchtickern", bis Du zur fehlerhaften Stelle kommst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 77582
Dort in der GVL deklarierst Du eine Variable.
Entweder CheckRangeUnsigned_Upper : BOOL; oder CheckRangeUnsigned_Upper : INT;

In der Funktion, an der Stelle, wo Du bereits editierst, schreibst Du dann entweder CheckRangeUnsigned_Upper := TRUE; oder CheckRangeUnsigned_Upper := CheckRangeUnsigned_Upper + 1;

Entweder wird Dir nun das Bit TRUE gesetzt (und Du mußt es ggf. während des Testens zurücksetzen, um weiterzutesten) oder der Integer wird raufgezählt in jedem Zyklus.
also ich habe beides benutzt um zu gucken.
aber ich bin Online gegangen mit Negativen Wert, aber wurde leider nicht bewirkt, woran kann es liegen?
Hab im Moment gerade hier kein TC3...
Aber irgendwo hast Du ein Menü zum Debuggen. Dort kannst Du Haltepunkte (Breakpoints) setzen. Wenn das Programm dann im Debug-Modus dort ankommt, hält es genau an der Zeile dann an.
Und dann findest Du in dem Menü auch Befehle wie z.B. "Einzelschritt". Damit führst Du dann genau nur eine Zeile Code aus, die nächste. Damit kannst Du Dich dann "durchtickern", bis Du zur fehlerhaften Stelle kommst.
Achso ich habe es gefunden (y)

11.png

ich denke mein Programm haltet hier an und macht nicht weiter oder sehe ich es Falsch ?
 

Anhänge

  • 7.png
    7.png
    21,4 KB · Aufrufe: 6
  • 8.png
    8.png
    150,7 KB · Aufrufe: 6
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja, von irgendwoher muss der negative Wert ja kommen.
Wo wird denn aiLevel geschrieben? Ist das ein Hardwareeingang.
Übrigens Einzelzyklus beginnt zwar auch mit Einzel ist aber nicht das was @JSEngineering meinte. Er meinte Einzelschritt, damit springt man eine Zeile weiter. Mit Einzelzyklus wird das Programm bis zum nächsten Breakpoint ausgeführt.
 
Der Pfeil zeigt, wo Du gerade stehst. Wenn Du einen weiteren Einzeschritt ausführst, wird die Zeile ausgeführt, in der der Pfeil steht.
Es gibt einen Einzelschritt "springe hinein" und "springe über": Wenn eine Funktion ausgeführt werden soll, kannst Du entweder "hinein" springen, oder aber den Code der Funktion in einem Rutsch ausführen.
Du möchtest die Evaluierung sehen, also "hineinspringen", damit auch der Funktionscode zeilenweise ausgeführt wird.
Eine "Meldung" bekommst Du nicht. Die CheckRange-Funktion korrigiert ja schon den Wert. Du kannst das wenn dann nur an Deiner eigenen Kontroll-Variablen sehen.
 
Na ja, von irgendwoher muss der negative Wert ja kommen.
Wo wird denn aiLevel geschrieben? Ist das ein Hardwareeingang.
ich schreibe die Werte, genau Simuliert ein Sensor
Übrigens Einzelzyklus beginnt zwar auch mit Einzel ist aber nicht das was @JSEngineering meinte. Er meinte Einzelschritt, damit springt man eine Zeile weiter. Mit Einzelzyklus wird das Programm bis zum nächsten Breakpoint ausgeführt.
achso Danke ^_^
 
Zurück
Oben