TIA Variabelgröße SizeOf/Variant

mactoolz

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

da es in der Siemens Entwicklungsumgebung nicht die SizeOf Funktion gibt wie in anderen Entwicklungsumgebungen,
wollte ich wissen ob ich das aus der Hilfe richtig verstanden habe, das man mit dem Datentyp "VARIANT"
mit dem TypeOf den Variant Datentyp ermitteln kann.

Ist das so richtig ?

Gruß
 
1518 F CPU in TIA V15 ...

Größen abrufen von Variabel etc. kann man immer grundlegend brauchen für kopieren etc oder zuweisen von Schnittstellen die eine Größe brauchen...

Gruß


Gesendet von meinem SM-G930F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man S7-1500 symbolisch programmiert (mit Variablen in Speicher mit "optimiertem" Zugriff) dann braucht man keine Speicher-Größen und keine Speicher-Adressen. Da braucht man nur PLC-Datentypen. Um alles andere kümmern sich die Compiler.

Harald
 
Wieso das denn ...

Woher soll der Compiler denn wissen wieviele Daten irgendwas braucht... kann er ja nicht ...

Schnittstellen Bausteine z.b. wieder MB Client will eine Länge wissen wieviele Daten er schreiben kann ...



Gesendet von meinem SM-G930F mit Tapatalk
 
Der Compiler weiß genau wieviele Daten irgendwas braucht (anhand der symbolischen Deklaration der PLC-Datentypen), er verrät aber nicht die Lage im Speicher, damit der Programmierer des Anwenderprogramms gar nicht erst in die Versuchung kommt, (falsche) Zugriffs-Tricks anzuwenden.
Wenn Du einen Baustein findest, der mit Speichergrößen arbeiten will, dann muß ggf. vorher mit einer Kopierfunktion die Variable in Speicher mit Standard-Zugriff umkopiert werden. Oder dem Siemens-Baustein stehen mehr Möglichkeiten zur Verfügung, an die man als Programmierer des Anwenderprogramms nicht ran kommt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da Stimme ich dir absolut nicht zu ...

Schau dir den MB Client Baustein an.

z.B. braucht er eine Länge die dann kopieren kann ... und das ist ein Siemens Baustein...

Der Compiler weiß mehr wie wir aber wir kommen da nicht dran ... das ist schon klar das der Compiler das weiß...



Gesendet von meinem SM-G930F mit Tapatalk
 
Den MB Client Baustein kenne ich nicht, doch kann es sein, daß man dem gar nicht irgendwelche Datentypen hinwerfen kann sondern selber seinen Datentyp in Modbus-kompatible Häppchen (z.b. Words oder Word-Arrays) umkopieren muß? Dann stellt sich die Frage gar nicht wie viel Platz mein Datentyp belegt.

Harald
 
Klar stellt sich die Frage und Größe des Datentyps weil dann brauche ich den Variant übergeben als Zeiger und dann die Größe des Datentyps und somit brauche ich nucht darauf achten oder hart kodieren wie groß bzw. Wie viele Daten in den Datentyp kopiert werden sollen ...

Also zum Thema zurück ... hat das jemand schonmal gemacht ... die Auswertung über das case mit typeof den Typ zu bestimmen ist nucht das Thema... aber Strings und Datentyp müsste man auch abdecken ...

Gruß


Gesendet von meinem SM-G930F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gerade wenn es um Schnittstellen geht, ist ein "optimierter" Zugriff oftmals gar nicht möglich. Auch in vielen Siemens-Beispielen und -Bibliotheken wird von dem optimierten Programmieren abgesehen. Warum wohl?

@mactoolz
Unter den "Erweiterten Anweisungen - Datenbausteinfunktionen" gibt es eine Funktion "ATTR_DB" mit der man u.a. die DB-Größe von nicht optimierten DBs ermitteln kann. Vielleicht kannst du dir das zunutze machen.
 
Schnittstellen Bausteine z.b. wieder MB Client will eine Länge wissen wieviele Daten er schreiben kann ...
Wenn du den MB_Client auf "optimierten" Datenbereichen arbeiten lassen willst, dann ist das nur auf Arrays von elementaren Datentyps möglich, also keine Struct mit Variablen darin.
Du kannst aber deine Struct mit "Serialize" in ein Byte-Array konvertieren, und dieses Byte-Array dann mit dem MB_Client verschicken. Die "Serialize" Funktion gibt dir am Parameter POS auch zurück, wie um wie viele Elemente der Zeiger durch das serialisieren der Variable weitergesetzt wurde, also bei einem Byte-Array erhältst du die Anzahl an Bytes wenn du PosNachAufruf - PosVorAufruf rechnest, das kannst du dann aufbereitet für deinen MB_Client verwenden.

Benötigt zwar alles doppelten Speicher im Vergleich zu früher, aber so ist das jetzt nunmal mit der schönen neuen Technik (wenn Siemens nicht so mit dem Speicher geizen würde, wäre das auch noch einigermaßen Ok).
 
nein das ist nicht ganz richtig, MB_Client verlangt einen Variant Typ und man gibt die Länge der Anzahl zu kopierenden Daten.

Gut das ist aber nicht das Thema wie Schnittstellen beschalten werden.

