Bit-Position in Wort

tschortscho51

Level-1
Beiträge
111
Reaktionspunkte
19
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich stehe offensichtlich mächtig auf dem Schlauch!
Mit der Suchfunktion habe ich schon eine Weile rumgesucht und nicht's (??) gefunden.
Ich sollte die TRUE-Bit-Position innerhalb eines Wortes als INT haben.
Es ist immer nur ein Bit auf TRUE.

Besten Dank.
 
Herzlichen Dank für die Antworten.
Gestern, am Ende der Arbeitswoche war mein Akku wohl leer.
Wenn Du die Thomas'sche Lösung mit minimal-Akku heute durchschaut hast bewundere ich Dich sehr.
Ich habe das (diesen Lösungsansatz) vor 3 Jahren schon gelesen (so was ähnliches) und muss zugeben, trotz Anleitung habe ich 3h gebraucht um es restlos zu verstehen.
:smile:
 
Verstanden habe ich das nicht.
Aber angewendet, und es funktioniert genau wie ich es brauche.
Nochmals allen beteiligten besten Dank.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe da auch eine Basis (Klassiker) die ich für sowas gerne verwende:
Code:
      L     #IN_WORD                    // zu prüfendes Wort
      L     0
      ==I   
      SPB   kbit
      TAK
      DTR   
      SRD   23
      L     126
      -D    
kbit: T     #Pos

Schöne Sache. Kann man dazu auch eine Erklärung bekommen? Würde mich wirklich brennend interessieren....
 
Nettes Beispiel auf das man erst einmal kommen muss, Respekt!

Auszug aus der Step7 Hilfe:

Zahlen im Gleitpunktformat werden in der allgemeinen Form "Zahl = m * b hoch E" dargestellt. Die Basis "b" und der Exponent "E" sind ganze Zahlen, die Mantisse "m" eine rationale Zahl.

Gleitpunktzahlen in STEP 7 entsprechen dem Grundformat mit einfacher Breite, wie in der Norm ANSI/IEEE Standard 754-1985, IEEE Standard for Binary Floating-Point Arithmetic beschrieben. Sie bestehen aus den folgenden Komponenten:

dem Vorzeichen V
dem um eine Konstante (Bias = +127) erhöhten Exponenten e = E + Bias
dem gebrochenen Teil der Mantisse m.

Der ganzzahlige Anteil der Mantisse wird nicht mit abgelegt, da er innerhalb des gültigen Zahlenbereichs immer = 1 ist

Die drei Bestandteile belegen zusammen ein Doppelwort (32 Bit)
Code:
Wert = (VZ) x (1,Mantisse) x (2[SUP](Exponent-127)[/SUP])

Nun möchte ich z.B. auswerten, ob das zweite Bit gesetzt ist. Im dualen Zahlensystem entspricht das dem Wert 2 (Wertigkeit 2[SUP]1[/SUP]). Im Format REAL muss ich also 2.0 erhalten. Die Mantisse muss bei Zahlen einer Zweierpotenz immer 0 sein. Also muss ich folgende Werte erhalten

Wert = + 1,0 x 2[SUP]1[/SUP]

Mein Exponent muss also 128 betragen! Durch das rechts rotieren wird die Mantisse ausgeblendet. Nun stehen im Akku der Exponent plus Bias und das Vorzeichen. Bit 0 ist das erste Bit, Bit 1 das zweite Bit, damit die Anzeige stimmt wird dann statt 127 nur 126 abgezogen.

Hat mich jetzt auch eine Zeit lang beschäftigt, also ich wäre auf diese Methode wohl nie gekommen ;)
 
Ist ja richtig intellektuelle Lektüre heute. :D


Ich hab's mal wieder genutzt, um ein klein wenig SCL zu üben:
Ich üb' hier an den Fragestellern. Was die so alles machen wollen ...

Für diejenigen, die's z.B. für die S7-1200 brauchen ->
Thomas'sche Lösung in SCL (BITPOS = 1-32):
Code:
[FONT=courier new]FUNCTION BITPOS : INT

VAR_INPUT
    IN_Word : WORD;
END_VAR


    BITPOS := DWORD_TO_INT (SHR (IN:= REAL_TO_DWORD ( DINT_TO_REAL ( DWORD_TO_DINT (IN_Word))), N:=23)) - 126;
    IF BITPOS < 0 THEN
        BITPOS := 0;
    END_IF;

END_FUNCTION[/FONT]

und wie ich's nach zotos Ansatz gelöst hätte
(BITPOS = 0-31, kein Bit = -1):
Code:
[FONT=courier new]FUNCTION BITPOS : INT[/FONT][FONT=courier new]
[/FONT]
[FONT=courier new]VAR_INPUT[/FONT]
[FONT=courier new]    In_WORD : WORD;[/FONT]
[FONT=courier new]END_VAR[/FONT]

[FONT=courier new]VAR_TEMP[/FONT]
[FONT=courier new]    TmpWORD : WORD;[/FONT]
[FONT=courier new]    TmpArray AT TmpWORD : ARRAY[0..15] OF BOOL ;[/FONT]
[FONT=courier new]    i,j : INT;[/FONT]
[FONT=courier new]END_VAR[/FONT]


[FONT=courier new]    TmpWORD := In_WORD;[/FONT]
[FONT=courier new]    BITPOS := -1;[/FONT]
[FONT=courier new]    FOR j := 8 TO 0 BY -8 DO[/FONT]
[FONT=courier new]        FOR i := 0 TO 7 DO[/FONT]
[FONT=courier new]            IF TmpArray[i + j] = TRUE THEN [/FONT]
[FONT=courier new]                BITPOS := i + 8 - j;[/FONT]
[FONT=courier new]            END_IF;[/FONT]
[FONT=courier new]        END_FOR;[/FONT]
[FONT=courier new]    END_FOR;[/FONT]

[FONT=courier new]END_FUNCTION[/FONT]

 
Zuletzt bearbeitet:
Zurück
Oben