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

Ergebnis 1 bis 10 von 10

Thema: Befehl für Vergleich mit UND-Wort in ST? (AWL-> Twincat ST)

  1. #1
    Registriert seit
    21.04.2009
    Ort
    München
    Beiträge
    220
    Danke
    56
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich versuche gerade eine AWL (Step7) zu ST (Beckhoff) zu übersetzen:

    Code:
       U(    ; 
          L     #MODULE_DATA_IN.BYTE_14; 
          UW    W#16#2; 
          L     W#16#2; 
          ==I   ; 
          )     ; 
          UN    #VAR_ERROR_PROFIBUS; 
          =     #VAR_IN_MOTION;
    oder auch
    Code:
     U(    ; 
          U(    ; 
          L     #MODULE_DATA_IN.BYTE_0; 
          L     2; 
          ==I   ; 
          )     ; 
          U(    ; 
          L     #MODULE_DATA_IN.BYTE_1; 
          L     W#16#89; 
          ==I   ; 
          )     ; 
          O     ; 
          U(    ; 
          L     #MODULE_DATA_IN.BYTE_14; 
          UW    W#16#8; 
          L     W#16#8; 
          ==I   ; 
          )     ; 
          O     ; 
          UN    #M_REFERENCED; 
          U(    ; 
          U(    ; 
          L     #I_POS_MODE; 
          L     0; 
          ==I   ; 
          )     ; 
          O     ; 
          U(    ; 
          L     #I_POS_MODE; 
          L     3; 
          ==I   ; 
          )     ; 
          )     ; 
          O     ; 
          U(    ; 
          L     #M_ERROR; 
          L     W#16#FFFF; 
          ==I   ; 
          )     ; 
          )     ; 
          UN    #VAR_ERROR_PROFIBUS; 
          =     #VAR_WARNING_ACTIVE;
    Der Befehl UW W#16#2 oder UW W#16#8 macht mir Probleme. Welche Funktion gibt es den analog in ST um dieses Bitmuster mit einem wert UND zu Verknüpfen?

    Viele Grüße
    SK
    TIA V13 + SP1 Update5 Windows8.1
    Zitieren Zitieren Befehl für Vergleich mit UND-Wort in ST? (AWL-> Twincat ST)  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von superkato Beitrag anzeigen
    Welche Funktion gibt es den analog in ST um dieses Bitmuster mit einem wert UND zu Verknüpfen?
    Ich vermute mal, dass es wie in S7-SCL einfach "AND" ist.

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Schreibe nur 16#8 - die Größe der Hexadezimal-Konstante richtet sich dann implizit nach dem zweiten Operanden.
    BYTE_TO_WORD(16#8) sollte auch funktionieren, wenn Du explizit WORD vorschreiben willst.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Ein logisches UND ist Bestandteil der Sprache:

    #MODULE_DATA_IN.BYTE_14 AND W#16#8

  5. #5
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.480
    Danke
    1.141
    Erhielt 1.242 Danke für 973 Beiträge

    Standard

    Eigentlich geht es noch einfacher.
    Du willst ja nur ein bestimmtes Bit von z.B. #MODULE_DATA_IN.BYTE_14 abfragen.
    Bei Codesys (bei Beckhoff wahrscheinlich auch) geht das auch mit:
    Code:
    xInMotion := MODULE_DATA_IN.BYTE_14.1 AND MODULE_DATA_IN.BYTE_14.2
    Damit ersparst du dir das Maskieren.

    Gruß
    Dieter

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von superkato Beitrag anzeigen
    Code:
       U(    ; 
          L     #MODULE_DATA_IN.BYTE_14; 
          UW    W#16#2; 
          L     W#16#2; 
          ==I   ; 
          )     ; 
          UN    #VAR_ERROR_PROFIBUS; 
          =     #VAR_IN_MOTION;
    1:1-Umsetzung ohne optimieren (ungetestet):
    Code:
      VAR_IN_MOTION := ((BYTE_TO_WORD(MODULE_DATA_IN.BYTE_14) AND WORD#16#2) = WORD#16#2) AND NOT VAR_ERROR_PROFIBUS ;
    
    oder auch
    
      VAR_IN_MOTION := ((MODULE_DATA_IN.BYTE_14 AND 2) = 2) AND NOT VAR_ERROR_PROFIBUS ;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    Avatar von superkato
    superkato ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.04.2009
    Ort
    München
    Beiträge
    220
    Danke
    56
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja ich hab das so geschrieben:
    MODULE_DATA_IN.BYTE_14 ist gDataIn[14] ..gDataIn ist ein Array von 16 Elementen mit je 1Byte USINT in Twincat).

    Code:
    (*in motion (Byte 14)*)
    VAR_IN_MOTION:=gDataIn[14] = 2 AND
    NOT VAR_ERROR_PROFIBUS;
    Frage war für mich auch ob ich das UW vernachlässigen kann.

    -------------
    Noch eine Frage am Rande, wie kann ich den Befehl TAD aus der S7-Welt umsetzen? Tausche Reihenfolge der Bytes im AKKU 1 (32 Bit) Also das Byte A B C D zu D C B A

    Code:
    // set value
          L     #I_POS_VELOCITY (REAL ins S7, 32Bit)
          TAD   
          T     #MODULE_DATA_OUT.DWORD_2 (DWORD)
    vielleicht mit FUNCTION HOST_TO_BE32?
    ABER wenn die S7 Big Endian ist und die TwinCat Little Endian... dann brauch ich das ja garnicht also die Byte Reihenfolge tauschen.
    Geändert von superkato (15.12.2013 um 18:16 Uhr)
    TIA V13 + SP1 Update5 Windows8.1

  8. #8
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.480
    Danke
    1.141
    Erhielt 1.242 Danke für 973 Beiträge

    Standard

    Zitat Zitat von superkato Beitrag anzeigen
    Frage war für mich auch ob ich das UW vernachlässigen kann.
    NEIN
    Mit UW w#16#2 blendest du alle anderen Bits ausser Bit 1 aus.
    Deine Abfrage ist eigenlich nichts anderes als ein:
    Code:
    U DBX10.1
    Wenn sich zum Bit-Codiertes Zustandswort handelt, dann kannst du z.B. mit einem Array of Bool arbeiten oder du nimmst die Adressierung in der Art von:
    Code:
    xInMotion := Status[12].1
    Gruß
    Dieter

  9. #9
    Avatar von superkato
    superkato ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.04.2009
    Ort
    München
    Beiträge
    220
    Danke
    56
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    NEIN
    Mit UW w#16#2 blendest du alle anderen Bits ausser Bit 1 aus.
    Deine Abfrage ist eigenlich nichts anderes als ein:
    Code:
    U DBX10.1
    Wenn sich zum Bit-Codiertes Zustandswort handelt, dann kannst du z.B. mit einem Array of Bool arbeiten oder du nimmst die Adressierung in der Art von:
    Code:
    xInMotion := Status[12].1
    Gruß
    Dieter
    Code:
     L     #MODULE_DATA_IN.BYTE_14; 
          UW    W#16#8; 
          L     W#16#8; 
          ==I   ;
    Code:
     L     #MODULE_DATA_IN.BYTE_14; 
          L     W#16#8; 
          ==I   ;
    würde also bedeuten das obere
    ist 0000 1000 0000 1000

    das untere 0000 0000 0000 1000
    ?
    TIA V13 + SP1 Update5 Windows8.1

  10. #10
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hä?

    Das Obere: nach dem ==I hast du immer den Zustand des Bit 3 im Byte, vollkommen egal welchen Zustand die anderen Bits haben.
    Byte 14 hat z.B. 10011001 (16#99), nach dem UW bleibt dann also 00001000 im Akku (16#, folglich ist der Vergleich 16#8 dann auch "positiv" sprich das VKE ist High.

    Beim unteren:
    Byte 14 hat wieder 10011001, nach dem ==I ist das VKE dann null, weil noch mehrere Bits außer dems Bit 3 High sind, der Wert des Byte ist mit 16#99 also <> 16#8

    Du siehst also, das mit dem UW oder ohne ein fundamentaler funktioneller Unterschied herrscht.

    Allerdings unter TwinCat brauchst du für den obigen Fall dieses Geeiere nicht, weil du da Bits auch direkt ansprechen kannst, also Module_Data_In.Byte_14.3

    Mfg
    Manuel
    Geändert von MSB (15.12.2013 um 22:12 Uhr)
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

Ähnliche Themen

  1. Antworten: 27
    Letzter Beitrag: 26.11.2012, 10:41
  2. Pointer Vergleich AWL -> SCL??
    Von Carsten77 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 16.08.2011, 14:21
  3. Der S5-AWL Befehl ":AWL"
    Von chrisPCS im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.11.2010, 10:33
  4. Vergleich AWl <--> SCL
    Von nobug im Forum Programmierstrategien
    Antworten: 6
    Letzter Beitrag: 11.03.2008, 20:11
  5. AWL: Fehler bei Vergleich -> Sprung
    Von bertiger im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 01.12.2005, 11:40

Lesezeichen

Berechtigungen

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