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

Ergebnis 1 bis 4 von 4

Thema: Absolutadresse eines Formalparameters ???

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

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich benötige dringend die "Absolutadresse" (z.B.: E 123.4) aus einem "Formalparameter" (z.B.: #InputBit ).

    Früher unter S7-Classic ging das mit pointer "P#":
    ...
    L P##InputBit
    T TempDWord // Lokale Variable
    ...
    Dann konnte man sich aus dem Anypointer ("TempDWord") einen String basteln und vewenden (z.B. "E 123.4" )

    Bei TIA mit S7-1500 geht das nicht mehr !!!

    Könnte ich das evtl. mit SCL machen ?

    Brauche bitte Eure Hilfe.

    Vielen Dank
    Klaus
    Zitieren Zitieren Absolutadresse eines Formalparameters ???  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.316
    Danke
    932
    Erhielt 3.331 Danke für 2.689 Beiträge

    Standard

    Kann es sein, daß Du die Adresse des Aktualparameters meinst?
    Diese "Schweinerei" ging auch früher schon nur zufällig, je nachdem ob Du den FC in AWL oder FUP/KOP aufgerufen hast. Solche uralten und unsauberen Programmiermethoden würde ich nicht zur S7-1500 mitschleppen.

    Wozu brauchst Du das "dringend"?
    Was willst du mit der "Adresse" anfangen, wenn der Aktualparameter aus einem "optimierten" DB stammt?

    Wenn Du die Adresse eines Aktualparameters brauchst, dann deklariere den Formalparameter als POINTER oder ANY.
    Wenn Du aus der Adresse einer Variablen die Adressen anderer Variablen berechnen willst, dann übergebe STRUCT, UDT oder ARRAY.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    kuv-soma ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.02.2012
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Servus,

    danke für den Hinweis mit der "Schweinerei" Das ist uns bewusst.

    Dringend ist das Ganze, weil:
    Eigentlich laut Siemens mit dem Update-4 das mit dem "P##Input_bit" wieder gehen sollte.
    Geht aber nicht! So. Und nun ?

    Zur Funktion:
    Seit Urzeiten (mit S7) verwenden wir Funktionsbausteine und Funktionen zur Visu-Kopplung zur HMI.
    An die FCs werden (nur einmal im Programm) Eingänge (E 123.4) angebunden, auf einen beliebiges Bit (Merker, DBX) zur eigentlichen Verwendung durchgeschleift und für die HMI in einen String aufbereitet.
    Die HMI benutzt zur Anzeige diesen String mit dem entsprechenden Zustand (Ein/Aus). z.B.: Rechteckiges Kästchen mit dem Inhalt "E 123.4" und der Farbe des Zustandes.
    Benefit: Ändert man im Programm den Eingang (E 123.4 auf E123.5) , stimmt automatisch die Anzeige in der HMI. Toll !!!

    Jetzt stellen wir auf TIA um, und brauchen das wieder.

    Noch eine Idee dazu ? - Danke.

    Gruß
    Klaus

  4. #4
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Parameterübergabe auf einer 1200/1500 läuft bei FC ganz anders als bei 300/400.
    Bei der 300/400 ist im Aufrufer hinter dem UC eine Liste von 32-Bit Pointern. Im Gerufenen wird mittels "indirekter" Adressierung der Wert des n. Parameters in den Akku oder das VKE geladen. Deswegen geht das auch nur bis 32 Bit breiten Datentypen. Wenn der FC-Parameter mit einer Konstante versorgt werden soll, dann muss daher im L-Stack des Aufrufers eine Kopie der Konstanten erzeugt werden. Weil es sich um einen 32 Bit Pointer handelt, kann man nicht direkt auf DB zugreifen, denn der DB muss gleichzeitig im DB-Register geöffnet sein ... deswegen des Wertes im L-Stack. Will man auf eine Struktur übergeben, dann ... ach alles sehr sehr kompliziert.

    Ein L P##Input_bit liefert den 32-Bit Pointer des n.Parameters im Akku 1 ab. Der Aufbau ist wie im AR. D.h. man kann sich jetzt 8 bits für den Bereich (P,E;A;M;DB; ...) und 24 Bit die aus 8*Byte+Bit bestehen kratzen.

    Bei der 1200/1500 werden alle einfachen Datentypen (bis 64Bit) mittels eines speziellen "Stack" als Wert übergeben. Das ist nicht der L-Stack. Ich weiß aber nicht was es ist, und S. verrät nix. Breiteres wird mittels eines Zeigers übergeben. Dieser Zeiger kann aber nur auch auf optimierte DB zeigen, das ist also weder der bekannte POINTER noch der beliebte ANY, sonder "was besseres" -- ein VARIANT -- über dessen Aufbau veraten sie aber auch nix. Der Zugriff mittels dieser Zeiger auf optimierte DB ist deutlich schneller als der in den absolut adressierten Merkerbereich. Aber was soll denn nun L P##Input_bit machen. Ein Stackadresse abliefern? Das bringt dir nix, denn du willst ja den Eingang haben. Und wenn es mehr als 32 Bits sind, dann brächtest du einen Zeiger, der fetter sein dürfte als der ANY. Passt also auch nicht in einen Akku.

    So geht das nicht. Schon mal was von GetSymbolName() und GetSymbolPath() gehört.
    Wenn du am Aufruf
    Code:
    myFC(in1:="DBA".b.c)
    hast, dann kannst innerhalb von myFC mit
    Code:
    myWString := GetSymbolName(#in1)
    das "DBA".b.c in den myWString schicken.
    Irgendwo ist da noch eine Längenangabe ... am besten mal die Hilfe konsultieren

    Damit lassen sich deutlich schönere Ausgaben produzieren als auf 300/400.

    'n schön' Tach auch
    HB

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 29.06.2015, 16:06
  2. Antworten: 1
    Letzter Beitrag: 26.01.2015, 06:11
  3. Antworten: 15
    Letzter Beitrag: 04.06.2014, 12:06
  4. Antworten: 11
    Letzter Beitrag: 19.05.2014, 10:35
  5. Aufruf eines Date_and_Time eines DB's
    Von hank12 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 08.07.2009, 10:33

Stichworte

Lesezeichen

Berechtigungen

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