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

superkato

Level-1
Beiträge
220
Reaktionspunkte
0
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
?
 
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#8), 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
 
Zuletzt bearbeitet:
Zurück
Oben