Bits auslesen aus UINT

Cococabana

Level-2
Beiträge
34
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
ich bräuchte mal wieder eueren Rat. Ich habe an meiner EL6731 Profibus Masterklemme einen Frequenumrichter hängen. Der FU gibt mir einen zyklische Istwerte aus welche als 32 Bit Doppelwörter übertragen wird. Im TwinCAT System Manager werden mir dann in einem Array zwei Variablen a 16Bit als UINT erzeugt. Soweit so gut.

Der Übertragene Ist-Wert ist das Statuswort des FUs welches ich teilweise Visualisieren will. Nun könnte ich natürlich den Typ UINT belassen und für jeden möglichen Wert von 0-65535 über CASE die einzelnen Statusmeldungen in meiner Visu aktivieren. Gibt es nciht aber auch einen einfacheren Weg die einzelnen der 16 Bits auszulesen obs sie gesetzt sind?

Gruß Coco :)
 
Über
Code:
Variablenname.0
...
Variablenname.15
müsstest du die einzelnen Bits auswerten können.

alt aber aktuell: ich möchte das auszulesende Bit als Variable angeben (Variablenname.Bitnummer). Das frisst er aber nicht ("Ganze Zahl oder symbolische Konstante erwartet"). Ich peile nicht ganz was ich hier falsch mache. Hat wer Abhilfe? Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da musst du uns (oder zumindest mir) noch etwas mehr Informationen mitliefern.

Beckhoff sagt zu deiner Feherlmeldung folgendes: "Fügen Sie eine ganze Zahl oder den Bezeichner einer gültigen Konstante ein." (Link)
Hast du die Variable korrekt initialisiert? Ist es eine ganze Zahl?

Poste doch den Code mal, dann kann dir sicher schnell geholfen werden!
 
Da musst du uns (oder zumindest mir) noch etwas mehr Informationen mitliefern.

Beckhoff sagt zu deiner Feherlmeldung folgendes: "Fügen Sie eine ganze Zahl oder den Bezeichner einer gültigen Konstante ein." (Link)
Hast du die Variable korrekt initialisiert? Ist es eine ganze Zahl?

Poste doch den Code mal, dann kann dir sicher schnell geholfen werden!

Code:
FUNCTION_BLOCK FB_BitextractFromUdint
VAR_INPUT
    in:         UDINT;
    Bit:        USINT;
END_VAR
VAR_OUTPUT
    out: BOOL;
END_VAR

Programmcode:
out:=in.bit;

ja, die Info von Beckhoff hatte ich auch. Verwundert mich aber - sieht so aus als könnte "bit" nur eine Konstante sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann auch nur eine Konstante sein! Auch möglich ist es das Feature "Konstanten ersetzen" zu wählen, dann werden diese direkt im Code verwendet (hat aber auch Nachteile, das z.B. diese als Symbol nicht zur Verfügung stehen).
 
Das sieht nicht nur so aus.
Bleibt also nur
Code:
out:=(in AND SHL(UDINT#1,Bit))>0;
Man kann es ja in eine Funktion packen, damit es nicht jedesmal soviel Schreibarbeit ist.

genial. Danke! Wer das auch benötigt hier die leicht korrigierte Version:
FUNCTION fBitXtract : BOOL
VAR_INPUT
in: DWORD;
Bit: USINT;
END_VAR
IF (in AND SHL(DWORD#1, bit))>0 THEN fBitXtract:=TRUE; END_IF;

warum es mit DWORD geht, mit UDINT nicht ("...kann UDINT nicht in ANY_BIT kovertieren.." weiß ich allerdings auch nicht.
 
warum es mit DWORD geht, mit UDINT nicht ("...kann UDINT nicht in ANY_BIT kovertieren.." weiß ich allerdings auch nicht.
Damit komme ich auch immer durcheinander, wie man an dem Fehler in meinem Beispiel sieht. Streng genommen darf man mit ANY_BITs (BYTE, WORD, DWORD) nur boolesche und mit Integern nur arithmetische Operationen durchführen. CoDeSys nimmt es da nicht so genau. Warum man aber mit ANY_BITs rechnen kann, jedoch Integer nicht logisch verknüpfen darf, weiss der Geier.
 
Zurück
Oben