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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: SCL - Auf Ziel eines ANY-Pointers zugreifen

  1. #1
    Registriert seit
    10.10.2008
    Beiträge
    43
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    mich plagt zur Zeit folgendes Problem: Ich schreibe einen FC mit einem IN-Parameter vom Typ ANY. Nun möchte ich auf den Wert, auf den der Pointer zeigt, zugreifen. Ich weiß im Moment aber absolut nicht, wie ich an den tatsächlichen Wert komme. Ich hatte ja auf eine Art Dereferenzierungs-Operanden (wie der * in C) gehofft, allerdings scheint es sowas "einfaches" nicht zu geben?

    Grund für die Verwendung des ANY-Pointers ist, dass ich beliebige (eigentlich nur WORD, DWORD, INT oder DINT) Werte annehmen können möchte, aber nicht vier einzelne IN-Parameter anbieten möchte. Eine Verwendung des Typs DWORD oder DINT als Eingangsparameter-Typ ist auch nicht machbar, da ich je nach Typ eine andere Teilfunktion ausführen muss. Über das Datentyp-Byte im ANY-Pointer kann ich ja herausbekommen, was es für ein Datentyp ist. Also "was" übergeben wird ist bekannt. Dennoch: WIE komme ich an die Daten dran?

    Auch in AWL scheint der Zugriff auf die Daten auf die ein ANY-Pointer zeigt nicht allzu einfach. Um zielführende Tipps bin ich sehr dankbar, auch wenn es in SCL nicht gehen sollte, dafür aber in AWL!

    Grüße
    Max
    Zitieren Zitieren SCL - Auf Ziel eines ANY-Pointers zugreifen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    du mußt da wie folgt vorgehen :
    - du legst dir eine TEMP-Variable vom Typ ANY an.
    - auf diese Variable weisst du deine IN-Variable vom Typ ANY zu
    - auf diese TEMP-Variable legst du eine AT-Sicht, in der der Struktur-Aufbau des ANY-Pointers abgebildet wird
    - nun schlüsselst du die Einzel-Elemente dieser Sicht auf und bildest dir daraus die Adresse und die Bit-Nummer der Speicher-Adresse
    - des Weiteren ermittelst du den Typ (E, A, M , DB) und baust dir darauf bezogen die indirekte Adressierung auf.
    - nun könntest du auf den Inhalt deiner übergebenen Variablen zugreifen

    Es geht in SCL, das zu machen - ist aber deutlich oversized. Dieser Teil ist doch eher für AWL gedacht ... aber es geht natürlich ...

    Gruß
    Larry

  3. #3
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    Das scheint nicht ganz trivial zu sein.
    Aber mit AT eine Sicht darauf zu setzen scheint zu helfen.
    Guck Dir mal dieses Beispiel an (steht auch zum Download weiter unten auf der Seite): http://support.automation.siemens.co...06&caller=view

  4. #4
    Registriert seit
    10.10.2008
    Beiträge
    43
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi,

    @Larry Laffer: äh ja *dump*, natürlich. Für E, A, M und DB komme ich so mit jeweils eingenen Zugriffen dran. Was ist aber mit ANY-Pointer auf Lokaldaten des aufrufenden Bausteins (was ja dann die "vorherigen Lokaldaten" sind)?

    @JSEngineering: Danke für den Link. Sieht interessant aus.

    Noch eine Info: Mir geht es hauptsächlich um das LESEN der Daten auf die der ANY-Pointer zeigt.

    Gruß
    Max

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo Max,
    da SCL den Adress-Typ "L" und "LV" nicht kennt wird das problematisch - soll heissen : geht nicht.
    Auch ein Blockmove auf deinen internen Speicher käme so nicht mehr in Frage, da durch das Umkopieren schon aus "L" dann "LV" würde und aus "LV" dann "LVV" (und den Typ gibt es ja gar nicht).

    Aus deiner Antwort schliesse ich, dass du in der Sache nicht mehr ganz am Anfang stehst.
    Du wirst also auf alle Fälle da etwas beschränken müssen - oder auf AWL zurückgehen

    Gruß
    Larry

  6. #6
    Registriert seit
    10.10.2008
    Beiträge
    43
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi,

    *seufz* mit so einer Antwort habe ich ja schon gerechnet. Ich frage mich immer wieder *warum* in der Siemens-Programmier-Welt vieles anders und einiges komplizierter ist als in der restlichen Programmier-Welt. Off-Topic: Hat sich denn in Richtung TIA dahingehend etwas getan?

    Grüße
    Max

  7. #7
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    Naja, Pointer (Hochsprache) sind nun einmal eigentlich nicht für Steuerungen gemacht.
    In CoDeSys habe ich nicht einmal einen ANY-Pointer...
    Ich seh es aber auch immer pragmatisch von der anderen Seite: Mit Pointern kann man ganz schnell viel kaputt machen und andere verwirren.
    Wenn man versucht, es ohne Pointer hinzubekommen, ist es meinstens hinterher verständlicher - und fehlerfreier.
    Und sonst mußt Du eben näher an die Hardware gehen, wie Larry schon sagt: AWL...Man
    kann darüber geteilter Meinung sein...

  8. #8
    Registriert seit
    10.10.2008
    Beiträge
    43
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ja, wenn man mit Pointern arbeitet muss man immer wissen, was man tut. Eine SPS ist im Innern auch "nur" ein Rechner, der Maschinencode verarbeitet. AWL ist im Grunde nichts anderes als gepimpter und teilweise vereinfachter Assembler-Code. Dennoch kann man da nicht alles machen wie man es von "normalem Assembler" annehmen kann.

    Auf der anderen Seite kann man sagen, dass jede absolute Adressierung in einem (SPS-)Programm an für sich ein einziges Gepointere ist. Denn ohne (Typ-)Kontrolle durch einen Compiler/Linker kann man da auch ganz schnell ganz viel kaputtschießen. Und das geht meiner Meinung nach in einem SPS-Programm wesentlich einfacher als in einem C-Programm.

    Die Tatsache, dass im Pointer hinterlegt ist, was denn für ein Typ referenziert ist und welche Menge von Daten, finde ich gar nicht so verkehrt. Entsprechend kann man sein Programm "sicher" machen. Warum man nun nicht über "legale Wege" an alle referenzierten Daten kommt, ist mir jedoch wieder schleierhaft. Mir kommt da die Umsetzung der SCL/AWL-Sprachen teilweise recht inkonsequent vor. Aber das ist wirklich arg weit Off-Topic.

    Ich danke euch auf jeden Fall für die Ideen und Kommentare. Falls doch noch eine Info aufkommen sollte, wie man auf referenzierte Lokaldaten zugreifen kann, freue ich mich darüber.

    Viele Grüße
    Max

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo Max,
    du siehst das m.E. "ein bißchen" falsch.
    Es war zuerst AWL da und irgendwann ganz viel später hatte man dann SCL "gebaut". In AWL könntest du den Pointer-Teil des ANY's direkt als Adresse weiterverwenden (über das AR-Register). Du müßtest nur schauen, ob es einen DB gibt und wenn ja den aufrufen - fertig.
    SCL ist mehr dafür geschaffen, mit seinen eigenen Variablen herumzumachen.
    Wenn man das berücksichtigt ist es eigentlich ganz einfach.
    Ich verstehe aber deine Intension - ich hatte auch schon mal über etwas in der Art nachgedacht - es aber dann verworfen weil man an der Schnittstelle eines Bausteins schon durchaus den erwarteten Typ festlegen kann - das machen die meißten Hochsprachen ja auch nicht anders. Wenn man eine Überlagerung erzeugen könnte ...

    Aber naja ... es ist halt wie es ist ...

    Gruß
    Larry

  10. #10
    Registriert seit
    23.11.2008
    Beiträge
    9
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Aber kann bei einem Any-IN nicht nur auf die Adresse (LAR1 p##Any_Eingang) zugegriffen werden, oder ist das in SCL anderst, die Bereichslänge müsste seperat übergeben werden,
    und man hat keine Informationen über die Struktur.

Ähnliche Themen

  1. Antworten: 23
    Letzter Beitrag: 17.07.2014, 21:58
  2. SCL: Auf Bits eines Word zugreifen.
    Von Aksels im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 28.10.2011, 17:10
  3. Antworten: 1
    Letzter Beitrag: 11.03.2008, 09:39
  4. deklarierung eines any pointers
    Von viech im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 29.01.2008, 13:39
  5. Verwendung eines Any-Pointers im FB
    Von merlin im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 17.04.2007, 21:33

Lesezeichen

Berechtigungen

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