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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

Thema: Zustandsbits in Zustands-Integer

  1. #21
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Da das Ergebnis einer Potenz vom Datentyp REAL ist, muss der Programmcode noch etwas geändert werden:

    Code:
    FUNCTION FC202 : INT
    VAR_INPUT
    m_word : INT; // zu prüfendes Wort
    END_VAR
    VAR_TEMP
    i_temp : INT; // temporäre Variable
    END_VAR
    IF m_word = 0 THEN
    i_temp := 0; 
    ELSIF m_word = -32768 THEN
    // Anweisungsteil_ELSIF
    i_temp := 16;
    ELSE
    i_temp := REAL_TO_INT (2**(m_word - 1)) ;
    END_IF;
    FC202 := i_temp;
    END_FUNCTION
    Gruß Kai

  2. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  3. #22
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Opps ...

    Danke Kai, da habe ich mich jetzt direkt vertan. Natürlich meinte ich die **-Geschichte für die Potenz-Bildung ...

    Übrigens, du brauchst m.E. keine Typ-Konvertierung machen ...

  4. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  5. #23
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Ohne Typkonvertierung bekomme ich die Fehlermeldung: Ungültiger Datentyp.

    Gruß Kai

  6. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  7. #24
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    @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

  8. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  9. #25
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @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
    mein lieber larry, du sollst nicht am sinn und unsinn eines ansatzes zweifeln!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  10. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  11. #26
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    mein lieber larry, du sollst nicht am sinn und unsinn eines ansatzes zweifeln!
    Das verstehe ich nun nicht ... erklär mal ...

  12. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  13. #27
    Registriert seit
    30.06.2007
    Ort
    Minden (Westf.)
    Beiträge
    178
    Danke
    42
    Erhielt 21 Danke für 21 Beiträge

    Standard

    ist evtl. das:

    Code:
    // Erzeuge Datenkopie
          CALL  "BLKMOV"
           SRCBLK :=P#DB50.DBX0.0 BYTE 16
           RET_VAL:=#RET_VAL_SFC20
           DSTBLK :=P#DB50.DBX148.0 BYTE 16
     
    // 1. gesetztes Bit ermitteln
          L     1
          T     #Schleife
    m01:  NOP   0
          L     DB50.DBD  160
          RRDA  
          T     DB50.DBD  160
          L     DB50.DBD  156
          RRDA  
          T     DB50.DBD  156
          L     DB50.DBD  152
          RRDA  
          T     DB50.DBD  152
          L     DB50.DBD  148
          RRDA  
          T     DB50.DBD  148
          SPP   Fehl                        // Bei gesetztem A1
          L     #Schleife
          INC   1
          T     #Schleife
          L     #Schleife
          L     129
          <>I   
          SPB   m01
          L     0
          T     #Schleife
    Fehl: NOP   0
          L     #Schleife
          T     DB59.DBB    6
    Hier werden z.Bsp. 16 Byte durchwühlt. Allerdings ist es fraglich ob ein Schleifenkonstrukt wirklich schneller ist als ein Logarithmus..!?
    Dieses Stück Programm kann man sicherlich noch schneller machen, indem man den Datenbereich in den lokalen Bereich umkopiert. Hab's halt aus nem rel. alten Proj. rauskopiert .
    Zitieren Zitieren Eine andere Idee...  

  14. Folgender Benutzer sagt Danke zu StefanK für den nützlichen Beitrag:

    Mangokind (05.03.2009)

  15. #28
    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 StefanK Beitrag anzeigen
    ist evtl. das:

    Code:
    // Erzeuge Datenkopie
          CALL  "BLKMOV"
           SRCBLK :=P#DB50.DBX0.0 BYTE 16
           RET_VAL:=#RET_VAL_SFC20
           DSTBLK :=P#DB50.DBX148.0 BYTE 16
     
    // 1. gesetztes Bit ermitteln
          L     1
          T     #Schleife
    m01:  NOP   0
          L     DB50.DBD  160
          RRDA  
          T     DB50.DBD  160
          L     DB50.DBD  156
          RRDA  
          T     DB50.DBD  156
          L     DB50.DBD  152
          RRDA  
          T     DB50.DBD  152
          L     DB50.DBD  148
          RRDA  
          T     DB50.DBD  148
          SPP   Fehl                        // Bei gesetztem A1
          L     #Schleife
          INC   1
          T     #Schleife
          L     #Schleife
          L     129
          <>I   
          SPB   m01
          L     0
          T     #Schleife
    Fehl: NOP   0
          L     #Schleife
          T     DB59.DBB    6
    Hier werden z.Bsp. 16 Byte durchwühlt. Allerdings ist es fraglich ob ein Schleifenkonstrukt wirklich schneller ist als ein Logarithmus..!?
    Dieses Stück Programm kann man sicherlich noch schneller machen, indem man den Datenbereich in den lokalen Bereich umkopiert. Hab's halt aus nem rel. alten Proj. rauskopiert .
    @StefanK

    Ok, über indirekte Adressierung ist der Aufwand aber auch nicht größer.

    PS: Muß man den den Logarithmus-Ansatz nicht auch in einer Schleife machen, wenn man alle Einsen eines Wortes als Zahl irgendwohin schreiben will? Ich kann grad noch nicht sehen, daß der Aufwand da wirklich geringer wäre, als einfach durchzuzählen.

    PS2: Das gilt auch für den obigen FC202, bei einem gesetzten Bit sehe ich ja den nutzen durchaus. Oder habe ich die Aufgabenstellung nicht mehr richtig in Erinnerung?
    Geändert von Ralle (05.03.2009 um 17:58 Uhr)
    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

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

    Mangokind (05.03.2009)

  17. #29
    Registriert seit
    30.06.2007
    Ort
    Minden (Westf.)
    Beiträge
    178
    Danke
    42
    Erhielt 21 Danke für 21 Beiträge

    Standard

    @Ralle
    ja, hast recht, hier geht's ja um mehr als nur ein gesetztes Bit, da passen meine Vorschläge in der Form (leider) nicht .

  18. Folgender Benutzer sagt Danke zu StefanK für den nützlichen Beitrag:

    Mangokind (05.03.2009)

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Mangokind Beitrag anzeigen
    rein mathematisch müsste ich mir nur den exponenten zur basis 2 ausgeben lassen, aber ein kurzer blick ins S7 PDF mit der ausführungszeit für logarithmen hat mich ganz schnell wieder von dieser idee abgebracht

    würde den code zwar zu nem 10-zeiler vereinfachen, aber die laufzeit...
    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

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

    Mangokind (05.03.2009)

Ä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
  •