TIA temp für Byte-SWAP zeigt unerwartetes Verhalten

MFreiberger

Level-3
Beiträge
2.869
Reaktionspunkte
760
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Zusammen,

ich möchte gerne das Statuswort eines SEW-Antriebs bearbeiten (Bytes tauschen, da die MoviPLC die Daten für Intel/Rockwell interpretiert und ich das ohne Programmierung nicht umstellen kann).
Das Statuswort (STAW) besteht ja aus einem Byte "Code" und einem bitaufgelösten Anteil. Jetzt wollte ich einfach die Bytes mit dem Slice-Zugriff tauschen.
Leider funktioniert das nicht wie gewünscht. Die Zwischenzeilen (Byte=>Byte und Bool=>Bool) habe ich nachträglich zur Analyse eingefügt.
Die Variable Tw_SWAP verwende ich mehrfach, aber das sollte doch kein Problem darstellen? Immerhin beschreibe ich sie ja vorher mit dem STAW.

Word_Byte_Bool_SWAP.JPG

Hat dazu Jemand eine Idee oder eine Anregung, wie ich das eleganter lösen kann?
Weil wir sonst eine CCU verwenden, die die Daten für Motorola/SIEMENS interpretiert, haben wir hier einen fertigen Datentypen hinterlegt und wir arbeiten mit optimierten DBs. Ich möchte die Struktur nur für das eine Projekt nicht aufbrechen. Das muss doch auch so gehen?!


