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

Ergebnis 1 bis 8 von 8

Thema: Any-Zeiger

  1. #1
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    da die Lösung des letzten Problems hier so gut geklappt hat, möchte ich doch gleich einmal das nächste in die Runde werfen.

    Ich nun noch das folgende Problem, dass ich einen Eingang an einen FB bringen will, der je nach Anwendung im Programm als Eingang entweder ein Byte, Wort oder Doppelwort akzeptiert. Ich brauche also einen Eingang vom Typ Any. Nur wie kann ich diesen weiterverarbeiten.

    Ich kann weder einen Move-Befehl durchführen noch irgendetwas machen.

    Vielen Dank nochmal für Eure Mühen,
    Matthias
    Zitieren Zitieren Gelöst: Any-Zeiger  

  2. "Hallo!

    Zunächst musst Du den Datentyp bestimmen. Das könntest Du wie folgt machen:
    Code:
          L     P##e_AnyZeiger
          LAR1  
          L     B [AR1,P#1.0]               // Typ des ANY-Zeigers abfragen
    
          CLR   
          =     #b_Typ_Bool
          =     #b_Typ_Byte
          =     #b_Typ_Word
          =     #b_Typ_DWord
          SPL   ERR1
          SPA   TEND                        // 0 ungültig
          SPA   T01B                        // 1 boolsch
          SPA   T08B                        // 2 byte
          SPA   T08B                        // 3 char
          SPA   T16B                        // 4 word
          SPA   T16B                        // 5 int
          SPA   T32B                        // 6 dword
          SPA   T32B                        // 7 dint
          SPA   T32B                        // 8 real
          SPA   T16B                        // 9 date
          SPA   T32B                        // 10 time_of_day
          SPA   T32B                        // 11 time
          SPA   T16B                        // 12 s5time
    ERR1: SPA   TEND                        // ungültig   
    
    T01B: S     #b_Typ_Bool                 // 1-Bit-Typ
          SPA   TEND
    T08B: S     #b_Typ_Byte                 // 8-Bit-Typ
          SPA   TEND
    T16B: S     #b_Typ_Word                 // 16-Bit-Typ
          SPA   TEND
    T32B: S     #b_Typ_DWord                // 32-Bit-Typ
    
    TEND: NOP   0                           // Typ-Abfrage Ende
    Da jetzt der Datentyp bekannt ist, kann das folgende Programm so gestaltet werden, dass es jeweils passend auf die Eingangsvariable (als Boolschen Wert, als Byte, als Wort oder was auch immer...) zugreifen kann.

    Gruß
    Flinn"


  3. #2
    Registriert seit
    25.08.2003
    Beiträge
    332
    Danke
    46
    Erhielt 54 Danke für 46 Beiträge

    Standard

    Hallo!

    Zunächst musst Du den Datentyp bestimmen. Das könntest Du wie folgt machen:
    Code:
          L     P##e_AnyZeiger
          LAR1  
          L     B [AR1,P#1.0]               // Typ des ANY-Zeigers abfragen
    
          CLR   
          =     #b_Typ_Bool
          =     #b_Typ_Byte
          =     #b_Typ_Word
          =     #b_Typ_DWord
          SPL   ERR1
          SPA   TEND                        // 0 ungültig
          SPA   T01B                        // 1 boolsch
          SPA   T08B                        // 2 byte
          SPA   T08B                        // 3 char
          SPA   T16B                        // 4 word
          SPA   T16B                        // 5 int
          SPA   T32B                        // 6 dword
          SPA   T32B                        // 7 dint
          SPA   T32B                        // 8 real
          SPA   T16B                        // 9 date
          SPA   T32B                        // 10 time_of_day
          SPA   T32B                        // 11 time
          SPA   T16B                        // 12 s5time
    ERR1: SPA   TEND                        // ungültig   
    
    T01B: S     #b_Typ_Bool                 // 1-Bit-Typ
          SPA   TEND
    T08B: S     #b_Typ_Byte                 // 8-Bit-Typ
          SPA   TEND
    T16B: S     #b_Typ_Word                 // 16-Bit-Typ
          SPA   TEND
    T32B: S     #b_Typ_DWord                // 32-Bit-Typ
    
    TEND: NOP   0                           // Typ-Abfrage Ende
    Da jetzt der Datentyp bekannt ist, kann das folgende Programm so gestaltet werden, dass es jeweils passend auf die Eingangsvariable (als Boolschen Wert, als Byte, als Wort oder was auch immer...) zugreifen kann.

    Gruß
    Flinn

  4. #3
    Registriert seit
    19.06.2003
    Beiträge
    2.203
    Danke
    85
    Erhielt 262 Danke für 178 Beiträge

    Standard

    Warum kannst Du nicht einfach einen Byte-Zeiger und eine Längenangabe benutzen und dan z.B. für das Doppelwort 4 Byte vom Bytezeiger lesen ?

  5. #4
    Registriert seit
    25.08.2003
    Beiträge
    332
    Danke
    46
    Erhielt 54 Danke für 46 Beiträge

    Standard

    Der große Vorteil ist: Die so programmierte Funktion kann zur Laufzeit universell erkennen, was am Eingang bzw. am Ausgang der Funktion verschaltet worden ist.

    Ich habe da mal eine Funktion für Störmeldungen geschrieben (Bildung einer statischen Sammelmeldung und einer Sammelflanke zur Neuwerterkennung). Hier konnte ich Boolsche Eingänge (!), Byte und Wort-Variablen eingangsseitig verschalten. Beim Schreiben von Ausgangswerten ist es natürlich noch wichtiger zu wissen, um was für einen Datentyp es sich handelt.

    Gruß
    Flinn

  6. #5
    Registriert seit
    02.07.2003
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Die Lösung mit dem Any-Pointer ist in diesem Fall wirklich nicht
    Optimal.
    Einfacher geht es so:
    Du definierst im FB einen Eingangsparameter als DWord
    z.B.
    InPara DWord

    im Codeteil schreibst du:
    L InPara
    T LD0 // Erstes DWord in den Lokalen Variablen

    jetzt kannst du auf auf LD0 zugreifen wie du es brauchst.

    z.B.

    L LB0 // Byte3 (höchstwertiges Byte vom DWord)
    oder
    L LB3 // Byte 0 (niederwertistes Byte von DWord/Word oder Byte)
    oder
    u L2.1 // Bit 2.1 deines Parameters

    Was du also in deinen Parameter hineinpackst ist egal, solange es bei maximal 4-Bytes bleibt. Aufpassen mußt du nur auf die Reihenfolge wie die Bytes abgelegt werden!

    Gruß, Ulrich
    gesegnete Arbeit,
    Ulrich Klakow
    Zitieren Zitieren Lösung Suboptimal  

  7. #6
    Registriert seit
    25.08.2003
    Beiträge
    332
    Danke
    46
    Erhielt 54 Danke für 46 Beiträge

    Standard

    Hallo Ulrich,

    Vielen Dank für Deinen Beitrag.
    Deine Methode wird sicherlich in 99,99999 % aller Anwendungsfälle so programmiert, sehe ich genauso. Ich muss aber hartnäckig bleiben, da Matthias ja eigentlich folgende Frage hatte:
    Zitat Zitat von Matthias
    ...das folgende Problem, dass ich einen Eingang an einen FB bringen will, der je nach Anwendung im Programm als Eingang entweder ein Byte, Wort oder Doppelwort akzeptiert...
    Wenn ich einen FB-Eingang als DWord deklariere, und dann
    a) ein Merkerbyte
    b) ein Merkerwort
    c) ein Merkerdoppelwort
    im Aufruf verschalte wird mein Programm leider in zwei von den drei obigen Fällen eine rote Farbe annehmen.

    Regnerische Grüße
    Flinn

    P.S. Nebenbei gesagt: Finde die Entwicklung des Forums richtig gut... Habe zur SPS-Thematik kein vergleichbar gutes Forum gefunden!
    Zitieren Zitieren Re: Any-Zeiger  

  8. #7
    Registriert seit
    02.07.2003
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Flinn,

    du hast leider vollkommen Recht. Bei Funktionsaufrufen gibt es leider
    keinerlei Möglichkeit einem FB/FC einen Parameter wie in "C" zu casten.
    Das führt leider dazu das man dies vor dem CALL FB/FC mittels AWL vom Hand machen muß. Ich mache das meisten so:
    Code:
    L         "Nutztype"     // Eine Variable von einem Type zwischen 8-32Bit
    T         tPara          // Immer als DWORD definiert
    
    CALL  FB/FC
       Para:=tPara
       ...
    Die Methode geht immer und macht einen typecast wie in "C".
    Das die überhaupt nötig ist, hat leider nur mit der Typeprüfung
    des SPS-Compilers zutun. Wenn du einen Input-Parameter in einem
    CALL angibst macht der Compiler genau dasselbe was ich tue um dem
    Eingangparameter einen Wert zuzuweisen blos sieht man diese Anweisungen nicht. Ich habe das 1998 zufällig bei der Step7 V4.0 mitgekriegt was der Compiler aus einem CALL FB mit Parametern macht.
    Für einen FB aufruf kann man sich das auch schön zunutze machen um
    größere Codeteile die man an mehreren Stellen in einem FB benötigt
    in einen anderen FB auslagert dem man die selbe Variablenliste mitgibt
    die der aufrufende FB hat. Man ruft den Sub-FB (ich nenne den mal so)
    mittel UC FB auf und hat dann auf alle Variablen bis auf die TEMP's über den Variablennamen Zugriff die Variablen des aufrufenden FB's.
    Falls du dich hierfür interressiert melde dich mal bei mir.

    Gruß, Ulrich
    gesegnete Arbeit,
    Ulrich Klakow
    Zitieren Zitieren Parameterproblem  

  9. #8
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    bin auch an einer Lösung von Matthias Problem interessiert.
    Habe allerdings die Beiträge nicht ganz kapiert, wer kann mir ein wenig helfen?
    Karsten
    Zitieren Zitieren Wer kennt denn jetzt eine Lösung?  

Ähnliche Themen

  1. ANY-Zeiger als Rückgabewert
    Von Bensen83 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.06.2011, 11:41
  2. Zeiger
    Von snowleopard1702 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.05.2011, 17:07
  3. Zeiger für Anfänger
    Von OKL im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 11.04.2010, 00:44
  4. ANY-Zeiger
    Von RAN im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 20.07.2006, 17:42
  5. Zeiger???
    Von Jochen Kühner im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 03.09.2004, 08:33

Lesezeichen

Berechtigungen

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