ANY-Format auf Doppelwort?

Jordy

Level-1
Beiträge
123
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!

Brauch mal eben eure Hilfe. Bin gerade dabei ein kleines Telegramm zu einem DP Teilnehmer zu bauen. Jetzt sind da ja wie immer verschiedene ID's die ich senden muss und so weiter. Ist auch egal... Insgesamt jedesmal 8 Byte. Auf Byte 4-7 schicke ich manchmal einen Sollwert.

Um nicht jedes mal überlegen zu müssen welches byte (0-3) ich womit versorgen muss habe ich mir ein kleines FC-chen gemacht.

So...

Da möchte ich eine IN_Variable einbinden wo ich beim Bausteinaufruf ein Doppelwort oder auch einen festen Wert anbinden kann. Das Problem was ich dabei habe, das dieser Wert ein Integer, Doppelinteger oder auch im Realformat sein kann.
Dachte dabei an das ANY-Format.?? Da ich im FC ja declarieren muss um was für ein Format es sich handelt. Beim ANY-format kann ich beim Bausteinufruf anbinden was ich möchte, aber in meinem FC kann ich es nicht weiterverarbeiten (eher gesagt weiß nicht wie. Mit SFC20 geht es nicht. Geht nur wenn diese Variable sich im TEMP befinden, nich aber im IN)

Klar, gibt Möglichkeiten... Schmiermerker oder sonst was. Aber muss doch ne ganz saubere Möglichkeite geben!?
Habt ihr eine Idee?

Danke schonmal! :)
 
Das wundert mich aber. Hat keiner eine Idee?? Oder hab ich mich kompliziert Ausgedrückt?
Also ohne Beschreibung was ich machen mächte, habe ich das Problem, das ich eine IN_Variable im Format "Any" nicht weiterverarbeitet bekomme. Ist es eine Temporäre, dann kein Problem. Aber IN_Variable funktioniert nicht. :confused: :confused:
 
Siehe Kai und in der FAQ (Aufbau Typ Any von Volker). Damit solltest du auch herausbekommen, was denn nun außen am FC für ein Variablentyp angelegt wurde und entsprechend weiterrechnen.
 
Ja Danke schonmal.
So wie in dem Link von Kai habe ich es schon gemacht. Aber da habe ich am FC-Aufruf keinen Pointer angebunden, sonder ganz normal ein "MD" zum testen. Ging dann natürlich nicht!!
Werde das heute abend oder Montag auf der Arbeit mal ausprobieren.

Wenn ich das von Volker mir anschaue, misshandel ich das Any-Format ja eigenlich nur und nutze es garnicht aus, was das ding alles kann. Wenn ichs jetzt auf die schnelle richtig verstanden habe, dann kann ich mir ja quasi indirekt mit nem pointer, einen anypointer zusammenmünzen...?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weiß jetzt nicht genau, was du meinst.
Hier mal, was ich meinte ;):

