TIA SWAP in TIA nicht verfügbar

sschultewolter

Level-1
Beiträge
54
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

nach langer Zeit (~ 10Jahre) liegt bei mir im Arbeitszimmer wieder eine Siemens S7-314C-2 PN/DP. Diese brauche ich hier lediglich zum testen eines Modbus TCP / Profibus DP Gateways von Wachendorff/AdfWeb. Direkte Anbindung über Modbus TCP ist nicht vorgesehen vom Kunden!

Über das Modbus TCP Gateway lese ich eine B&R Steuerung aus. Die Werte sollen über das Gateway an die S7 zur Verfügung gestellt werden (nur lesend).
Das Gateway habe ich soweit mit der B&R verheiratet. Jedoch stört mich gerade bei der 314 der Endian. Alle Bits sind verdreht. Die SWAP Funktion aus der Hilfe steht mir in SCL leider nicht zur Verfügung im TIA Portal (weil keine S7-1200/1500?)

Gibt es alternativ Bibliotheken die genutzt werden können?
 
Hallo,
man könnte sich zum Beispiel den AWL-Befehl "TAK" zu Nutze machen um einen "Swap" Baustein nachzubauen.

Viele Grüße,
Robert
 
Es gibt auch noch die Funktion Read_little oder Read_big zumindest heissen die so ähnlich. Damit kannst du aus deinem Bytearray die entsprechenden Werte mit dem gewünschten Endian auslesen.
 
Bei den 1500er musst du zwangsläufig auch auf den AWL Classic Befehl TAW/TAD zurückgreifen wenn du ein Integer swappen willst.
Weill die Swap nur für WORD ist.
Mindestens seit TIA V15.1 gibt es SWAP für S7-1200/1500 für WORD, DWORD, LWORD
Wenn man Integer swappen will, dann braucht man dem SCL-Compiler nur zeigen, daß man weiß was man da tut:
#iResult := WORD_TO_INT(SWAP(INT_TO_WORD(#MyInt)));

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man Integer swappen will, dann braucht man dem SCL-Compiler nur zeigen, daß man weiß was man da tut:
#iResult := WORD_TO_INT(SWAP(INT_TO_WORD(#MyInt)));
Ja, den Compiler warnt dass das Vorzeichen verloren gehen kann. Wenn du nicht convertierst.
Schade dass das schlanke Befehl SWAP so aufgepumpt werden muss wenn du damit INT swappest
 
Schade dass das schlanke Befehl SWAP so aufgepumpt werden muss wenn du damit INT swappest
Das Aufpumpen geht noch schlimmer, wenn man's mag:

Wem die Operatoren/Funktionen ROL, ROR, AND und OR nicht geheuer sind und wer das Motto "warum einfach, wenn's auch umständlich geht" nicht scheut, kann's auch mal mit dem rein arithmetischen KuddelMuddel ...
xSwap := UDINT_TO_INT(((INT_TO_UDINT(x) * 65537) / 256) MOD 65536) ;
... versuchen. ;) Oder sind die arithmetischen Operatoren bei Anwendung auf den DatenTyp UDINT bereits überfordert?
 
SWAP Bytes in DWord: https://github.com/simsum/oscat/blob/master/SWAP_BYTE2.EXP
Swap_Byte2 := (ROR(in,8) AND 16#FF00FF00) OR (ROL(in,8) AND 16#00FF00FF);
Hinweis: um sicher zu gehen daß sich der Wert von "in" zwischen den beiden Zugriffen nicht ändert, muß das DWORD "in" by-Value (als Kopie) an den Code übergeben werden, oder falls Zugriff by-Reference (auf die Adresse des DWORD), dann muß es in der selben Task beschrieben werden.

Soll der Code sicher richtig funktionieren, ohne diese Randbedingungen beachten zu müssen, dann besser:
Code:
tdw := in;  //in-Parameter auf lokale Variable umspeichern
Swap_Byte2 := (ROR(tdw,8) AND 16#FF00FF00) OR (ROL(tdw,8) AND 16#00FF00FF);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ausgerechnet der TAK ist aber ein denkbar schlechtes Beispiel, denn er tauscht die Inhalte von Akku1 und Akku2, ohne die Positionen der Bytes zu verändern.
Anhang anzeigen 63073
Ihr habt natürlich Recht, in SCL geht das deutlich schöner und intuitiver; Es war wohl noch etwas früh. Zur Ehrenrettung wollte ich trotzdem noch eine sperrige schlechte Lösung mit dem TAK erstellen:

Code:
FUNCTION "SWAP" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT
      IN : Word;
   END_VAR

   VAR_OUTPUT
      OUT : Word;
   END_VAR

BEGIN
NETWORK
TITLE =

      L #IN;
      L #IN;

      SLW 8;
      TAK;
      SRW 8;

      OW;

      T #OUT;

END_FUNCTION
 
Bin nicht so toll mit AWL, aber ist das TAK nicht eigentlich überflüssig:
Code:
      L #IN;
      SRW 8;

      L #IN;
      SLW 8;

      OW;

      T #OUT;
und ist das nicht das, was Harald direkt in SCL aufgezeigt hat (und gelten sicher auch die gleichen Hinweise bezüglich #IN)?
 
Bin nicht so toll mit AWL, aber ist das TAK nicht eigentlich überflüssig:
Code:
      L #IN;
      SRW 8;

      L #IN;
      SLW 8;

      OW;

      T #OUT;
und ist das nicht das, was Harald in SCL aufgezeigt hat (und gelten sicher auch die gleichen Hinweise bezüglich #IN)?
Völlig korrekt. Es wird heute wohl nicht besser.
 
Zurück
Oben