Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: Typ Variant und wie geht man damit um

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.636
    Danke
    786
    Erhielt 654 Danke für 497 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich weiss der Datentyp ist sicher noch nicht in so richtig in Benutzung. Trotzdem dachte ich mir ich frag mal wie man den Typ richtig handhabt.

    Variant ist ja eigentlich ein Any, kann aber auch nur ein Typ Datenbaustein oder jede art Variable sein.

    Wenn ich jetzt einen Variant habe in dem z.B. ein Operandenbereich abgelegt wurde.

    z.B. P#DB120.dbx0.0 byte 100.

    Wie hole ich denn im Baustein aus dem Variant z.B. die länge oder die DB nummer und Startadresse wieder einzeln raus?

    Kann ich
    Zitieren Zitieren Typ Variant und wie geht man damit um  

  2. #2
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard

    Hallo,

    Vielleicht hilft Dir das weiter

    http://support.automation.siemens.co...86&caller=view

  3. #3
    Registriert seit
    02.06.2006
    Beiträge
    223
    Danke
    7
    Erhielt 42 Danke für 35 Beiträge

    Standard

    Hallo
    Schau mal hier
    http://www.automation.siemens.com/WW...73&Language=de oder Im PDF Handbuch von Step 7 Professional TIA V13 ist auch ein Beispiel wie mit Variant gearbeitet werden kann auf Seite 13

  4. #4
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.636
    Danke
    786
    Erhielt 654 Danke für 497 Beiträge

    Standard

    Also im V13 Handbuch ist auf Seite 13 noch Inhaltsverzeichnis kein wunder bei dem über 10'000 Seiten starken Werk.
    Aber der Link zum Siemens Forum ist mal ein guter Ansatzpunkt. Leider noch nicht genau das was ich suche.

    mfg René

  5. #5
    Registriert seit
    02.06.2006
    Beiträge
    223
    Danke
    7
    Erhielt 42 Danke für 35 Beiträge

    Standard

    Ich glaube die Seitenzahl war 213.
    Lade doch einfach mal das Handbuch runter und tippe Variant bei der Suche ein.
    Dort ist ein Codebeispiel in SCL zu dem Thema.
    Any Pointer gibt es nach wie vor. Aber Variant ist ein Allgemeiner Variablembegriff um mit Symbolischen Variablen unerschiedlichster Sruktur/ Datentyp flexibel arbeiten zu können, was halt bei Classic der Any Pointer ist.
    Varinant erkennt automatisch wo der Datentyp beginnt und endet.
    Das Codebeispiel in dem Handbuch ist so etwas wie ein universales FIFO oder Schieberegister
    Geändert von georg28 (08.05.2014 um 13:23 Uhr)

  6. #6
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Hi all

    aus den Beschreibungen die Siemens so liefert, wird man zwar schlauer, aber nicht klug. Hier mal meine Zusammenfassung:

    Variant ist nicht Any. Variant ist mehr! Und Pointer ist er auch nicht, denn der kann noch weniger.

    Pointer zeigt auf ein einzelnes Bit irgendwo im Standard-Speicher einer Simatic. Warum er nicht auf optimierten Speicher zeigen kann ... ist "böse" Absicht . Damit hat er in etwa den Nutzen eines Byte* aus C, du kannst das auf alles casten was du willst. Aber wehe du machst es falsch, dann viel Spaß beim Fehlersuchen. Noch schlimmer wenn es nicht dein eigener Code ist.

    Any zeigt auf einen Bereich irgendwo im Standard-Speicher einer Simatic. Auch der kann nicht auf optimierten Speicher. Der Any kann was über den Datentyp des Speichers wissen, auf den er zeigt. Er kann die einfachen Datentypen unterscheiden. er kann z.B. auf ein Feld von 20 REAL zeigen. Er kann jedoch nicht auf einen String[47] oder einen UDT5 zeigen. Aus komplexen Datentypen werden (fast) immer Byte-Arrays.

    Variant zeigt auf einen Bereich irgendwo im Speicher einer Simatic. Der kann auf optimierten Speicher zeigen. Der Variant weiß was über den Datentyp. Er kann sich (fast?) alle Datentypen merken. Also auch sowas wie array[20] of UDT21. Klingt doch gut! ... naja ... hier tritt der erste Mangel zutage. Er weiß nichts über die Ober und Untergrenzen von Arrays. Was nicht geht ist ein Array[1..5] of FB7. Also ein Feld aus Instanzen. Das ist jetzt ein Henne-Ei-Problem. Man kann das nicht Deklarieren, also kann der Variant auch nicht drauf zeigen. Oder ist das umgekehrt? Egal, Instanz-Arrays gehen nicht.

    Also ist der Variant deutlich besser als ein Any. Und gleichzeitig ist er für den AWL-Profi deutlich schlechter, denn es gibt keine Möglichkeiten den Variant zu manipulieren. Auch das ist Absicht, hat mit der CS versichert


    Zur V12 konnte man mit den Variant nichts machen. Es gab Systemfunktionen, die damit zauberten, aber für uns normal sterbliche Anwender, war nur durch reichen. Seit der V13 kommt Bewegung in die Sache. Leider viel zu viel Bewegung. Es gibt jetzt zwei Funktionen VariantGet und VariantPut, die es uns erlauben zu dereferenzieren.

    Wenn du einen Input vom Typ Variant und einen Temp von irgendeinem Typ, sagen wir mal UDT13, anlegst, dann kannst du mit VariantGet den Inhalt des UDT13 kopieren. Das finde ich ziemlich blöd, denn wenn der UDT13 nun so 1k groß ist, dann wird da ein ganzes Kilobyte kopiert . Wenn du einen InOut anlegst dann kannst du sogar mit dem VariantPut rein schreiben. Das setzt voraus, dass du beim Aufruf deiner Funktion aber auch ein DB-Element vom Typ UDT13 an den Parameter anlegst. Verwendest du jedoch einen UDT14, dann melden VaraintPut und VaraintGet einen Typkonflikt. Insofern hättest du eben auch gleich einen UDT13 an die Schnittstelle schreiben können. Die Sache hat aber eben doch einen Vorteil. Man kann wie die Systemfunktionen mehrere verschiedene Datentypen behandeln. Dazu legst du eben nicht nur einen Temp vom Typ UDT13 an sondern deiner Anwendung entsprechend einen t13:UDT13; t14:UDT14; t15:UDT15. Nun gibt es eine Konstrukt, mit dem man prüfen kann ob der Schnittellen input einen bestimmten Typ hat und kann man ganz gezielt mit diesem Typ weiter machen. Sieht etw so aus (ich zitiere aus dem Kopf)

    Code:
    if typeof(in1) = Int then
         VariantGet( v1, tint );
    elsif typeof(in1) = UDT13 then
         VariantGet( v1, t13 );
    elsif typeof(in1) = UDT14 then
         VariantGet( v1, t14 );
    ...
    Damit lässt sich dann ein begrenztes Operation-Overloading machen. Siemens macht das bei vielen Systemfunktionen vor. Einfachstes Beispiel sind MIN und MAX, trickreicheres z.B. TCON, wo man die verschiedenen Strukturen zum Aufbau einer Kommunikation angeben soll.


    Man kann den Variant nicht im DB anlegen! An einer Schnittstelle ja, aber nicht DB. Also kann man ihn nicht speichern. Er lebt nur so lange der Baustein mit seiner Deklaration auf dem Stack liegt. Ist der Baustein beendet, ist der Zeiger weg. Warum ist das so? ... eine dünne Vermutung meinerseits: Download im Run. Damit verliert die Sache aber sehr viel an Reiz. Wenn ich große Datenmengen habe und mir merken will, dass damit was zu tun ist, dann kann ich den Variant genau dafür nicht verwenden. Man muss so wie S. das im Beispiel zeigt die Daten kopieren.
    Der einzige Ausweg aus diesem Dilemma scheinen diese seltsamen ArrayDB zu sein, aber das ist wieder eine ganz andere Geschichte.



    Seit der V13 kann man also mit dem Variant was anfangen. ABER

    man muss viel zu viel Daten kopieren --> schnell ist das nicht
    man kann nicht auf einzelne Elemente einer Struktur zugreifen
    man kann den Variant nicht speichern



    So taugt mir das nicht. Kennen die eigentlich die IEC61131-3 3rd Edition. Die dort gezeigten Referenzen, das ist das was man verwenden kann. Das kann zwar etwas weniger flexibel als Variant, ist aber trotzdem viel intuitiver.

    'n schön' Tach auch
    HB

  7. Folgende 5 Benutzer sagen Danke zu HelleBarde für den nützlichen Beitrag:

    Olimoli50 (23.08.2016),Pipboy (12.05.2014),Ralle (11.05.2014),rostiger Nagel (11.05.2014),shutdown_TIA12 (11.05.2014)

  8. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Was Siemens sich dabei so gedacht hat, kann man auch in den zugehörigen Patent lesen:

    http://www.google.com/patents/EP2495653A1?cl=de

  9. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von HelleBarde Beitrag anzeigen
    Damit lässt sich dann ein begrenztes Operation-Overloading machen. Siemens macht das bei vielen Systemfunktionen vor. Einfachstes Beispiel sind MIN und MAX
    War bei der S7-300/400 aber auch schon mit dem Any-Pointer möglich, und wurde auch bei den MIN/MAX Funktionen aus der IEC-Lib verwendet. Mit den Nachteilen dass man keine Konstanten übergeben konnte, und man keine Typprüfung zum Übersetzungszeitpunkt mehr hat.
    Hat aber mit der Operator- bzw. ist es hier ja Parameterüberladung wie man es aus C++ kennt nicht viel zu tun. Dort gibt es für verschiedene Funktionssignaturen (d.h. Datentypen der Parameter) eigene Funktionen, und es wird zur Compilezeit entschieden welche aufgerufen wird.

  10. #9
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Hi Thomas

    cool, wie findest du sowas?

    Patentdeutsch ist echt krass. Wenn ich das richtig interpretiere, dann steht da genau das was ich schon vermute. Der Variant besteht aus zwei Zeigern. Einer auf den Wert, der andere auf den Typ.

    Wo ist denn da der Unterschied zu anderen Sprachen, eigentlich deren Implementierung?
    ...

    Ok bei C hat man einen Zeiger der auf den Wert zeigt und davor liegt am Wert der Zeiger auf den Typ.

    Also bei C wird jedes Objekt 4 Bytes größer.
    Bei der Simatic wird jeder Zeiger 4 Bytes größer.
    Da ist ein Unterschied!


    'n schön' Tach auch
    HB

  11. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von HelleBarde Beitrag anzeigen
    Hi Thomas

    cool, wie findest du sowas?

    Patentdeutsch ist echt krass. Wenn ich das richtig interpretiere, dann steht da genau das was ich schon vermute. Der Variant besteht aus zwei Zeigern. Einer auf den Wert, der andere auf den Typ.

    Wo ist denn da der Unterschied zu anderen Sprachen, eigentlich deren Implementierung?
    Ich hatte vor einiger Zeit mal nach Patenten im Zusammenhang mit dem TIA-Portal gesucht, da jemand anmerkte dass dort etwas bezüglich Zugriff auf SPS-Variablen z.B. von einem HMI patentiert sei (ist es auch).
    Aber jetzt sehe ich bei diesem Variant-Patent ganz unten:

    2. Apr. 2014 18R Refused

    Ist also abgewiesen worden. Da waren die Unterschiede wohl doch nicht groß genug.
    Ich sehe da auch keine große Neuerung. Der Siemens Variant kann zwar mehr als z.B. der aus der Microsoft-COM Umgebung bekannte Variant Typ, aber die Dinge um die sie ihren erweitert haben wie typeOf() gibt es in zig anderen neueren Sprachen.

  12. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Rainer Hönle (11.05.2014)

Ähnliche Themen

  1. Antworten: 25
    Letzter Beitrag: 02.01.2013, 22:57
  2. Firmen Wiki, wie geht man da ran
    Von rostiger Nagel im Forum PC- und Netzwerktechnik
    Antworten: 12
    Letzter Beitrag: 26.05.2011, 12:18
  3. Libnodave wie geht man da ran?
    Von tf_real10 im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 26.12.2007, 15:52
  4. AUF DB - und was geht jetzt alles damit ?
    Von rs-plc-aa im Forum Simatic
    Antworten: 25
    Letzter Beitrag: 03.04.2007, 08:47
  5. Wie geht man beim Programmieren vor?
    Von brossi_lgs im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 30.12.2005, 18:54

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •