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

Ergebnis 1 bis 10 von 10

Thema: ANY-Format auf Doppelwort?

  1. #1
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard


    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!
    Zitieren Zitieren ANY-Format auf Doppelwort?  

  2. #2
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    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.

  3. #3
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Du könntest Deine IN-Variable vom Datentyp ANY in eine TEMP-Variable vom Datentyp ANY kopieren.

    http://www.sps-forum.de/showpost.php...7&postcount=10

    Gruß Kai

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    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.
    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

  5. #5
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    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...?

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    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.
    Geändert von Ralle (05.10.2007 um 15:09 Uhr)
    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

  7. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Jordy (06.10.2007)

  8. #7
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    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

    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!

  9. #8
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    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...69&postcount=6

    Gruß Kai

  10. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    Jordy (06.10.2007)

  11. #9
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    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.

  12. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.
    :
    );
    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. Ein Bit aus Doppelwort finden
    Von Flo im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 15.04.2010, 23:37
  2. S7/300 Störmeldung Doppelwort
    Von berndi9196 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 11.08.2008, 18:10
  3. Ein Bit im Doppelwort ändern (SCL)
    Von M-Arens im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 14.03.2007, 15:29
  4. Doppelwort im DB schieben
    Von Revave im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 07.12.2005, 10:49
  5. Differenz von Doppelwort
    Von Anonymous im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 19.07.2004, 10:01

Lesezeichen

Berechtigungen

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