CASE_OF

Zuviel Werbung?
-> Hier kostenlos registrieren
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.
ich habe einen Alarm bedingt mit dem Bit verbunden, und gesetzt bis es Quittiert wird aber trotzdem nichts !:unsure:
 

Anhänge

  • 1.png
    1.png
    16,1 KB · Aufrufe: 8
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.
was ich nicht verstehe, warum ich das machen soll.
sowieso mein Programm ist klein, und ich weiß es nicht wie ich alle Wert zurücksetze, damit ich überhaupt was sehen kann!
Blöde Frage...
gibt es keine Restart :censored:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich schreibe die Werte, genau Simuliert ein Sensor

achso Danke ^_^
Ja, aber wieso schreibst Du dann eine negastive Zahl da rein? Der Sensor liefert doch nur positive Werte. Soweit ich das bei Masse an Beiträgen hier noch richtig im Kopf habe wird Dein Sensor 0 - 5V liefern, da wären dann 0 - 16383 oder 16383.
 
Ja, aber wieso schreibst Du dann eine negastive Zahl da rein? Der Sensor liefert doch nur positive Werte. Soweit ich das bei Masse an Beiträgen hier noch richtig im Kopf habe wird Dein Sensor 0 - 5V liefern, da wären dann 0 - 16383 oder 16383
Ich möchte nur wissen, wie es funktioniert, wenn ich es brauche. Wenn ein negativer Wert auftritt, sollte eine Bitmeldung ausgelöst werden.
oder macht es keinen Sinn 😅

Ich möchte nur fit werden mit CODESYS evtl. SPS und ST Sprache ^_^
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es kann keinen Restart geben, weil es keinen Stop gibt (Von Breakpoints mal abgesehen), Dein Programm wird wiederholt ausgeführt
also das heiß, wenn ich alles zurücksetzen möchte muss ich es selber programmieren stimmt
(s. Kapitel 2 Immer schön im Kreis, ohne Pause und bitte gleichmäßig, S. 83ff).
bin am Ende von Kapitel 1 noch :(
 
Und welchen Sensor denn genau? Eher simulierst du doch eine analoge Baugruppe.. auch da solltest du wissen was du tust.
Ich mach eher so eine Übung um es besser verstehen zu können.
zB von Beckhoff eine EL3052 (4..20mA) wird dir idR einen Wert zwischen 0 und 32767 ausgeben als Integer. Nichts im negativen Bereich
kommt nie einen Wert beispielsweise im Negativeinbereich durch einen Fehler oder so, abgesehen von einem Hersteller ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mach eher so eine Übung um es besser verstehen zu können.

kommt nie einen Wert beispielsweise im Negativeinbereich durch einen Fehler oder so, abgesehen von einem Hersteller ?
Bei einer 0-10V oder 4-20mA oder 0-20mA Klemme kann es keine negativen Werte geben, nur bei einer -10 - 10V Klemme kann es negative Werte geben.
 
1713883903468.png
Das ist eine Zuweisung, kein Vergleich...
[SPEKULATION AN]
wird möglichweise im Zuge der IF-Abfrage immer TRUE rauskommen, weil die Zuweisung erfolgreich ist.
[/SPEKULATION AUS]

1713883999928.png
Hier setzt Du in jedem Fall deine beiden Variablen SOFORT wieder auf FALSE.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 77595
Das ist eine Zuweisung, kein Vergleich...
IF GVL..... = TRUE dann soll er doAlarm true machen
:= Zuweisung und : Vergleich ?
[SPEKULATION AN]
wird möglichweise im Zuge der IF-Abfrage immer TRUE rauskommen, weil die Zuweisung erfolgreich ist.
[/SPEKULATION AUS]

Anhang anzeigen 77596
Hier setzt Du in jedem Fall deine beiden Variablen SOFORT wieder auf FALSE.
nicht erst wenn ich Quotiere ? :cry:
 
IF GVL..... = TRUE dann soll er doAlarm true machen
:= Zuweisung und : Vergleich ?
:= ist eine Zuweisung
: ist eine Deklarierung
= ist ein Vergleich

noch ein Formatierungstipp: Nach IF ... THEN kommt meistens ein Zeilenbruch über die Enter-Taste, auch generell arbeitet man eher nicht mit Leerzeichen sondern rückt sein Programm über Tab Spaces ein. So weiß auch deine Entwicklungsumgebung wie sie den Space in einer neuen Zeile zu setzen hat.
 
Da hast Du mich tatsächlich missverstanden. Wie am Anfang des Abschnitts "Spezielle Konvertierungsfunktionen bei Siemens" erwähnt geht es um die Funktion DWORD_TO_REAL die es sowohl im Codesys Universum als auch bei Siemens gibt. Diese Funktion verhält sich bei Codesys jedoch genaugenommen falsch.
Wie Du ja schon lesen konntest, gibt es Variablentypen zur Ablage von Zahlen, z.B. INT oder UINT für Ganzzahlen und REAL für Fließkommazahlen und welche zur Ablage von Bits, z.B. BYTE oder WORD. Letztere sollten nicht für Arithmetische Operationen, sprich zum Rechnen verwendet werden und nur in binärer Schreibweise dargestellt werden. Da die binäre Schreibweise aber unter Umständen sehr schwer zu lesen ist, kann alternativ noch das hexadezimale Format genutzt werden, eine dezimale Darstellung ist aber eigentlich nicht sinnvoll. Obwohl das so ist werden diese Typen trotzdem in dezimaler Schreibweise dargestellt und auch zum Rechnen benutzt.
Doch nun endlich zu Deinem Missverständnis.
Daten und damit auch Zahlen können auf unterschiedlichen Wegen in eine SPS gelangen. Einer dieser Wege ist zum Beispiel die Netzwerkkommunikation. Hier wird einfach eine Sammlung von 0en und 1en in Form von Bytes übertragen und es ist in dem Moment auch egal, welche Bedeutung diese Daten haben. Irgendwann werden die Daten aber verwendet und dann spielt die Bedeutung wieder eine Rolle. Enthalten diese Daten zum Beispiel eine Zahl im REAL Format belegt diese vier Bytes, was einem DWORD entspricht. Die Kombination aus 0en und 1en in diesem DWORD ergeben, wenn man Sie nach den Regeln interpretiert wie eine REAL-Zahl im Speicher abgelegt wird, eine bestimmte Fließkommazahl.
Hat man jetzt ein DWORD in dem so eine, für eine REAL-Zahl gültige (Es gibt auch ungültige Bitkombinationen), Bitkombination liegt und möchte diese in den Speicherbereich einer Variablen vom Typ REAL ablegen, kann man die Daten mit einem Befehl in den Speicherbereich der REAL-Variablen kopieren, bei diesem Befehl sind dann aber verschiedene Parameter zu verwenden. Schöner wäre es aber man hätte eine Funktion deren Rückgabewert ein REAL ist und deren einziger Parameter eine Variable vom Typ DWORD ist, diese gibt es mit dieser Funktionalität bei Siemens. Übergibt man bei Siemens dieser Funktion ein DWORD mit dem Wert 0x42000000, dann erhält man die Zahl 32 oder genauer 32.0 als Rückgabewert, was dem Bitmuster interpretiert als REAL-Zahl entspricht.
Im Codesys Universum wird das DWORD bei dieser Funktion aber mit einem UDINT gleichgesetzt und eine Zahl anhand der Stellenwertigkeit der einzelnen Bits (Bit 0 = 1, Bit 1 = 2, Bit 2 = 4, usw.) ermittelt und in eine REAL-Zahl gewandelt, was zum, eigentlich unerwünschten, Ergebnis von 1,107296.26E+09 führt.
Warum dieses eigentlich falsche Verhalten existiert ist mir ein Rätsel, da es auch die Funktion UDINT_TO_REAL gibt, bei der dieses Verhalten ja korrekt wäre.
 
Da hast Du mich tatsächlich missverstanden. Wie am Anfang des Abschnitts "Spezielle Konvertierungsfunktionen bei Siemens" erwähnt geht es um die Funktion DWORD_TO_REAL die es sowohl im Codesys Universum als auch bei Siemens gibt. Diese Funktion verhält sich bei Codesys jedoch genaugenommen falsch.
Wie Du ja schon lesen konntest, gibt es Variablentypen zur Ablage von Zahlen, z.B. INT oder UINT für Ganzzahlen und REAL für Fließkommazahlen und welche zur Ablage von Bits, z.B. BYTE oder WORD. Letztere sollten nicht für Arithmetische Operationen, sprich zum Rechnen verwendet werden und nur in binärer Schreibweise dargestellt werden. Da die binäre Schreibweise aber unter Umständen sehr schwer zu lesen ist, kann alternativ noch das hexadezimale Format genutzt werden, eine dezimale Darstellung ist aber eigentlich nicht sinnvoll. Obwohl das so ist werden diese Typen trotzdem in dezimaler Schreibweise dargestellt und auch zum Rechnen benutzt.
Vielen Dank für die Vertiefung des Wissens. Mir hat besonders gefallen, wie du den Begriff 'Bitscontainer' benutzt hast. Das hat es mir viel einfacher gemacht, es zu verstehen.
Kurze Frage: Wenn ich ein Bit von einem Byte verwende, wird ein komplettes Byte besetzt oder für den Bit verlegt. Soweit, so gut. Aber kann ich die restlichen Bits des Bytes als Variablen verwenden, richtig?
Doch nun endlich zu Deinem Missverständnis.
Daten und damit auch Zahlen können auf unterschiedlichen Wegen in eine SPS gelangen. Einer dieser Wege ist zum Beispiel die Netzwerkkommunikation. Hier wird einfach eine Sammlung von 0en und 1en in Form von Bytes übertragen und es ist in dem Moment auch egal, welche Bedeutung diese Daten haben. Irgendwann werden die Daten aber verwendet und dann spielt die Bedeutung wieder eine Rolle. Enthalten diese Daten zum Beispiel eine Zahl im REAL Format belegt diese vier Bytes, was einem DWORD entspricht. Die Kombination aus 0en und 1en in diesem DWORD ergeben, wenn man Sie nach den Regeln interpretiert wie eine REAL-Zahl im Speicher abgelegt wird, eine bestimmte Fließkommazahl.
Hat man jetzt ein DWORD in dem so eine, für eine REAL-Zahl gültige (Es gibt auch ungültige Bitkombinationen), Bitkombination liegt und möchte diese in den Speicherbereich einer Variablen vom Typ REAL ablegen, kann man die Daten mit einem Befehl in den Speicherbereich der REAL-Variablen kopieren, bei diesem Befehl sind dann aber verschiedene Parameter zu verwenden. Schöner wäre es aber man hätte eine Funktion deren Rückgabewert ein REAL ist und deren einziger Parameter eine Variable vom Typ DWORD ist, diese gibt es mit dieser Funktionalität bei Siemens. Übergibt man bei Siemens dieser Funktion ein DWORD mit dem Wert 0x42000000, dann erhält man die Zahl 32 oder genauer 32.0 als Rückgabewert, was dem Bitmuster interpretiert als REAL-Zahl entspricht.
Im Codesys Universum wird das DWORD bei dieser Funktion aber mit einem UDINT gleichgesetzt und eine Zahl anhand der Stellenwertigkeit der einzelnen Bits (Bit 0 = 1, Bit 1 = 2, Bit 2 = 4, usw.) ermittelt und in eine REAL-Zahl gewandelt, was zum, eigentlich unerwünschten, Ergebnis von 1,107296.26E+09 führt.
Warum dieses eigentlich falsche Verhalten existiert ist mir ein Rätsel, da es auch die Funktion UDINT_TO_REAL gibt, bei der dieses Verhalten ja korrekt wäre.
Achso sehr schön erklärt danke ^_^
das bedeutet wenn ich einen REAL variablen habe, und SPS kommuniziert mit einem Gerät kann es sein das es zu einem DWORD gewandelt werden muss, und somit muss ich es wieder zu REAL wandele damit ich meine Fließkommazahl wieder habe.
und unten hast erklärt wie es Siemens und Codesys macht. aber bei Codesys führt immer zu einem Falschen Zahl ?
muss ich dann diese Umwandlung DWORD_TO_UDINT selber dann schreiben oder ?
ein Beispiel wäre super wenn es möglich ist.
Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nehmen wir z.B. Modbus: Eine Adresse im Modbus, ein Register, entspricht einem WORD.
Wenn nun aber ein Gerät ein REAL zur Verfügung stellen will, legt das Gerät diesen REAL in zwei WORD-Registern ab. Diese muß ich also zusammen abrufen. Und dann habe ich auf meiner Steuerung ein Bitmuster, das sich aus zwei WORD zusammensetzt. Weil auch bei mir wird der abgerufene Datenbereich i.d.R. erstmal wieder als zwei WORD dargestellt.
Nun muß ich aus den beiden WORD ein DWORD bauen. Und dieses DWORD kann ich dann als REAL interpretieren. Ich als Programmierer muß also wissen, was ich in der Variablen erwarte und wie ich das Bitmuster gelesen haben möchte.

Hier werden zwei WORD in ein DWORD konvertiert:
Code:
SHL(WORD_TO_DWORD(HIGH_WORD),16) OR WORD_TO_DWORD(LOW_WORD)

Was wird gemacht?
WORD_TO_DWORD legt das WORD intern in eine DWORD-Variable, und zwar rechtsbündig,
links sind nur Nullen.
Damit ich das eine WORD nun im linken Bereich stehen habe, wird es mit SHL (Shift Left)
dorthin verschoben.
Da es sich um "Bitcontainer" handelt, kann man mit einem logischen OR ein DWORD
aus den beiden einzelnen DWORDS bilden, weil das eine rechts, das andere links seine
Nullen hat, besteht das resultierende DWORD aus den Bits der beiden WORD.

Nun haben wir ein DWORD, das wir zu einem REAL machen wollen:
Code:
MyDWORD     : DWORD;  <-- hier liegt nun mein Bitmuster aus obiger Operation
MyPointer    : POINTER TO REAL;    <-- Zeiger auf eine REAL-Zahl
MyReal        : REAL; <-- Meine REAL-Zahl

MyPointer := ADR(MyDWORD); <-- MyPointer enthält nun die Speicheradresse meines Bitmusters
MyReal      := MyPointer^; <-- mit "^" nehme ich das gespeicherte Bitmuster dieser Speicheradresse

Somit habe ich jetzt das Bitmuster von MyDWORD in die Variable MyReal transferiert.
Dort wird es jetzt als REAL interpretiert.
 
Nehmen wir z.B. Modbus: Eine Adresse im Modbus, ein Register, entspricht einem WORD.
Wenn nun aber ein Gerät ein REAL zur Verfügung stellen will, legt das Gerät diesen REAL in zwei WORD-Registern ab. Diese muß ich also zusammen abrufen. Und dann habe ich auf meiner Steuerung ein Bitmuster, das sich aus zwei WORD zusammensetzt. Weil auch bei mir wird der abgerufene Datenbereich i.d.R. erstmal wieder als zwei WORD dargestellt.
Nun muß ich aus den beiden WORD ein DWORD bauen. Und dieses DWORD kann ich dann als REAL interpretieren. Ich als Programmierer muß also wissen, was ich in der Variablen erwarte und wie ich das Bitmuster gelesen haben möchte.

Hier werden zwei WORD in ein DWORD konvertiert:
Code:
SHL(WORD_TO_DWORD(HIGH_WORD),16) OR WORD_TO_DWORD(LOW_WORD)

Was wird gemacht?
WORD_TO_DWORD legt das WORD intern in eine DWORD-Variable, und zwar rechtsbündig,
links sind nur Nullen.
Damit ich das eine WORD nun im linken Bereich stehen habe, wird es mit SHL (Shift Left)
dorthin verschoben.
Da es sich um "Bitcontainer" handelt, kann man mit einem logischen OR ein DWORD
aus den beiden einzelnen DWORDS bilden, weil das eine rechts, das andere links seine
Nullen hat, besteht das resultierende DWORD aus den Bits der beiden WORD.

Nun haben wir ein DWORD, das wir zu einem REAL machen wollen:
Code:
MyDWORD     : DWORD;  <-- hier liegt nun mein Bitmuster aus obiger Operation
MyPointer    : POINTER TO REAL;    <-- Zeiger auf eine REAL-Zahl
MyReal        : REAL; <-- Meine REAL-Zahl

MyPointer := ADR(MyDWORD); <-- MyPointer enthält nun die Speicheradresse meines Bitmusters
MyReal      := MyPointer^; <-- mit "^" nehme ich das gespeicherte Bitmuster dieser Speicheradresse

Somit habe ich jetzt das Bitmuster von MyDWORD in die Variable MyReal transferiert.
Dort wird es jetzt als REAL interpretiert.
WoW,
Vielen Dank für deine Mühe, du hast es wirklich sehr gut erklärt.
Ich habe es gespeichert, damit ich es wiederfinden kann. :love:
 
Zurück
Oben