TIA Absolutadresse eines Formalparameters ???

kuv-soma

Level-1
Beiträge
3
Reaktionspunkte
0
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zurück
Oben