CASE_OF

Zuviel Werbung?
-> Hier kostenlos registrieren
... der TE ist dazu eingeladen selber auch mitzudenken und zu testen. Das ist ja eine rein logische Angelegenheit die man sehen sollte auch wenn man kein SCL Profi ist.
Ja, ist wie das hier:
Und das Gleiche wie Dein IF-Konstrukt ist es btw. auch nicht, denn dort hast Du jetzt noch eine weitere Bedingung eingefügt, die Du in diesen Codezeilen nicht hast.
...wenn man zwei Zeilen tiefer selber nicht mehr weiß, was man eigentlich ursprünglich wollte.
🤷‍♂️
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... als Kunde würde ich Dich für diesen Weg erschlagen.
😱
🤷‍♂️

Gut, dass Du ihn auskommentiert hast.
Noch besser, wenn Du das löschst und aus Deinem Gedächtnis verbannst.
😁
ich habe es drin gelassen, um es nur besser zu verstehen 😅
PS:
Man sieht übrigens genau, was Du vom Forum kopiert und was Du selbst eingefügt hast.
Und das Gleiche wie Dein IF-Konstrukt ist es btw. auch nicht, denn dort hast Du jetzt noch eine weitere Bedingung eingefügt, die Du in diesen Codezeilen nicht hast.
😜
das ist mir schon eingefallen, aber ist es ja einen AND Bedingung und es ist dann schon erledigt Stimmt?
und Guten Morgen erstmals😄
 
Jzt sieht mein Programm so aus, und ich denke es ist dabei fertig.

aber ich habe eine Frage an @oliver.tonn
erst mal Vielen dank für dein Buch, es macht tatsächlich sehr viel Spaß es zu lesen.
und danke für die Empfehlung @DeltaMikeAir

jzt meine Frage, ich habe in meinem Programm von INT to UINT impliziert konvertiert, aber könnte das zu einem Problem führen, wenn meine Zahlen negativ wären, richtig?
ich frag nur um meine Wissen zu vertiefen und um zu gucken ob ich den ersten Kapital 1x1 gut verstanden habe :)
ich habe vor sowieso es nochmal zu lesen (y)
danke ^_^
 

Anhänge

  • 1.png
    1.png
    78 KB · Aufrufe: 14
Ich bin nicht Oliver, antworte aber mal ...
U bei dem Varaiblentyp steht für unsigned - also kein Vorzeichen.
Diese Variablen, oder auch BYTE, WORD und DWORD können eigentlich keine Zahlen (und somit auch nicht rechnen) sondern nur (binäre) Zustände.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin nicht Oliver, antworte aber mal ...
alles gut, ich freue mich für jede Hilfe
dankeschön
U bei dem Varaiblentyp steht für unsigned - also kein Vorzeichen.
Diese Variablen, oder auch BYTE, WORD und DWORD können eigentlich keine Zahlen (und somit auch nicht rechnen) sondern nur (binäre) Zustände.
vllt habe ich es falsch formuliert meine Frage wäre,
UINT fängt von 0 an.
INT im Gegenteil hat von -32000 -+32000 ungefähr
Und wenn zum Beispiel eine negative Zahl kommt und sie konvertiert wird, führt das zu einem Fehler?
 
wenn zum Beispiel eine negative Zahl kommt und sie konvertiert wird, führt das zu einem Fehler?
Das habe ich ehrlich gesagt noch nie getestet - ich denke aber mal, dass dadurch dann einfach das höchstwertigste Bit gesetzt ist. Im Grunde sprechen wir hier ja auch nicht von einer wirklichen Konvertierung sondern sagen dem System nur, wie die Variable zu interpretieren ist.
Was ist aber der konkrete Hintergrund deiner Frage ?
 
wenn zum Beispiel eine negative Zahl kommt und sie konvertiert wird, führt das zu einem Fehler?
Negative Zahlen können natürlich nicht in Datentypen konvertiert werden, die nur positive Zahlen kennen. Der Versuch führt zu einem Fehler.

"unsigned" U..INT Zahlen können auch Zahlen und man kann damit rechnen. Sie können aber definitionsgemäß nur positive Zahlen. Da werden die Bitmuster in den Werten einfach nur als (doppelt großer) Bereich positiver Zahlen 0...+max interpretiert. Bei "signed" Datentypen wird die Hälfte der Bitmuster als positive und die andere Hälfte der Bitmuster als negative Zahlen interpretiert. Ob positiv oder negativ zeigt das höchste Bit an.
 
Multiplikation und Division geht auch. Wird dabei der Zahlenbereich überschritten (z.B. bei Multiplikation), dann wird das über Flags als Fehler angezeigt.

