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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: 1500 Zeiger wie Variant zerlegen und bearbeiten

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hab auch grad im Handbuch nachgelesen und verstehe den Hinweis aus der Hilfe mit der If-Anweisung jetzt überhaupt nicht mehr.

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

    Standard

    Ich will vermutlich einfach zu viel zu früh von der neuen CPU

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

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    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é
    Ich hab's so zwar noch nicht programmiert, aber aus der Beschreibung und deinem Test (.. weder pointer ...) könnte man vermuten, dass in dem Fall im Variant ein Byte oder eine Array von 4 Bytes ankommt. Hast Du das mal probiert?

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

    Standard

    Zitat Zitat von Mediator Beitrag anzeigen
    Ich hab's so zwar noch nicht programmiert, aber aus der Beschreibung und deinem Test (.. weder pointer ...) könnte man vermuten, dass in dem Fall im Variant ein Byte oder eine Array von 4 Bytes ankommt. Hast Du das mal probiert?
    Byte und Arrays in verschiedenen Grössen habe ich schon probiert. Bisher ohne erfolg. Aber dafür habe ich den Variant sonst ein bisschen ausprobiert. Ist ansich schon ne Tolle Sache.

    Ich hab mir jetzt n kleinen Skalierungsbaustein geschrieben der selbstständig erkennen soll ob ich ein Wort einer AI Karte, ein INT oder ein REAL angehängt habe. Ausgeben soll er je nachdem was er angehängt kriegt ein INT oder ein REAL wobei der INT noch mit einem einzugebenden Faktor verrechnet werden soll. Hat tadellos geklappt. In der 300/400er Welt hab ich dafür 4 Verschiedene Bausteine gehabt. Jetzt kann einer alles.

    Code:
    FUNCTION "SKAL" : Void
    TITLE = 'scaling Peripherical Input words'
    { S7_Optimized_Access := 'TRUE' }
    AUTHOR : VoR
    FAMILY : Peripher
    NAME : W_skal_R
    VERSION : 1.8
    // Input will be converted directly from Eing to AUSG
    // the Linearity is calculatet from UGR_IN to UGR_Out and OGR_IN to OGR_OUT
       VAR_INPUT 
          EING : Variant;   // Input. IF Word then PEW scal unipolar
          OGR_IN : Real;   // Upper limit input in format REAL
          UGR_IN : Real;   // Lower limit input in format REAL
          UGR_OUT : Real;   // Lower Output = Lower Input
          OGR_OUT : Real;   // Upper Output = Upper Input
          INT_FACTOR : Real;   // Faktor for the Integer Input (Normaly 10.0) means 13.7 REAL out is 137 for INT
          OBJ_AH : Bool;   // Manualoverride aktiv inaktiv
       END_VAR
    
    
       VAR_IN_OUT 
          AUSG : Variant;   // Output scaled INT or REAL
       END_VAR
    
    
       VAR_TEMP 
          OGR_IN_MAX : Bool;   // Input >= Upper limit input
          UGR_IN_MAX : Bool;   // Input <= Upper limit input
          EING_REAL : Real;   // Input im format REAL
          EING_WORD : Word;
          EING_INT : Int;
          LIMIT_R : Real;   // limited input (for calculation)
          LIM_X_UG : Real;   // temporary VAR for limiter
          LIM_X_OG : Real;   // Dito
          Status : Word;
          Ausg_REAL : Real;
          EING_REAL_PEW : Real;
       END_VAR
    
    
    
    
    BEGIN
    
    CASE TypeOf(#EING) OF
        Word: // Wenn Wort, dann behandeln wie einen Analogeingang
            VariantGet(SRC := #EING,
                       DST => #EING_WORD);
            #Status := SCALE(IN := WORD_TO_INT(#EING_WORD), HI_LIM := #OGR_OUT, LO_LIM := #UGR_OUT, BIPOLAR := 0, OUT => #EING_REAL_PEW);
        Int: // Wenn Int dann in REAL wandeln
            VariantGet(SRC := #EING,
                       DST => #EING_INT);
            #EING_REAL := INT_TO_REAL(#EING_INT);
        Real: // Wenn Real dann So übernehmen
            VariantGet(SRC := #EING,
                       DST => #EING_REAL);
    END_CASE;
    
    
    (*sorting limits for calculation*) 
    IF #UGR_IN < #OGR_IN THEN
      #LIM_X_UG := #UGR_IN;
      #LIM_X_OG := #OGR_IN;
      
    ELSIF #OGR_IN <= #UGR_IN THEN
      #LIM_X_UG := #OGR_IN;
      #LIM_X_OG := #UGR_IN;
    END_IF;
    
    
    (*input should be limited*)
    #LIMIT_R := LIMIT(MN := #LIM_X_UG, IN := #EING_REAL, MX := #LIM_X_OG);
    
    
    (*calculating limited data*)
    IF NOT #OBJ_AH  THEN
        IF NOT (TypeOf(#EING) = Word) THEN
            #Ausg_REAL := ((#OGR_OUT - #UGR_OUT) / (#OGR_IN - #UGR_IN)
            * #LIMIT_R
            + (#OGR_OUT - (#OGR_OUT - #UGR_OUT)
            / (#OGR_IN - #UGR_IN) * #OGR_IN));
        ELSE
            #Ausg_REAL := #EING_REAL_PEW;
        END_IF;
        
        CASE TypeOf(#AUSG) OF
            Real:
                VariantPut(SRC := #Ausg_REAL,
                           DST := #AUSG);
            Int:
                VariantPut(SRC := REAL_TO_INT(#INT_FACTOR * #Ausg_REAL),
                           DST := #AUSG);
        END_CASE;
    END_IF;
    
    
    END_FUNCTION
    Man muss ja auch mal Zeit für Spielereien haben. Trotzdem Will ich die tieferen Funktionen von VARIANT noch begreifen.
    Aber ich bezweifle dass da ein Siemenskurs hilfreich wäre. Es gibt zwar einen 1500er Umsteigerkurs. Ich denke aber der reisst die Funktionen wirklich nur oberflächlich an.

    mfg René

    edit: letztes End_if muss VariantPUT einschliessen. Sonst lässt sich der Datenpunkt am Ausgang nicht von aussen überschreiben.
    edit_2: Fehler in Word Eingang darf nicht zweimal skaliert werden.
    Geändert von vollmi (31.07.2015 um 10:58 Uhr)

  5. Folgender Benutzer sagt Danke zu vollmi für den nützlichen Beitrag:

    Mediator (31.07.2015)

  6. #15
    Registriert seit
    07.04.2011
    Beiträge
    65
    Danke
    7
    Erhielt 11 Danke für 9 Beiträge

    Standard

    Ich habe erst vor 2 Wochen den Umsteigerkurs besucht. Der Typ wurde nur mal aufgelistet. Ich glaube der Dozent meinte das man die fortgeschrittenen Funktionen erst im Tia-Pro3 Kurs macht.
    Edit: Bzw. in TIA-SCL
    Geändert von DauYing (31.07.2015 um 09:29 Uhr)

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

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen


    Man muss ja auch mal Zeit für Spielereien haben. Trotzdem Will ich die tieferen Funktionen von VARIANT noch begreifen.
    Aber ich bezweifle dass da ein Siemenskurs hilfreich wäre. Es gibt zwar einen 1500er Umsteigerkurs. Ich denke aber der reisst die Funktionen wirklich nur oberflächlich an.

    mfg René
    Ich finde solche "Spielereien" unverzichtbar, wenn man sich weiter entwickeln will

    Als Unterstützung ware mir ein gut gemachtes Buch lieber, das sinnvolle Anwendungen von VARIANT anhand von Beispielen aufzeigt. Falls Du mal eines findest, ware es super, wenn Du hier eine Info bringen könntest.

    Was mich interessieren würde: Funktioniert Deine Funktion SKAL, wenn Du sie z.B. mit EING P#DB5.dbx0.0 INT 2 aufrufst?

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

    Standard

    Zitat Zitat von Mediator Beitrag anzeigen
    Was mich interessieren würde: Funktioniert Deine Funktion SKAL, wenn Du sie z.B. mit EING P#DB5.dbx0.0 INT 2 aufrufst?
    Nein das funktioniert eben nicht. Ich hab noch nicht herausgefunden was beim anlegen eines Pointers P# für eine TypeOF rückgabe kommt.
    Beim Skal werde ich sicher noch eine Fehlerbehandlung reinmachen. erstens fürs fehlerhaften Typ anlegen und zweitens für Bereichsgrenze überschreiten von Analogwerten.

    mfG René

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

    Standard

    Zitat Zitat von DauYing Beitrag anzeigen
    Edit: Bzw. in TIA-SCL
    Also der SCL Kurs geht auf Variant überhaupt nicht ein, den habe ich letztes Jahr aus interesse gemacht. Da kam nicht wirklich viel neues für mich rum. Der ist für Leute die wirklich noch nie was in ST programmiert haben.

    mfG René

  10. #19
    Registriert seit
    29.03.2004
    Beiträge
    5.742
    Danke
    143
    Erhielt 1.688 Danke für 1.226 Beiträge

    Standard

    Ich würde von so einer Verwendung von Variant Abstand nehmen.
    Du gibst damit jedwede statische Typüberprüfung auf. Außerdem müsstest du in deinen Baustein eine Fehlerbehandlung einbauen, um ungültige Typen abzufangen, wenn jemand deinen Bausteinparameter z.B. mit einer Bool-Variable beschaltet, was durchaus möglich ist um beim Bausteinaufruf nicht einmal angemeckert wird. Fehler werden somit immer erst zur Laufzeit gemeldet, und das möchte ich zumindest bei der SPS-Programmierung soweit es geht vermeiden.

    Wird der Typ eigentlich auch erkannt, wenn du als Parameter eine Konstante verwendest?

  11. #20
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Ich würde von so einer Verwendung von Variant Abstand nehmen.
    Du gibst damit jedwede statische Typüberprüfung auf. Außerdem müsstest du in deinen Baustein eine Fehlerbehandlung einbauen, um ungültige Typen abzufangen, wenn jemand deinen Bausteinparameter z.B. mit einer Bool-Variable beschaltet, was durchaus möglich ist um beim Bausteinaufruf nicht einmal angemeckert wird. Fehler werden somit immer erst zur Laufzeit gemeldet, und das möchte ich zumindest bei der SPS-Programmierung soweit es geht vermeiden.

    Wird der Typ eigentlich auch erkannt, wenn du als Parameter eine Konstante verwendest?
    Dem kann ich nur zustimmen.
    Ich finde das zwar auch durchaus interessant, halte aber eine eher konservative Programmierung (Pointer, Any etc., nur, wenn es nicht anders geht). für wesentlich sicherer, in Bezug auf die Funktion meiner Maschinen und auch in Bezug auf die Lesbarkeit für andere Programmierer/Instandhalter. Dann sind es eben 4 Bausteine, aber man weiß und sieht sofort, was da passiert und das schon beim Programmieren.

    Trotzdem ist es natürlich vollkommen richtig von dir, sich zumindest damit zu beschäftigen und auseinanderzusetzen, da hat @Mediator recht.
    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

Ä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
  •