TIA ARRAY of byte in DWORD ändern

s3amdrer

Level-1
Beiträge
210
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich muss ein Array[0..3] of Byte in ein DWord umwandeln. Wie bekommt man das hin?

Move, SHR, SHL, MOVE BLK, alles probiert, aber es klappt nicht. Steh im Moment auf dem Schlauch.

Ich benutze TIA V14 SP1 Update 4 und verwende eine S7/1212 V4.2.1.

Danke vorab.
 
Hi,

also das Dword laden und dann das Byte und dann SLD 8, 16 ... und anschliesend OD sollte eigentlich gehen.
 
In FUP geht es am einfachsten mit einem AT-Konstrukt. Erstelle am besten einen FC mit Standard-Zugriff:
Code:
Input : IN : Array[0..3] of Byte

Output: OUT : DWord

Temp  : tA : Array[0..3] of Byte
        tDW AT"tA" : DWord

      +--------+
      |  MOVE  |
 #IN--|IN   OUT|--#tA
      +--------+

      +--------+
      |  MOVE  |
#tDW--|IN   OUT|--#OUT
      +--------+
Falls die Bytes im DWord vertauscht werden müssen, dann verwende anstatt dem zweiten MOVE die Anweisung SWAP.
Falls Du den FC auch in SCL aufrufen willst, dann verwende besser "Return" für die Rückgabe des DWords.

Harald
 
Da Du eine S7-1200 hast, geht's auch optimiert per Slice:
Code:
         +--------+
         |  MOVE  |
 #IN[0]--|IN   OUT|--#OUT.%B3
         +--------+

         +--------+
         |  MOVE  |
 #IN[1]--|IN   OUT|--#OUT.%B0
         +--------+

...
Dabei kannst Du auch selbst bestimmen, welches Arrayglied an welche Byteposition kommen soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Slice würde ich das DWord aus Konsistenzgründen erst in TEMP zusammenbasteln bevor ich es auf das Ziel-DWord kopiere - nicht daß mitten drin schon eine andere Task (z.B. HMI) auf die halbfertige DWord-Variable zugreift (falls das OUT-DWord mal per Referenz übergeben wird, z.B. als Teil eines zusammengesetzten Datentyps):
Code:
         +--------+
         |  MOVE  |
 #IN[0]--|IN   OUT|--#tempDW.%B3
         +--------+
         +--------+
         |  MOVE  |
 #IN[1]--|IN   OUT|--#tempDW.%B2
         +--------+
         +--------+
         |  MOVE  |
 #IN[2]--|IN   OUT|--#tempDW.%B1
         +--------+
         +--------+
         |  MOVE  |
 #IN[3]--|IN   OUT|--#tempDW.%B0
         +--------+
         +--------+
         |  MOVE  |
#tempDW--|IN   OUT|--#OUT
         +--------+
Mit Slice kann man auch ohne FC-Aufruf direkt mit den Array-Bytes basteln: ersetze die #IN[x] durch die Array-Bytes und den #OUT durch das Ziel-DWord.

Harald
 
Mit Slice kann man auch ohne FC-Aufruf direkt mit den Array-Bytes basteln: ersetze die #IN[x] durch die Array-Bytes und den #OUT durch das Ziel-DWord.
Dabei Deinen eigenen Hinweis beachten:
Mit Slice würde ich das DWord aus Konsistenzgründen erst in TEMP zusammenbasteln bevor ich es auf das Ziel-DWord kopiere - nicht daß mitten drin schon eine andere Task (z.B. HMI) auf die halbfertige DWord-Variable zugreift (falls das OUT-DWord mal per Referenz übergeben wird, z.B. als Teil eines zusammengesetzten Datentyps):
:ROFLMAO:


Und um die Hinweise weiter zu vervollständigen:
Die AT-Variante geht auch in einem optimierten FB, wenn die Remanenz der gesichteten Variable auf "Im IDB setzen" eingestellt wird.
Dort kann die Sicht z.B. auch direkt auf die Eingangsvariable gesetzt werden.
 
Danke für eure Tipps, aber ich habe alles mehrfach gelesen und etwas aufprobiert, aber es klappt nicht.

Ich möchte die Umwandlung direkt in einem optimierten FB machen. Also am liebsten ohne weiteren FC.
Die 4 ARRAY Elemente als IN kann ich verschalten, aber wie deklariere ich die einzelnen Bytes meines DWord?
Im optimierten DB kann man doch nicht auf die einzelnen Bytes zugreifen. Bekomme immer die Meldung "Der Operant xxx ist nicht definiert"
Meine Variable ist im Static angelegt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zur Info, hab zum Testen mal grad den vorgeschlagenen FC erstellt. Das funktioniert, aber ist nicht meine gewünschte Lösung.
Vielleicht habt Ihr ja noch Tipps wie ich das ohne FC im optimierten FB lösen kann. Danke
 
Zur Info, hab zum Testen mal grad den vorgeschlagenen FC erstellt. Das funktioniert, aber ist nicht meine gewünschte Lösung.
Vielleicht habt Ihr ja noch Tipps wie ich das ohne FC im optimierten FB lösen kann. Danke
Slice geht optimiert / nicht optimiert, FC / FB.
AT geht im optimierten FB, wenn die Remanenz der zu sichtenden Variable entsprechend eingestellt wird.

Vielleicht solltest Du mal einen Screenshot von Deinem Versuch (und was nicht Deinen Wünschen entsprechend funktioniert) zeigen, um zu besser helfen zu können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Slice kann man auch ohne FC-Aufruf direkt mit den Array-Bytes basteln: ersetze die #IN[x] durch die Array-Bytes und den #OUT durch das Ziel-DWord.
Wo liegt Dein Array? In der FB-Instanz oder in einem globalen DB?

So funktioniert es mit Slice in einem FB - egal ob optimiert oder Standard:
Code:
Input oder Static: myArray : Array[0..3] of Byte

Static: myDWord : DWord

Temp  : tempDW : DWord

             +--------+
             |  MOVE  |
#myArray[0]--|IN   OUT|--#tempDW.%B3
             +--------+
             +--------+
             |  MOVE  |
#myArray[1]--|IN   OUT|--#tempDW.%B2
             +--------+
             +--------+
             |  MOVE  |
#myArray[2]--|IN   OUT|--#tempDW.%B1
             +--------+
             +--------+
             |  MOVE  |
#myArray[3]--|IN   OUT|--#tempDW.%B0
             +--------+
             +--------+
             |  MOVE  |
    #tempDW--|IN   OUT|--#myDWord
             +--------+
Slice: Wie können Sie in STEP 7 (TIA Portal) bit-, byte- oder wortweise und symbolisch auf die unstrukturierten Datentypen zugreifen?

Harald
 
Zurück
Oben