EDIT: Es funktioniert bei mir erstmal so, dass ich im Slice-Zugriff die Datentypen nicht kombinieren kann:
%b0, %x0, %x1, %x2, %x3, %x4, %x5, %x6, %x7 auf
%b1, %x8, %x9, %x10, %x11, %x12, %x13, %x14, %x15
funktioniert nicht.
Allerdings ist es komisch, dass in meiner Zeile "#Tw_SWAP.%B0 := #Tw_SWAP.%B0;" die Daten der Zuweisung aus einem Bereich VOR meinem Code enthält (16#20).
Ich hätte erwartet, dass hier 16#86 drin stehen muss.

VG

MFreiberger
 
Zuletzt bearbeitet:
Ich habe mir jetzt nicht alles angeschaut. Aber evtl. kann man in der HW-Konfig, dort wo du die GSDML/GSD Datei der MoviPLC eingefügt hast einstellen,
ob die Daten im Motorola/Intel-Format präsentiert werden sollen. Dies geht bei vielen Geräten. Dann würdest du dir die Ganze dreherei ersparen ( weniger Code,
später alles verständlicher ).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin DeltaMikeAir,

das würde ich gerne machen. Eine Einstellmöglichkeit habe ich nicht direkt gefunden. Wo könnte man das denn bei anderen Geräten einstellen, die diese Option haben?

VG

MFreiberger
 
Warum überhaupt so kompliziert?
UDT auf die Eingangsdaten in der Variablentabelle, und schon kannst du dir die Dreherei sparen, und bist zu 100% Symbolisch.
Dann wären schlimmstenfalls noch echte Werte (INT/DINT) ... zu drehen.
Wobei man dass meistens einstellen kann, also die Einstellungen des Sklaven nochmal durchforsten.

Ansonsten ist dein Verständnisproblem wohl primär folgendes.
.B0 lädt tatsächlich das LSB in Siemens Notifikation, d.h. bei z.B. EW0 dann folglich das EB1, sowie X0 adressiert dann folglich eigentlich E1.0 .


Mfg
Manuel
 
Moin MSB,

UDT auf die Eingangsdaten in der Variablentabelle, und schon kannst du dir die Dreherei sparen, und bist zu 100% Symbolisch.

Das habe ich nicht ganz verstanden. Die Eingangsdaten lese ich mit DPRD_DAT ein, um Datenkonsistenz zu gewährleisten. Die Daten werden in einem Datentyp (UDT) in einem DB abgelegt. Was erreiche ich mit einer UDT?


Dann wären schlimmstenfalls noch echte Werte (INT/DINT) ... zu drehen.

Ja, "echte Werte" (INT/DINT) habe ich auch.


Wobei man dass meistens einstellen kann, also die Einstellungen des Sklaven nochmal durchforsten.

Das wäre natürlich das Allerbeste, aber ich finde keine derartige Einstellmöglichkeit.


Ansonsten ist dein Verständnisproblem wohl primär folgendes.
.B0 lädt tatsächlich das LSB in Siemens Notifikation, d.h. bei z.B. EW0 dann folglich das EB1, sowie X0 adressiert dann folglich eigentlich E1.0 .

Das ist mir bekannt. Daher ja auch meine Verwunderung. Wenn ich .%b0 adressiere und beschreibe, erwarte ich Daten in .%X8-.%X15.


VG

MFreiberger
 
Moin rostiger Nagel,

da liegt ja der Hase im Pfeffer. Das gibt es so einfach parametrierbar bei einer MoviPLC nicht. Das muss programmiert werden.
Die CCU ist ja nur eine mit fertigen Applikationen versehene MoviPLC. Darin ist diese Umstellmöglichkeit programmiert. In der MoviPLC erstmal nicht.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin DeltaMikeAir,

ich konnte leider keine derartige Einstellmöglichkeit im TIA finden. Daher gehe ich davon aus, dass dies bei der MoviPLC nicht in der GSDML drin steht.
Ansonsten hätte SEW dies ja auch gleich parametrierbar programmieren können. Aber die MoviPLC ist ja von Haus aus erstmal "nackt".


VG

MFreiberger
 
Moin rostiger Nagel,

da liegt ja der Hase im Pfeffer. Das gibt es so einfach parametrierbar bei einer MoviPLC nicht. Das muss programmiert werden.
Die CCU ist ja nur eine mit fertigen Applikationen versehene MoviPLC. Darin ist diese Umstellmöglichkeit programmiert. In der MoviPLC erstmal nicht.

VG

MFreiberger

warum machst du das Byte Swab nicht gleich in der Movi PLC, dann sind doch deine Schnittstellen immer gleich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich nicht ganz verstanden. Die Eingangsdaten lese ich mit DPRD_DAT ein, um Datenkonsistenz zu gewährleisten. Die Daten werden in einem Datentyp (UDT) in einem DB abgelegt. Was erreiche ich mit einer UDT?
Konsistent sind die Daten übers Prozessabbild sowieso.
Du erreichst damit also: Sparen von DPRD/DPWR . Und mappen von irgendwelchen Bits zum anderen.
Sprich deine 30 geposteten Zeilen Code werden dadurch durch einen einzigen (bzw. zwei für Ein/Ausgang) Eintrag in der Variablentabelle ersetzt.

Das ist mir bekannt. Daher ja auch meine Verwunderung. Wenn ich .%b0 adressiere und beschreibe, erwarte ich Daten in .%X8-.%X15.
Scheinbar ja dann nicht, B0 ist ganz klar X0-X7 ...
 
Moin MSB,

Du erreichst damit also: Sparen von DPRD/DPWR . Und mappen von irgendwelchen Bits zum anderen.
Sprich deine 30 geposteten Zeilen Code werden dadurch durch einen einzigen (bzw. zwei für Ein/Ausgang) Eintrag in der Variablentabelle ersetzt.

Jetzt habe ich das verstanden. Vielen Dank!



Das ist mir bekannt. Daher ja auch meine Verwunderung. Wenn ich .%b0 adressiere und beschreibe, erwarte ich Daten in .%X8-.%X15.


Scheinbar ja dann nicht, B0 ist ganz klar X0-X7 ...

Hm... nach meinem Verständnis ist:

bei Word:
[FONT=&quot]w: |0 |
b: |0 .. 1|
x: |15 .. 0| oder bei Byte:
x: |7 .. 0||7 .. 0|
[/FONT]


VG

MFreiberger
 
Moin Zusammen,

jetzt haben wir die (eine?) Lösung:
Im Application Configurator konnten wir die CPU-Basis einstellen.
Hier haben wir die Einstellung Intel/Rockwell gewählt. Damit funktioniert Alles wie gewünscht.
Mit der Einstellung Motorola/SIEMENS sind die Bytes falsch gedreht.

also:
Bei Movi-PLC mit AppConfig: Motorola/SIEMENS wählen
Bei CCU mit AppConfig: Intel/Rockwell wählen

VG

MFreiberger
 
Hm... nach meinem Verständnis ist:

bei Word:
w: |0 |
b: |0 .. 1|
x: |15 .. 0| oder bei Byte:
x: |7 .. 0||7 .. 0|

Wenn du das von den Adressen her betrachtest ist das generell schon korrrekt.
Siemens hat das jedoch beim SWAP ausgedreht, sprich X0 ist dann wirklich immer das niederwerdigste Bit.
Und B0 entsprechend das niederwertigste Byte (Also 1 bei W bzw. 3 bzw. 3 bei DW).

Eigentlich gar nicht mal schlecht ...
 
Zurück
Oben