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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: 1500 Zeiger wie Variant zerlegen und bearbeiten

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.621
    Danke
    777
    Erhielt 649 Danke für 494 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich versuche gerade mich etwas in die neuen Zeigerdatentypen der 1500/1200 einzuarbeiten.

    Variant müsste doch eigentlich auch ein normaler Zeiter wie ein Anypointer sein. Nur halt mit mehr funktionen.
    Aber kann ich den auch verändern bzw anpassen?

    Wenn ich einen Baustein (klassisches Beispiel: PUT) habe der sich mit Variant beschalten lässt. Dann kann ich am Variant Eingang ja einfach einen Pointer anlegen P#DB20.dbx0.0 byte 2 oder die Struktur "DatenBaustein2".Bytes2

    Aber kann ich in der Laufzeit z.B. den Verweis auf DB2 nach DB3 verändern? Kann ich eine Variant Deklaration am INOUT eines eigenen FBs verändern? Kann ich darin auslesen welcher DB er enthält, welche Länge etc?

    Kann man da eine Sicht drauflegen wie beim ANY Pointer?

    mfg René
    Zitieren Zitieren 1500 Zeiger wie Variant zerlegen und bearbeiten  

  2. #2
    Registriert seit
    22.07.2007
    Beiträge
    86
    Danke
    16
    Erhielt 25 Danke für 19 Beiträge

    Standard

    Hallo René,

    ich habe den Variant gestern erst benutzt um ein paar "Standard"-Bausteine für die 15xx-Steuerungen zusammenzufassen.

    Am Variant kann eigendlich jeder Elementare oder Zusammengesetzte Datentyp angelegt werden. In meinem Fall ware es Berechnungsfunktionen und Grenzwertprüfungen, wo vorher je ein 1 Baustein für Int, DInt, Real, und "udt-Long" (2xDInt) existierte.
    Nun habe ich nur noch jeweils einen Baustein mit Variants für die Eingangswerte.
    Mit einem TypeOf(#VariantXY) kann im Bastein nun ermittelt werden, welcher Datentyp von am Eingang angelegt wurde.
    Danach kann mit VariantGet(#VariantXY) auf den konkreten Datentyp gecastet werden. (Vielleicht war es auch GetVariant()...)

    Das sieht dann in etwaso aus:
    Code:
    Case TypeOf(#VG1) of
       Int:
         #tempWert := INT_TO_REAL(VariantGet(#VG1));
    
       DInt:
         #tempWert := DINT_TO_REAL(VariantGet(#VG1));
    
       Real:
         #tempWert := VariantGet(#VG1);
    
       LReal:
         ...
         ...
         ...

    Das selbe funktioniert für Outputs mit VariantPut().



    Ich hoffe das hilft dir...



    MfG Semo

  3. Folgender Benutzer sagt Danke zu Semo für den nützlichen Beitrag:

    vollmi (30.07.2015)

  4. #3
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.621
    Danke
    777
    Erhielt 649 Danke für 494 Beiträge

    Standard

    Danke dir das ist schon viel. Jetzt kapier ich so langsam wie das angedacht ist.

    Wenn ich das jetzt aber so mache:
    Code:
    CASE TypeOf(#PUT_SD) OF
        Any:
            VariantGet(SRC := #PUT_SD,
                       DST => #test);
        Pointer:
            VariantGet(SRC := #PUT_SD,
                       DST => #test);
           
    END_CASE;
    wobei aussen am Baustein an der Schnittstelle das so angehängt ist.
    Code:
    #baustein.PUT_SD := P#DB10.dbx0.0 byte 10
    Dann müsste das ja einen any erkennen oder zumindest einen Pointer. Aber keine dieser Bedingungen des Case ist erfüllt.
    Gibt es ein Verzeichnis welche Typen da zurückgegeben werden können?

    mfg René

  5. #4
    Registriert seit
    15.03.2013
    Beiträge
    187
    Danke
    6
    Erhielt 35 Danke für 30 Beiträge

    Standard

    Eine Beschreibung von TypeOf(<Operand>) incl. Verweis auf die gültigen Datentypen und Programmierbeispiel findest Du hier: https://support.industry.siemens.com...20/71032342283

  6. Folgender Benutzer sagt Danke zu Mediator für den nützlichen Beitrag:

    vollmi (30.07.2015)

  7. #5
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.621
    Danke
    777
    Erhielt 649 Danke für 494 Beiträge

    Standard

    Danke dir

    Komisch. Wenn ich einfach nur ein Byte anhänge (z.B. %MB100) dann bekomme ich über typeof() auch Byte.
    hänge ich aber einen ANY an (z.B. P#DB5.dbx0.0 byte 4) dann kriege ich über typeOf weder pointer, any, DB_any oder dergleichen.

    mfG René

  8. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.227
    Danke
    534
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ich zweifel ein wenig, daran, dass das funktioniert.

    Lies mal hier: https://support.industry.siemens.com...23659&lc=de-WW

    Irgendwie seht nirgends, dass Variant für Pointer und Any diesen Typ zurückgibt. Vielleicht gibt er nur einfacht Datentypen zurück?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. #7
    Registriert seit
    30.04.2005
    Beiträge
    908
    Danke
    58
    Erhielt 161 Danke für 147 Beiträge

    Standard

    Code:
    Der Operand muss den Datentyp VARIANT haben. Der Vergleichsoperand kann ein elementarer Datentyp oder ein PLC-Datentyp sein.
    Krieg ist Gottes Art den Amerikanern Geographie beizubringen

  10. #8
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.621
    Danke
    777
    Erhielt 649 Danke für 494 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Irgendwie seht nirgends, dass Variant für Pointer und Any diesen Typ zurückgibt. Vielleicht gibt er nur einfacht Datentypen zurück?
    Hmpf da steht aber auch
    Datenbausteinnummer.Operand Typ Länge
    (gilt nur für Bausteine mit Standardzugriff)

    also
    P#DB10.DBX10.0 INT 12
    Also muss man doch irgendwie an Nummer operand typ und länge einzeln drankommen.

    Meine Fresse 11000 Seitiges Handbuch ist echt übel zu durchforsten.

    mfG René

  11. #9
    Registriert seit
    26.01.2011
    Ort
    Osnabrück
    Beiträge
    52
    Danke
    24
    Erhielt 13 Danke für 12 Beiträge

    Standard

    Zitat Zitat von centipede Beitrag anzeigen
    Code:
    Der Operand muss den Datentyp VARIANT haben. Der Vergleichsoperand kann ein elementarer Datentyp oder ein PLC-Datentyp sein.
    Somit kann die Funktion nicht den Typ Any, Pointer, usw. zurückgeben.

    Unter dem Text steht auch noch in der Beschreibung zur Funktion:

    Die Anweisung "Datentyp einer VARIANT-Variable abfragen" können Sie nur innerhalb einer IF-Anweisung verwenden.

  12. #10
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.621
    Danke
    777
    Erhielt 649 Danke für 494 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Accused Beitrag anzeigen
    Die Anweisung "Datentyp einer VARIANT-Variable abfragen" können Sie nur innerhalb einer IF-Anweisung verwenden.
    Case funktioniert zumindest bei elementaren Datentypen auch.
    Im Handbuch hats ja auch eine Tabelle der Hexcodierung der Datentypen. Allerdings lässt sich die TypeOF Rückgabe nicht auf ein Byte legen. Wäre ja zu einfach wenn man direkt den Rückgabewert mal sehen könnte.

    mfG René

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 07.07.2015, 09:10
  2. TIA ANY in Baustein bearbeiten wie deklarieren
    Von vollmi im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 01.07.2015, 08:29
  3. Antworten: 7
    Letzter Beitrag: 10.02.2015, 14:10
  4. TIA Typ Variant und wie geht man damit um
    Von vollmi im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 11.05.2014, 12:37
  5. TIA VARIANT Datentyp S7-1200 / S7-1500
    Von Beckx-net im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 12.07.2013, 13:32

Lesezeichen

Berechtigungen

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