Any-Zeiger

A

Anonymous

Guest
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
 
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
 
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
 
Lösung Suboptimal

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Matthias schrieb:
...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!
 
Parameterproblem

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
 
Wer kennt denn jetzt eine Lösung?

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
 
Zurück
Oben