TIA "Struct" verbraucht 8 Bit's

blimaa

Level-3
Beiträge
1.016
Reaktionspunkte
119
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Ich habe ein UDT gemacht, damit ich 64 Byte Synchron per Profinet auslesen kann. (Mit dem Siemens Baustein)
Nun habe ich den UDT mit ein paar Struct unterteilt. In den Struct hat es Bool, Bytes und Words. Nun sieht es aus, sobald eine Struct kommt mit Bool Variablen drin, dass die Sturct 8 Bits hinten anhängt. Sprich auf der Gegenseite herrscht plötzlich ein Offset. Kennt Ihr dieses Verhalten????

S7-1500er SPS, TIA V14,SP1

Gruss blimaa
 
eine struct belegt immer eine gerade anzahl an word. also mindestens 16 bit.
dh. eine neue struct bzw eine andere variable hinter der struct beginnt mit einer geraden Adresse (durch 2 teilbar)
 
Es ist überhaupt so. Jeder Typwechsel in einem Struct bringt den neuen Typ an die Wortgrenze (Byte durch 2 Teilbar).

Also ein Byte genutzt jetzt kommt ein word. Dann startet das word bei byte 2.
Word // byte 0
Word // byte 2
Byte // byte 4
Bool // Bool startet bei Byte 6
byte // Byte 8
byte // byte 9
byte // byte 10
struct // byte 12

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Genau das wars! als ich beim Baustein den Hacken "optimierter Baustein" rausgenommen habe, kam die Adressierung zum Vorschein. Da ging mir relativ schnell ein Licht auf :evil:
Mal noch ein paar Bits und Bytes dazwischen schieben....

Das Thema geht ja voll unter "TIA Ober Ober Frust". Bei Vollsymbolischer Programmierung sieht man das gar nicht!


Besten Dank für die Hilfe.
 
Ich meine, dass das in der symbolischer Programmierung im optimierten Baustein auch zum Tragen kommt. Dann muss man ja genau abzählen, ob jetzt das nächste Byte gerade oder ungerade ist.....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meine, dass das in der symbolischer Programmierung im optimierten Baustein auch zum Tragen kommt. Dann muss man ja genau abzählen, ob jetzt das nächste Byte gerade oder ungerade ist.....
Nein, in optimierten Datenbereichen kann die Ablage auch durcheinander sein, sieht man aber nicht.

Erst wenn man das Ganze auf unoptimierte Bereiche kopiert/überlagert, wird wieder "entoptimiert" und diese von Dir festgestellte Struktur entsteht wieder.


Es sind also die unoptimierten Bereiche dafür verantwortlich. An den Anderen könnte man das auch nicht wirklich feststellen.
 
Zuletzt bearbeitet:
Hi

Ich habe mein UDT an den Baustein "DPWR_DAT" gehängt im symbolischen FB. Dieser hat die Signale an einen Roboter gesendet. Hat dann nun den "DPWR_DAT" Baustein dies verursacht oder erst im Roboter?

Angenommen ich würde dies per "DPWR_DAT" an eine andere SPS senden und die andere SPS empfängt meine 64Bytes auch in einem optimierten Baustein--> kein Fehler/Durcheinander. Empfängt die SPS in einem nicht optimierten Baustein --> Fehler/Durcheinander
??
 
Also ich meine zu glauben, dass Stand heute nur nicht optimierte Bausteine per DPRD/RW funktionieren. Ich mach das zumindest schon immer so und es funktioniert. Ist ja nichts anders wie einen Bereich kopieren. Der Baustein weiß ja nicht was davon welcher Typ ist

Gesendet von meinem SM-G930F mit Tapatalk
 
Hi
Funktioniert nun.
Es ist ein optimierter Baustein. Ich benutze für ein paar Profinetkommunikationen dieses Verfahren in optimierten Bausteinen. Nur hatte ich keine Strukturen drin, sondern alles in einem UDT ohne Struct. Da aber in der Kommunikation mit dem Roboter eine Aufteilung sinn macht habe ich im UDT noch Struct eingefügt.

z.B.
Code:
Station 1: Struct
   Start: bool
   Stopp: bool
Station 2: Struct
   Typ: int
   Anzahl: int
Station 3: Struct
........


Gesendet von meinem BLN-L21 mit Tapatalk
 
Zwischen "nicht optimierten" und "optimierten" Bereichen gibt es auch noch den Unterschied in der Bytereihenfolge bei Mehr-Byte Werten wie Int, DInt, Real. Ich steige da aber mittlerweile auch nicht mehr durch, wann jetzt gerade welche Variante zum Einsatz kommt. Da gibt es nämlich noch mehr Einstellungen die das Verhalten ändern, z.B. Remanenz "im IDB setzen" und sowas.

Mir geht dieser Unfug mit "optimiert" und "nicht optimiert" zumindest ziemlich auf die Nerven, da hat Siemens wieder was Einmaliges kreiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Thema ist schon etwas älter, aber ich hatte gerade ein ähnliches Problem.

Anwendungsfall
Von einem SICK-Scanner sollen 32 Byte eingelesen werden. Die ersten 5 Byte sind Status-Bytes, die restlichen 27 Byte Barcode-Inhalt.
Die 32 Byte können in der Hardware nur als zusammenhängender Block angelegt werden.
Wenn man hier einen Struct anlegt, der folgendermaßen aufgebaut ist und das mit dem DPRD_Dat einlesen will, funktioniert es nicht.
Struct
Byte 0
Byte 1
Byte 2
Byte 3
Byte 4
End_of_Struct
Array[1..27] of Byte

Problem:
Das Array of Byte beginnt wieder bei einem geraden Byte (also Byte 6), d.h. vom Barcode wird das erste Zeichen abgeschnitten.


Die einfachste Lösung ist natürlich ein Gesamt-Array[1..32] zu machen. Aber dann heißt alles gleich, obwohl die ersten 5 Byte eine ganze andere Bedeutung haben. Bei symbolischer Programmierung sehr unschön.

Eine mögliche und halbwegs schöne Lösung ist meines Erachtens die Verwendung des Baustein GETIO_PART statt des DPRD_DAT.
Der Baustein muss dann 2x aufgerufen werden, 1x für die ersten 5 Byte, einmal für die restlichen 27 Byte. Etwas mehr Aufwand, aber zumindest hab ich die Daten dann schön voneinander getrennt.
 
Moin,
du kannst aber auch dein unleserliches Gesamt-Array [1..32] nehmen und in eine Struktur oder UDT umkopieren und andersherum. Hierfür kannst du dir mal die Bausteine Serialize und Deserialize anschauen ;)
Viele Wege führen nach Rom
 
Moin Howard,

Moin,
du kannst aber auch dein unleserliches Gesamt-Array [1..32] nehmen und in eine Struktur oder UDT umkopieren und andersherum. Hierfür kannst du dir mal die Bausteine Serialize und Deserialize anschauen ;)
Viele Wege führen nach Rom

Ich hatte allerdings festgestellt, dass, wenn ich mit Serialize/Deserialize umkopiere, und ich in der Zielstruktur Arrays mit einer ungeraden Anzahl an Char-Elementen habe, einzelne Char verloren gehen.
Also braucht man gerade Arrays bzw. Arrays mit einer Größe, die glatt durch 16bit teilbar ist.

VG

MFreiberger
 
Die einfachste Lösung ist natürlich ein Gesamt-Array[1..32] zu machen. Aber dann heißt alles gleich, obwohl die ersten 5 Byte eine ganze andere Bedeutung haben.
Wenn Du das Gesamt-Array als "Array[-4..27] of Byte" deklarierst, dann hast Du eine gewisse Unterschiedlichkeit der Byte-Namen der ersten 5 Bytes, die auch nicht viel schlechter ist als Byte0, Byte1, ...
Wenn die ersten 5 Bytes ganz andere/frei wählbare Namen haben sollen und der Barcode-Inhalt als Byte[1..27] ansprechbar sein soll, dann könnte man über das Array[-4..27] per AT noch ein Struct mit 5 Bytes legen.

Harald
 
Zurück
Oben