Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Bit in Wort nach Integer

  1. #11
    Chris_Rgb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2009
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Der Kopf raucht, aber ich denke ich hab es verstanden, jedoch wäre ich nie auf die Idee gekommen.

  2. #12
    Chris_Rgb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2009
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hab noch ein TAW nach dem laden des Wortes eingefügt, da es sich eigentlich nicht um ein Wort sondern um ein Array von 16 Bit handelt

    Danke nochmal
    Christian

  3. #13
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Ich glaube diese abgewandelte Variante hatte ich auch schonmal irgendwo geposted, aber direkt kommt man zu der Bit-Position.
    Wow... Wie ich das gesehen hab blieb der Kiefer kurzzeitig unten..

    Ich hab mit dem Codeschnippsel ein wenig herumgespielt und zwar für folgende Anwendung...

    Ich brauch in einem meiner Standard-FBs eine Funktion damit ich die Adresse des gesetzten Bits in einem DWORD als Integer zurück bekomme.
    Beispiel: Bit 0.7 -> Wert 7; Bit 1.5 -> Wert 15; Bit 3.6 -> Wert 36.

    Bis jetzt hatte ich eine "unschöne" Konstruktion mit SRD -> Prüfung ob Bit gesetzt -> wenn nicht dann Schleife....

    Ich hab deinen Code mal hergenommen und es funktioniert ganz gut:
    CreateAddr_2.png

    Leider ergibt sich wenn Bit 3.7 gesetzt ist ein Fehler...
    CreateAddr_3.png

    Natürlich könnte ich diesen Fall einfach eindämmen in dem ich das Bit 3.7 zuvor separat Prüfe.. so ala...
    Code:
    L     #IN_DWORD
    L     128                         //Maske Bit 3.7
    UD    
    U     <>0
    SPBN  N37
    
    L     37
    T     #Addr_INT
    BEA   
    
    N37:  NOP   0
    //Hier Kommt der Rest
    Wäre an sich ja nicht so schlimm, ich muss ja den Fall wenn kein Bit gesetzt ist auch manuell abfangen, wären also 2 Fälle zum abfangen...

    Ich Frage mich jedoch ob ein einen intelligenteren Weg gäbe...

    Für mich ist ja schon wundersam das nach DWORD->REAL->Sub 126 ... was brauchbares rauskommt.
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Quasi ein sehr eingeschränkter Zweierlogarithmus.
    Egal.. dein Codeteil hat mir jedenfalls geholfen...
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  4. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von RONIN Beitrag anzeigen
    Wäre an sich ja nicht so schlimm, ich muss ja den Fall wenn kein Bit gesetzt ist auch manuell abfangen, wären also 2 Fälle zum abfangen...

    Ich Frage mich jedoch ob ein einen intelligenteren Weg gäbe...
    Bei DWORD muss du das Vorzeichenbit ausmaskieren, da DTR von DINT, also vorzeichenbehaftet den Datentyp wandelt.
    Das könntest du z.B. mit
    SLD 1
    SRD 24

    erledigen.

  5. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    RONIN (25.10.2014)

  6. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.308
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Zitat Zitat von Chris_Rgb Beitrag anzeigen
    Gibt es einen Standardbaustein der aus der Stelle, an der in einem Wort ein Bit gesetzt ist einen Int macht.
    Ja, gibt es: TI-S7-Lib: FC96 "ENCO"

    Zitat Zitat von RONIN Beitrag anzeigen
    Bis jetzt hatte ich eine "unschöne" Konstruktion mit SRD -> Prüfung ob Bit gesetzt -> wenn nicht dann Schleife....
    Macht Siemens in dem ENCO-Baustein auch so.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    RONIN (25.10.2014)

  8. #16
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.308
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Zitat Zitat von RONIN Beitrag anzeigen
    Code:
    L     #IN_DWORD
    L     128                         //Maske Bit 3.7
    UD    
    U     <>0
    SPBN  N37
    
    L     37
    T     #Addr_INT
    BEA   
    
    N37:  NOP   0
    //Hier Kommt der Rest
    Tips:
    Bei Wordverknüpfungen mit Konstanten kann die Konstante direkt in der Operation angegeben werden, z.B. "UD DW#16#80".
    Will man nur ein einzelnes Bit testen, dann ist es schneller und kürzer, das Bit in das Statusbit A1 zu schieben oder zu rotieren. (Bei Rotieren kann man sogar den AKKU-Inhalt weiterverwenden, weil keine Bits "weggelöscht" werden.)
    Wenn man abhängig vom Ergebnis ==0 oder <>0 springen will, dann braucht man nicht das Statusbit A1 ins VKE holen und dann VKE-abhängig springen, sondern kann direkt abhängig von A1 mit SPZ oder SPP springen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    RONIN (25.10.2014)

  10. #17
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von PN/DP Beitrag anzeigen
    Macht Siemens in dem ENCO-Baustein auch so
    Ja stimmt, ENCO geht auch, ist auch vermutlich besser wenn der TE diese verwendet. Mit der Formel von Thomas scheint es ein paar Probleme zu geben... Dazu später.
    Mit Schleifen hab ich natürlich kein Problem, wenn es mir einen Arbeits-Vorteil verschafft schreib ich eine.
    Die SPS hat eh genug Leistung.

    Zitat Zitat von PN/DP Beitrag anzeigen
    Tips:
    1: Bei Wordverknüpfungen mit Konstanten kann die Konstante direkt in der Operation angegeben werden, z.B. "UD DW#16#80".
    2: Will man nur ein einzelnes Bit testen, dann ist es schneller und kürzer, das Bit in das Statusbit A1 zu schieben oder zu rotieren
    3: ... sondern kann direkt abhängig von A1 mit SPZ oder SPP springen.
    Danke für die Tipps, hab sie gleich mal alle angewandt...
    1: Wusste ich absolut nicht! Steht zwar in der Hilfe aber... Sehr praktisch weil man für den Maskierwert den AKKU1 nicht ändern muss, bzw. AKKU2 nicht verliert.
    Das hätte ich schon öfters gebraucht.
    2: Wusste ich so halb. Mit Rotieren kann man ENCO sehr einfach nachprogrammieren.... Siehe unten.
    3: Die verschiedenen Sprungoperationen kenn ich, hatte mir aber abgewöhnt diese zu verwenden damit der Code für die Kollegen leichter zu lesen ist. Wenn klar da steht (L 0 - >I - SPB) kapiert das jeder auf Anhieb. Mittlerweile hab ich die Möglichkeit die verweden schon fast wieder vergessen...

    Mit RDLA und A1 lässt sich ENCO sehr einfach realisieren...
    Get_BitNUM_Working.jpg

    Ich hatte mich dann noch mit der Formel von Thomas ein wenig weiter gespielt. Mit einem Wort funktioniert sie tadellos, bei einem DWORD gibt's ein merkwürdiges Verhalten. Setzt man alle Bits bis 2.7 stimmt das Ergebnis noch, setzt man dann zusätzlich das Bit 3.0 dann gibt's einen Wertesprung... komisch...
    Get_BitAdress_1_Err.jpg

    Danach hab ich die Funktion nochmal so umgeschrieben das das DWORD getrennt als 2 Worte behandelt wird. Das liefert dann auch wirklich für alle Werte die korrekte Zahl von 0-37 zurück...
    Get_BitAdress_2_Working.jpg
    Naja, so schön is nicht...
    Die Variante ENCO oder RLDA ist aber wahrscheinlich nach Jahren wieder einfacher zu verstehen. Sonst hab ich wieder das Erlebnis...
    "Was zum ***** hast du dir den dabei gedacht?!?!?"...

    Fazit: Lustiges Gedankenexperiment, Viele Wege führen nach Rom, manche sind nur geiler...

    PS: Jetzt aber genug vom Bitwi**en...


    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    UPDATE: PN/DP hat ein Siemens-FAQ gefunden in dem dieser Algorithmus pikfein erläutert wird. Da steht dann auch drin warum man ihn nicht für DWORD verwenden kann....
    Maskieren vom niederwertigsten oder höchstwertigen gesetzten Bit in WORD und DWORD Variablen.
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Geändert von RONIN (17.12.2015 um 21:28 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  11. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    PN/DP (26.10.2014)

Ähnliche Themen

  1. TIA DB Wort auf Bit auswerten
    Von SEAL im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 27.04.2014, 17:07
  2. Bit-Position in Wort
    Von tschortscho51 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 03.11.2012, 20:00
  3. integer 32Bit in integer 16 Bit wandeln
    Von slk230-power im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 09.11.2009, 22:35
  4. DB Bit aus Wort auslesen
    Von Stromer im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 17.02.2007, 20:43
  5. Bit aus Wort auswerten?
    Von Anonymous im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 23.06.2004, 14:58

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •