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

Ergebnis 1 bis 9 von 9

Thema: SCL: Pointer Offset innerhalb von FB

  1. #1
    Registriert seit
    15.10.2015
    Beiträge
    7
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ich bin recht unerfahren in der SPS/SCL Programmierun leider stehe ich mal wieder auf dem Schlauch.

    VAR_INPUT

    x : BYTE;

    END_VAR

    nun beschalte ich das ganze von Außen mit x := P#DB1000.DBX600.0 (z.B.) was soweit auch funktioniert

    Gibt es eine einfache Möglichkeit innerhalb des FB's (SCL) über die Variable x auf zb. DB1000.DBX650.0 zuzugreifen quasi als Offset ?

    Ich nutze S7-400, SCL V5.3 + SP6 + Upd2
    Zitieren Zitieren SCL: Pointer Offset innerhalb von FB  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Der FB erhält am Input x eine Kopie von irgendwas - er kann garnicht wissen, daß da DB1000.DBB600 oder P#DB1000.DBX600.0(?) oder eine Konstante oder sonstwas dransteht.

    Ergo: es geht nicht. Es würde nur gehen, wenn Du x als POINTER oder ANY übergibst.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    britz (19.10.2015)

  4. #3
    britz ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.10.2015
    Beiträge
    7
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ok, ich hatte wieder einen Denkfehler ich hab quasi nur den Wert übergeben nicht aber die Adresse

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Korrekt. Die Parameterübergabe ist call-by-value (pass-by-value)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #5
    britz ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.10.2015
    Beiträge
    7
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vom Verständnis her bin ich jetzt weiter, nur von der Syntax bzw. Umsetzung nocht weit entfernt
    Es gibt viele Forumseinträge zu dem Thema aber leider verwirren die mich eher noch mehr
    Falls jemand ein Beispiel für mein Problem parat hat wäre das super !

  7. #6
    Registriert seit
    16.04.2014
    Ort
    Hamburg
    Beiträge
    49
    Danke
    3
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Du könntest es mit indirekter Adressierung machen.
    Wenn du an deine Funktion die DBNr. und das Byte übergibst, auf das du zugreifen möchtest. Kannst du so drauf zugreifen:

    #Var_Bool := WORD_TO_BLOCK_DB(1000).DX(IDX := 650, BIT := 0);


    Hier wird es gut erklärt:

    http://www.bytex.it/Article/eng/SCL-...1-and-V12.html

  8. #7
    britz ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.10.2015
    Beiträge
    7
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Mal angenommen ich nehme an:

    FUNCTION_BLOCK FB2000

    VAR_INPUT

    x : ANY;

    END_VAR

    VAR_TEMP

    i : INT;

    END_FUNCTION_BLOCK

    Was ist dann die Beschaltung von außen für x := .... wenn ich auf einen bestimmten Bereich im DB zugreifen und den Wert in i speichern möchte
    Später möchte und dann mithilfe des Pointers an bestimmte Stellen des Datenbausteins springen relativ zur position des Pointers

    BTW: S7 - Version 5.5 SP4

  9. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von IckeSI Beitrag anzeigen
    #Var_Bool := WORD_TO_BLOCK_DB(1000).DX(IDX := 650, BIT := 0);
    Solche "Schweinereien" (*) würde ich Einsteigern lieber gar nicht erst zeigen, zumal bei den neueren SPS (S7-1200/S7-1500) solche Zugriffe nur noch mit zusätzlichen Klimmzügen möglich sind. Die Zeichen der Zeit stehen auf voll symbolische Adressierung.

    (*) Solche Speicherzugriffe sind über die Referenzdaten nicht zu finden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #9
    Registriert seit
    16.04.2014
    Ort
    Hamburg
    Beiträge
    49
    Danke
    3
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi Harald,

    Dann halte ich mich mal zurück


    aber über Any wird es nicht gerade einfacher.
    Da hat er keine Kontrolle was rein kommt ob db, E, A oder M. bzw. Muss alles abfragen.
    Über die dbNr und ByteNr ist es noch verständlich was passiert.

    Kann aber bei der V5.5 Syntax leider auch nicht helfen.

    Gruß Thomas


    Geändert von IckeSI (19.10.2015 um 14:38 Uhr)

Ähnliche Themen

  1. TwinCAT 2 Dateien innerhalb von Funktionen beschreiben?
    Von Paddel im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 14.09.2014, 22:31
  2. Any-Pointer zum Kopieren von Strings (SCL)
    Von volu im Forum Programmierstrategien
    Antworten: 7
    Letzter Beitrag: 15.06.2012, 10:00
  3. Antworten: 14
    Letzter Beitrag: 14.02.2012, 15:29
  4. Pointer offset von Aussen vorgeben
    Von Pascher im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.05.2009, 17:07
  5. Pointer und Offset
    Von SPSTorsten im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.01.2009, 21:42

Stichworte

Lesezeichen

Berechtigungen

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