Code:
      L     P##Variable  //Any (In-Var)
      LAR1  

      L     W [AR1,P#0.0]  
      T     #Word0         //Temp

      L     W [AR1,P#2.0]  
      T     #Word2         //Temp

      L     W [AR1,P#4.0]
      T     #Word4         //Temp

      L     D [AR1,P#6.0]
      T     #DWord6        //Temp
Code:
      CALL  "IN_Test"
       Variable:="DB_Test_Var".IntVar

      CALL  "IN_Test"
       Variable:="DB_Test_Var".DIntVar

      CALL  "IN_Test"
       Variable:="DB_Test_Var".RealVar
Variable ist ein Any.

Dies sind die Variablen, die im DB "DB_Test" definiert sind.
Code:
IntVar     INT     0        
DIntVar    DINT    L#0        
RealVar    REAL    0.000000e+000
Wenn du dir mal die Variable im Word0 ansiehtst steht dort:

bei INT 1005H
bei DINT 1007H
bei Real 1008H

Damit kannst du ermitteln, was dir für ein Variablentyp übergeben wird. Mit dem Rest in dem Any kannst du dir dann die Variable durch entsprechend richtigen Zugriff holen.
 
Zuletzt bearbeitet:
Hey, vielen Dank!!

Ok... Also mit einem ANY-Pointer bau ich mir quasi aus mehreren einzel Informationen einen "normalen" Pointer zusammen, richtig?
Also, das ist nicht das was ich brauche :D

Möchte ja nur eine Möglichkeit haben, das ich bei einer IN-Variable einen Integer, Doppelinteger oder eine Realzahl anbinden kann. Das mit einer Variable. Hmmm.


Mal eine andere Frage (sorry) war jetz mal ein bisschen mit any und Pointern am rumspielen und gestolpert. Und zwar:

IN_Pointer ist eine IN_Variable als Pointer deklariert. Beim Aufruf des FCs habe ich einfach mal P#M50.0 angebunden. Der FC ansich sieht wie folgt aus. (Nur mal so zum testen)
L P##IN_Pointer
LAR1

L W [AR1,P#0.0]
T MW 60

L W [AR1,P#2.0]
T MW 62

L W [AR1,P#4.0]
T MW 64

L D [AR1,P#6.0]
T MD 66

Funktioniert leider nicht. Wenn ich aber anstelle von P##IN_Pointer direkt P#M50.0 lade, dann klappts. Ist doch eigentlich das gleiche, oder??


Schöne We schonmal! ;)
 
Die Auswertung eines Pointers sieht etwas anders aus:

Code:
// OB1 : Hauptprogramm
 
// DB-POINTER (P#DB200.DBX4.0)
 
      CALL  FB   120 , DB120
       DB_POINTER:=DB200.DBW4
      NOP   0

Code:
// FB120 : DB-POINTER
 
// DB-POINTER
//
// BYTE 0  Datenbausteinnummer
// BYTE 1  Datenbausteinnummer
//
// BYTE 2  Bereichszeiger
// BYTE 3  Bereichszeiger
// BYTE 4  Bereichszeiger
// BYTE 5  Bereichszeiger
 
 
// DB-POINTER
 
      L     P##DB_POINTER               // POINTER
      LAR1
 
      L     W [AR1,P#0.0]               // POINTER DB-Nummer
      T     #DB_NUMMER
 
      AUF   DB [#DB_NUMMER]             // DB öffnen
 
      L     D [AR1,P#2.0]               // POINTER Bereichszeiger
      LAR1  
 
 
// Daten (WORD) kopieren
 
      L     W [AR1,P#0.0]
      T     W [AR1,P#2.0]

http://www.sps-forum.de/showpost.php?p=97069&postcount=6

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK...

Heißt das das die Pointervariable immer aus 6 Byte besteht
Word1: DB Nummer
Doppelword2: Bereichszeiger??

Habe leider keine Aufbau vom Pointer gefunden. Halt nur den vom Anypointer. Hast du sowas?


Danke schonmal.
 
In der SIemens-Hilfe steht es ja eigentlich.

Pointer

Sie können diesen Datentyp nur für die Variablen vergeben, die Sie als Formalparameter vereinbaren.
Mit POINTER legen Sie fest, dass dem vereinbarten Formalparameter beim Aufruf des Codebausteins eine Adresse auf eine Variable als Aktualparameter übergeben werden muss.


Datentyp Länge Format Beispiel
POINTER(Zeiger) 6 Bytes P#x.y
(Variable, deren
Adresse gemeint ist)
Pointeradresse x = Byte y = Bitmit Bereichskennung - z. B. A (Ausgang) P#M50.0
Beispiel in AWL:

Call FB 10, DB110(

:
Eingangs_Var_Addr:= P#M20.0, // Dem FB 10 wird die Adresse des
// Merkers 20.0 für die Bearbeitung
// übergeben.
:
);
 
Zurück
Oben