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

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 36 von 36

Thema: Zustandsbits in Zustands-Integer

  1. #31
    Registriert seit
    11.12.2008
    Beiträge
    73
    Danke
    39
    Erhielt 9 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Gebs Beitrag anzeigen
    Wenn Du nur den Exponenten zur Basis 2 brauchst, versuchs mal so:
    Code:
    L #i_temp  // Integerwert
    ITR // in Realzahl wandeln
    SLD 1 // Vorzeichen rausschieben
    SRD 24 // Mantisse rausschieben
    T #Exponent // da ist der Exponent zur Basis 2
    Ich hab' jetzt aber nicht geguckt, wie lang die Ausführungszeit ist.

    Grüße
    Gebs
    coole sache wenns funktioniert... die ausführungszeit laut tabelle ist vernachlässigbar klein (DTR -> 2,7 microsek. auf ner 315)

    mal sehen, ob ich da nicht morgen n fixen ansatz draus gebacken bekomme...

    wenn nur 1 bit gesetzt werden dürfte, wärs mit dem exponenten ja schon getan...

    aber bei mehreren sollte man gefundene bits eigentlich per XOW wegmaskieren können und das ganze einfach nochmal machen können

    danke an alle!

  2. #32
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Zitat Zitat von Mangokind Beitrag anzeigen
    coole sache wenns funktioniert...
    Also in S5 hat es funktioniert. Aber da war es ja KG. Ich hab' noch mal nachgesehen und
    wenn ich mich nicht verguckt hab, unterscheiden sich KG und REAL nur beim BIAS, und das ist
    bei natürlichen Zahlen nicht relevant.

    Grüße
    Gebs

  3. Folgender Benutzer sagt Danke zu Gebs für den nützlichen Beitrag:

    Mangokind (06.03.2009)

  4. #33
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von Mangokind Beitrag anzeigen

    aber bei mehreren sollte man gefundene bits eigentlich per XOW wegmaskieren können und das ganze einfach nochmal machen können
    Aber mir ist immer noch unklar, was das wirklich bringt (an Vereinfachung und/oder Rechenzeitersparnis). Hängt sicher davon ab, wieviele Bits so im Durchschnitt gesetzt sind. Der resultierende Code würde mich dann mal interessieren.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

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

    Mangokind (06.03.2009)

  6. #34
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Zitat Zitat von Mangokind Beitrag anzeigen
    aber bei mehreren sollte man gefundene bits eigentlich per XOW wegmaskieren können und das ganze einfach nochmal machen können
    Warum so umständlich?
    Du kannst Dir doch den Exponenten merken und dann mit
    Code:
    SRW 1 / SLW 1
    SPZ M001
    T #Exponent
    arbeiten.

    Grüße
    Gebs

  7. Folgender Benutzer sagt Danke zu Gebs für den nützlichen Beitrag:

    Mangokind (06.03.2009)

  8. #35
    Registriert seit
    11.12.2008
    Beiträge
    73
    Danke
    39
    Erhielt 9 Danke für 8 Beiträge

    Standard

    mal ein beispiel:

    ich habe ein WORD, indem bit 4 und bit 8 gesetzt sind... (beim ersten word also bspw Zustand 5 und 9 der maschine)

    also 2^4+2^8=272 als integerwert

    wenn man sich den dualen logarithmus davon ausrechnet kommt wie zu erwarten immer der größeren der beiden exponenten raus... also 8,087...
    wenn man den teil nach dem komma auswertet, weiß man, ob es mehrere gesetzte bits gibt, der teil vor dem komma gibt (innerhalb des wortes) das höchstwertigste gesetzte bit an.


    müsste ich dann nicht, um das nächste gesetzte bit zu finden, eine 1 in den akku laden, diese in einer schleife so oft, wie der gefundene größte exponent war, nach links verschieben (SLW akzeptiert keine variable), dann das ursprungs-WORD XOR mit akku 1 verknüpfen bzw subtrahieren und dann das ganze nochmal machen, solange der Nachkommateil des exponenten nicht 0 ist, es also noch weitere gesetzte bits gibt?

    alternativ könnte man den gefundenen größten exponenten natürlich auch auf nen pointer addieren, der auf einen vergleichsinteger zeigt und das bit dann 0 setzen... kann ich gerade nicht abschätzen, was günstiger ist.

    ---------------------------------

    habe mir mal das Real-format angeschaut...

    wenn 1 bit gesetzt ist, habe ich also immer eine mantisse von 1

    ich müsste demnach nicht den exponenten, sondern die mantisse überprüfen, ob sie glatt 1 ist

    aber das problem bleibt doch: wie berechne ich weitere bits, wenn die mantisse ungleich 1 ist?

    das höchste gesetzte bit ist immernoch das was im exponenten steht, aber den rest muss ich ja trotzdem gesondert behandeln


    mal zurück zum beispiel von vorhin: 2^4+2^8=272

    wenn ich jetzt 272 in eine real-zahl wandle, bekomme ich vermutlich 1,0625*2^8 als real-zahl, wenn ich den datentyp richtig verstanden habe

    ich müsste doch also 2^8 von den 272 abziehen und dann das ganze nochmal machen, oder? und zwar solange, bis meine mantisse mal 1,0 wäre bzw ich alle gesetzten bits in dem wort gefunden habe

    so langsam bekomme ich auch zweifel, ob der ursprüngliche ansatz so schlecht war... denn ich bekomme hier ja wieder die verschachtelte schleife aus post #2, nur dass die innere schleife hier mit den exponenten rumrechnet, statt bitweise zu prüfen

    bitte korrigier mich, wenn ich mich irre...

    LG


    P.S.:

    wie sieht eigentlich 0.0 als REAL-Zahl aus?

    da man die Vorkommastelle nicht beeinflussen kann, wäre das ja 1,X*2^Y

    1,X kann nicht 0 werden, 2^Y kann auch nicht 0 werden... mhhhh


    ------------------------------------------

    habs mal schnell zusammengetippert:

    über Exponenten auswerten:

    (nur der rot markierte teil hat sich geändert)

    Code:
          TAR1  #AR1Merker
          TAR2  #AR2Merker
    //IN nach TEMP
          L     #QuellDB                    //IN-Var... DB-Nummer Quelle
          T     #QDB                        //TEMP-Var... DB-Nummer Quelle
          L     #ZielDB                     //IN-Var... DB-Nummer Ziel
          T     #ZDB                        //TEMP-Var... DB-Nummer Ziel
    // --- initialisieren ---
    //Zaehler/Merker initialisieren
          L     0
          T     #GefundeneZst
    //Offset der aeusseren Schleife 0 setzen
          L     0
          T     #OffsetAussen
    //Zst-Ints im Ziel-DB 0 setzen
          AUF   DB [#ZDB]
          L     #ZielAnfang                 //IN-Var... Byteposition des ersten Zst-Ints im Ziel-DB
          SLD   3
          LAR1  
          L     #AnzahlInteger
    nw1a: T     #SchleifeInnen
          L     0
          T     W [AR1,P#0.0]
          +AR1  P#2.0
          L     #SchleifeInnen
          LOOP  nw1a
     
    // --- Pruefschleifen ---
    //*** Pruefschleife aussen: testet je 16 bits, ob überhaupt eins davon gesetzt ist ***
          L     #HoechsterZustand           //Anzahl Bits
          SRW   4
          +     1                           //Anzahl Woerter
    nw1b: T     #SchleifeAussen
          AUF   DB [#QDB]
          L     #OffsetAussen               //Anzahl gepruefter Bytes
          L     #QuellAnfang
          +I    
          SLD   3
          T     #QPointer                   //Pointer auf aktuell zu testenden Quellbereich
          LAR1  
          L     W [AR1,P#0.0]
          L     0
          ==I   
          SPB   nw1e                        //wenn kein bit true ist, muss man auch nicht schauen, welches true ist
    //***Innere Schleife***
    //hoechstes gesetztes Bit ermitteln
       L     W [AR1,P#0.0]               //das gerade zu pruefende WORD
    nw1c: T     #WORDMerker                 //gemerkt (noetig bei mehreren Durchlaeufen)
       DTR                               //als REAL
       T     #REALMerker                 //merken
       SLD                               //Vorzeichen weg
       SRD   24                          //bleibt nur noch der Exponent bzw das hoechste gesetzte bit
       T     #Exponent
    //noch weitere Bits gesetzt?
       L     #REALMerker                 //REAL wieder Laden
       SLD   9                           //Vorzeichen und Exponent weg... 
       SRD   9                           //bleiben noch 23 Bit Nachkommastelle der Mantisse
       L     0
       ==D                               //wenn Nachkommastellen ==0 wurde das letzte gesetzte Bit gefunden
       =     #MerkerLetzteStelle
    //Zielposition im Ziel-DB laden
       AUF   DB [#ZDB]
       L     #GefundeneZst               //Anzahl gefundener Zustaende
       SLD                               //*2 um 2 Bytes bzw 1 Int weiterzuspringen
       L     #ZielAnfang                 //IN-Var... Byteposition des ersten Zst-Ints im Ziel-DB
       +D                                //im akku 1 steht die Byte-Nummer des Ints, in das der Zustand gespeichert wird
       SLD   3
       LAR1  
    //gefundenen Zustand abspeichern
       L     #OffsetAussen               //Anzahl durchsuchter Bytes
       SLW   3                           //Anzahl durchsuchter Bits
       L     #Exponent                   //Position innerhalb des aktuell durchsuchten Wortes
       +I    
       +     1                           //Nummer des dem Bit zugewiesenen Zustands
       T     W [AR1,P#0.0]
    //Zaehler erhoehen
       L     #GefundeneZst
       +     1
       T     #GefundeneZst
    //Abbruchbedingung: speicherplatz fuer Zustandsnummern ist voll
       L     #GefundeneZst
       L     #AnzahlInteger              //IN-Var... Vorgabe der maximal gleichzeitig gesetzten Zst bzw die Anzahl Speicherplaetze
       ==I   
       BEB   
    // ggf. das gefundene Bit vom zu pruefenden WORD abziehen und die ganze Show nochmal
       SET   
       U     #MerkerLetzteStelle
       SPB   nw1e                        //Innere Schleife verlassen
    //wenns noch ein weiteres gesetztes bit gibt:
       SET                               //VKE auf 1
       L     P##WORDMerker
       L     #Exponent
       +D    
       LAR1  
       R      [AR1,P#0.0]                //Das gefundene Bit wird zurueckgesetzt
       L     #WORDMerker
       SPA   nw1c                        //und nochn Durchlauf der inneren Schleife
    //Ende innere Schleife
     
    //Ende aeussere Schleife
    nw1e: L     #OffsetAussen
          +     2
          T     #OffsetAussen               //Anzahl durchsuchter Bytes um 2 erhoehen
          L     #SchleifeAussen
          LOOP  nw1b
          LAR1  #AR1Merker
          LAR2  #AR2Merker
    Geändert von Mangokind (06.03.2009 um 08:36 Uhr)

  9. #36
    Registriert seit
    11.12.2008
    Beiträge
    73
    Danke
    39
    Erhielt 9 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zum vergleich aus Post #2: Loopschleife Bitweise auswerten:

    Code:
          TAR1  #AR1Merker
          TAR2  #AR2Merker
     
    //IN nach TEMP
          L     #QuellDB                    //IN-Var... DB-Nummer Quelle
          T     #QDB                        //TEMP-Var... DB-Nummer Quelle
          L     #ZielDB                     //IN-Var... DB-Nummer Ziel
          T     #ZDB                        //TEMP-Var... DB-Nummer Ziel
    // --- initialisieren ---
    //Zaehler/Merker initialisieren
          L     0
          T     #GefundeneZst
    //Offset der aeusseren Schleife 0 setzen
          L     0
          T     #OffsetAussen
    //Zst-Ints im Ziel-DB 0 setzen
          AUF   DB [#ZDB]
          L     #ZielAnfang                 //IN-Var... Byteposition des ersten Zst-Ints im Ziel-DB
          SLD   3
          LAR1  
          L     #AnzahlInteger
    nw1a: T     #SchleifeInnen
          L     0
          T     W [AR1,P#0.0]
          +AR1  P#2.0
          L     #SchleifeInnen
          LOOP  nw1a
     
    // --- Pruefschleifen ---
    //*** Pruefschleife aussen: testet je 16 bits, ob überhaupt eins davon gesetzt ist ***
          L     #HoechsterZustand           //Anzahl Bits
          SRW   4
          +     1                           //Anzahl Woerter
    nw1b: T     #SchleifeAussen
          AUF   DB [#QDB]
          L     #OffsetAussen               //Anzahl gepruefter Bytes
          L     #QuellAnfang
          +I    
          SLD   3
          T     #QPointer                   //Pointer auf aktuell zu testenden Quellbereich
          LAR1  
          L     W [AR1,P#0.0]
          L     0
          ==I   
          SPB   nw1e                        //wenn kein bit true ist, muss man auch nicht schauen, welches true ist
    //***Innere Schleife***
    L     16
    nw1c: T     #SchleifeInnen
    AUF   DB [#QDB]
    L     #QPointer
    L     #SchleifeInnen
    +D    
    +     -1                          //weil Bits von 0..15, aber SchleifeInnen von 1..16
    LAR1  
    SET   
    U      [AR1,P#0.0]
    SPBN  nw1d
    //wenn das Bit, auf das Bitpointer gerade zeigt, gesetzt ist
    //Zielposition im Ziel-DB laden
    AUF   DB [#ZDB]
    L     #GefundeneZst               //Anzahl gefundener Zustaende
    SLD                               //*2 um 2 Bytes bzw 1 Int weiterzuspringen
    L     #ZielAnfang                 //IN-Var... Byteposition des ersten Zst-Ints im Ziel-DB
    +D                                //im akku 1 steht die Byte-Nummer des Ints, in das der Zustand gespeichert wird
    SLD   3
    LAR1  
    //gefundenen Zustand abspeichern
    L     #OffsetAussen               //Anzahl durchsuchter Bytes
    SLW   3                           //Anzahl durchsuchter Bits
    L     #SchleifeInnen              //Position innerhalb des aktuell durchsuchten Wortes
    +I                                //Nummer des dem Bit zugewiesenen Zustands
    T     W [AR1,P#0.0]
    //Zaehler erhoehen
    L     #GefundeneZst
    +     1
    T     #GefundeneZst
    //Abbruchbedingung: speicherplatz fuer Zustandsnummern ist voll
    L     #GefundeneZst
    L     #AnzahlInteger              //IN-Var... Vorgabe der maximal gleichzeitig gesetzten Zst bzw die Anzahl Speicherplaetze
    ==I   
    BEB   
    //Ende innere Schleife
    nw1d: L     #SchleifeInnen
    LOOP  nw1c
    //Ende aeussere Schleife
    nw1e: L     #OffsetAussen
          +     2
          T     #OffsetAussen               //Anzahl durchsuchter Bytes um 2 erhoehen
          L     #SchleifeAussen
          LOOP  nw1b
          LAR1  #AR1Merker
          LAR2  #AR2Merker
    bin ja mal gespannt, was die SPS Zykluszeit dann dazu sagt...


    ------------------------------------------------------------------------------------------


    gleich noch eine frage:

    wie bildet man am schlausten eine eindeutige Prüfsumme über erstmal unbegrenzt viele wörter, wenn nur Wertänderung interessiert?




    -------------------------------------------------------------------------------------------

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @Kai:
    Stimmt - ** liefert als Ergebnis ein REAL zurück.

    @Mangokind:
    Die dargestellte Funktion entspricht im Grunde dem AWL-Befehl SLW (oder besser vielleicht SLD). Meinst du nicht, dass sich deine Aufgabenstellung durch einfaches Linksschieben eines Startwertes auch schon machen läßt ? Also etwa so :
    Code:
    L 1
    L #Arbeitsstation
    SLD
    T #Statusmeldung
    Gruß
    LL
    war meine allererste idee, ist aber noch langsamer als bitweise prüfen, weil WORD-vergleiche deutlich langsamer sind als bit-vergleiche und sich abgesehen davon nicht viel ändert
    Geändert von Mangokind (06.03.2009 um 09:06 Uhr)

Ähnliche Themen

  1. String in Integer
    Von Thorilla im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.01.2011, 13:02
  2. integer 32Bit in integer 16 Bit wandeln
    Von slk230-power im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 09.11.2009, 22:35
  3. Integer in Hex
    Von snowkopp im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 22.09.2009, 20:42
  4. Integer, Hex
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.01.2006, 22:08
  5. Umwandlung Integer(32bit) in Integer(16bit)
    Von Kojote im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.08.2005, 10:56

Lesezeichen

Berechtigungen

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