Nochmal zurück zum Thema, ich würde gerne das SizeOf wie in anderen Entwicklungsumgebungen nachbilden. Das wäre mein Ziel.
Die normalen Standard Datentypen sind nicht das Problem, eher wird es schwierig eigene größen der UDTs und Strings zu ermitteln.
Da habe ich gerade keine Idee wie man das über den Typ Variant ermitteln kann, zumindest komme ich nicht drauf ...

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nochmal zurück zum Thema, ich würde gerne das SizeOf wie in anderen Entwicklungsumgebungen nachbilden. Das wäre mein Ziel.
Die normalen Standard Datentypen sind nicht das Problem, eher wird es schwierig eigene größen der UDTs und Strings zu ermitteln.
Da habe ich gerade keine Idee wie man das über den Typ Variant ermitteln kann, zumindest komme ich nicht drauf ...
Sobald du optimiert arbeitest hast du keine Chance so wirklich an die Größe zu kommen, wie meine Vorredner erkenne ich aber den Sinn nicht die genau größe zu ermitteln da es für die PLC eher unwichtig ist.
 
Ich verstehe dein Problem nicht ganz. In der Hilfe steht:

Code:
Pointer auf den Modbus-Halteregister-DB: Bei dem Modbus-Halteregister kann es sich um den Speicherbereich der Merker oder um einen Datenbaustein handeln.Ab Anweisungsversion V4.0:
Der Parameter muss auf einen Speicherbereich zeigen, der eine Länge von mindestens 16 Bit hat. Eine geringere Länge führt zur Fehlermeldung 16#8187. Dies betrifft Single-Elemente, Arrays, STRUCTs und UDTs. Z.B. führt ein Single Bool oder ein Array, das aus weniger als 16 Bool-Elementen besteht, zu der Fehlermeldung.
Wenn die Länge kein Vielfaches von 16 Bit ist, können die Restbits am Ende des Speicherbereichs von der Anweisung Modbus_Slave weder gelesen noch geschrieben werden.
Der Parameter darf auf einen optimierten Speicherbereich zeigen. Im optimierten Speicherbereich ist ein Single-Element oder ein Array erlaubt mit folgenden Datentypen: Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar. Jeder andere Datentyp führt zur Fehlermeldung 16#818C.

Das bedeutet für dich du musst ein Array haben, wo deine Daten drin sind. Und bei meinem Client muss ich auch keine Länge angeben:

temp.JPG
 
Hi,

also als erstes verwendest du einen anderen Baustein als zu dem wir hier geredet haben.

MB_Client (Tcp/IP) ist nicht das selbe zudem der jetzt verwendet wurde (ModBus_Slave) .

Zweitens arbeite ich auch nur symbolisch und so wie jede andere SPS Hersteller habe ich grundlegend
ohne jegliche zusätzlichen Overhead zu produzieren immer genau nur die Anzahl der Bytes zu verarbeiten wie gewünscht, ohne das ich mir dabei die Finger brechen muss.

Ich würde gerne zu dem Ziel kommen sowas wie das SizeOf umsetzen zu wollen.
Und seltsamerweise geben alle anderen Software Hersteller diese Möglichkeit, aber da verfallen wir in eine Grundsatz Diskussion und schließlich arbeitet jeder anders
und hat eine andere Sichtweise in seiner Vorgehensweise und zu guter letzt versuche ich auch einen reproduzierbaren Quellecode nach Möglichkeit
portierbar zu halten, daher möchte ich mir das SizeOf unter anderem Nachbauen.

Daher suche ich eine Möglichkeit als Funktion vom SizeOf nachzubilden.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
also, laut Hilfe musst du eh entscheiden ob dein Pointer MB_DATA_PTR auf einen optimierten oder nicht optimierten Speicherbereich zeigt. Bei optimiert darf dieser nur auf elementare Datentypen oder ein Array bestehend aus elementaren Datentypen zeigen. Weil der Compiler dann ja die Größe weis - da die Länge der Datentypen ja fix , bzw. bei einem Array skaliert ist.
Nur wenn du auf einen nicht optimierten Speicher zeigst, dann musst du die Länge im Pointer explizit angeben bspw. "P#Bit-Adresse" "Datentyp" "Länge" (Beispiel: P#M1000.0 WORD 500) und kannst auch UDTs verwenden.
Warum Siemens nun trotzdem noch einen weiteren Parameter Namens MB_DATA_LEN am Baustein will ist tatsächlich ärgerlich - da wäre ein SizeOf(Sende/Empfangsdatenbereich) tatsächlich ganz hilfreich... gibt es aber leider nicht.
Deshalb schaue dir den Post #13 von Thomas nochmal an. Über das Serialisieren deiner UDT in bspw. ein Byte-Array würdest du die Länge herausbekommen.
 
Du musst aber zwischen symbolisch und "optimiert" unterscheiden. Sobald du eben "optimiert" arbeitest kann du nicht wirklich deine SizeOf Funktion abbilden da du keinerlei Zugriff auf Adressen bekommst, wie gesagt braucht der MB_Client auch gar nicht da der auch mit optimierten Zugriff problemlos funktioniert.
 
Zurück
Oben