PS: ich sehe grade, hier geht es wohl um Codesys. Ich weiß jetzt nicht, wie diese Fehler bei Codesys signalisiert und ausgewertet werden, aber da muss es auch ein System geben.

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 ...
 
Zuletzt bearbeitet:
Das habe ich ehrlich gesagt noch nie getestet - ich denke aber mal, dass dadurch dann einfach das höchstwertigste Bit gesetzt ist. Im Grunde sprechen wir hier ja auch nicht von einer wirklichen Konvertierung sondern sagen dem System nur, wie die Variable zu interpretieren ist.
Was ist aber der konkrete Hintergrund deiner Frage ?
"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.
 

Anhänge

  • 2.png
    2.png
    82,5 KB · Aufrufe: 11
Ich bin nicht Oliver, antworte aber mal ...
U bei dem Varaiblentyp steht für unsigned - also kein Vorzeichen.
Diese Variablen, oder auch BYTE, WORD und DWORD können eigentlich keine Zahlen (und somit auch nicht rechnen) sondern nur (binäre) Zustände.
Hallo Larry,
soweit ich Dich nicht missverstanden habe muss ich Dir etwas widersprechen.
Was Deine Aussage angeht, das BYTE, WORD, usw. keine Variablentypen für Zahlen sind, stimme ich Dir voll und ganz zu. Ich würde diese Typen als Bitcontainer bezeichnen. Aber UINT Variablen sind sehr wohl zur Aufnahme von Zahlen und zum Rechnen da, können aber halt nur positive Zahlen verarbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht nochmal anders ausgedrückt:
Das Bitmuster im Speicher bleibt gleich. Es wird nur anders interpretiert. Dadurch wird mit einer anderen Zahl gerechnet.
0..32767 sind in beiden Datentypen gleich. Wenn Du darüber hinausgehst, werden die entstehenden Bitmuster im INT Falle als negative Zahlen interpretiert (beginnend bei -32768), im UINT Falle zählst Du weiter bis 65535.

Rechnen kann man mit beiden Datentypen.
 
@der_NooB : dann erhältst du während der Berechnung schon ein paar interessante Wert-Überläufe ... u.A. daher kommt dann dein falsches Ergebnis. denk bei Multiplikation immer daran, wie groß die Zahl wird und wie groß der Darstellungsbereich deiner Quell-Variable ist ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jzt meine Frage, ich habe in meinem Programm von INT to UINT impliziert konvertiert, aber könnte das zu einem Problem führen, wenn meine Zahlen negativ wären, richtig?
ich frag nur um meine Wissen zu vertiefen und um zu gucken ob ich den ersten Kapital 1x1 gut verstanden habe :)
ich habe vor sowieso es nochmal zu lesen (y)
danke ^_^
Ja, bei der Konvertierung von negativen INT Zahlen in UINT treten auf den ersten Blick seltsam anmutende Effekte auf (s. Seite 58). Eine -32768 wird zu einer 32768 und ein -1 wird zu 65535. Das hängt damit zusammen, dass negative Zahlen im Zweierkompliment abgelegt werden und die Konvertierungsfunktion das die jeweilige Zahl repräsentierende Bitmuster einfach 1:1 übernimmt.
 
Ja, bei der Konvertierung von negativen INT Zahlen in UINT treten auf den ersten Blick seltsam anmutende Effekte auf (s. Seite 58). Eine -32768 wird zu einer 32768 und ein -1 wird zu 65535. Das hängt damit zusammen, dass negative Zahlen im Zweierkompliment abgelegt werden und die Konvertierungsfunktion das die jeweilige Zahl repräsentierende Bitmuster einfach 1:1 übernimmt.
Jawohl, das freut mich! Dann habe ich es richtig verstanden. Vielen Dank! <3

eins habe ich im Buch nicht verstanden eventuell in dem ersten kapital.
Als du über die Umwandlung von REAL zu DWORD geschrieben hast und erwähntest, dass einige Geräte keine REAL unterstützen, und deshalb DWORD verwendet werden könnte
könntest du mir bitte ein Beispiel geben oder vllt erklären wie du es meinst ?
 
Jawohl, das freut mich! Dann habe ich es richtig verstanden. Vielen Dank! <3

eins habe ich im Buch nicht verstanden eventuell in dem ersten kapital.
Als du über die Umwandlung von REAL zu DWORD geschrieben hast und erwähntest, dass einige Geräte keine REAL unterstützen, und deshalb DWORD verwendet werden könnte
könntest du mir bitte ein Beispiel geben oder vllt erklären wie du es meinst ?
Ich glaube da hast Du mich missverstanden. Hättest Du mal bitte die Seite wo das steht?
 
Zurück
Oben