PDA

View Full Version : Übergabe von Parametern



Thomas86
09.04.2007, 19:07
Hallo zusammen!

Ich habe eine Frage zu Any-pointern.
Ich muss eine Funktion entwerfen, die "auf Knopfdruck" nach Eingabe
von Adresse, Datenbausteinnummer und Datentyp (auf einem Display)
einen Wert aus einem Datenbaustein ausliest. Dieser Wert soll angezeigt werden und veränderbar sein.

In einem anderen Post habe ich bezüglich Zeiger auf einen Bereich in einem Datenbaustein folgendes gesehen:

L B#16#10 //10h für s7
T LB 0
L B#16#02 //Typ BYTE
T LB 1
L 8 //Anzahl (Wiederholungsfaktor)
T LW 2
L 33 //Datenbaustein
T LW 4
L 14 //Anfangsadresse
SLD 3 //Pointer bauen
T LD 6
L B#16#84 //Speicherbereich (hier DB)
T LB 6

Kann ich dieses Beispiel so ändern, dass ich anstelle der Datenbausteinnummer
einen Eingang angebe, an welchem ich dann eine beliebige Nummer eingeben kann?
Oder bin ich als blutiger Anfänger jetzt auf dem völlig falschen Pfad?

Danke schonmal!
Gruß

Ralle
09.04.2007, 19:56
Das geht schon, lies am Besten mal das hier, ist prima aufbereitet von Volker:

http://www.sps-forum.de/showthread.php?t=12923

Antonio
09.04.2007, 22:43
Ist es immer der selbe Datenbaustein? wenn ja, kann man da auch mit Multiplex trixen. Ist dann wahrscheinlich weniger aufwand

Thomas86
10.04.2007, 13:12
Danke für die Antworten..
Es ist nicht immer derselbe Datenbaustein, deshalb fällt das mit Multiplex wohl weg. Wenn ich es nach der oben genannten Variante mache, bekomme ich also den Wert an der gewünschten Stelle angezeigt. Wie schaffe ich es dann, diesen zu verändern?

Gruß

volker
10.04.2007, 14:55
so wie ich das sehe brauchst du gar keinen any-zeiger sondern kommst mit einem pointer aus.
oder musst du daten lesen/schreiben die länger als ein dword sind?

hast du dir den oben erwähnten beitrag angesehen?
und beherzigt was dort auch steht ?
Schaut euch dazu vorher dieses Thema an ......

Thomas86
11.04.2007, 11:40
Hallo!
Habe mir deinen Thread gut durchgelesen.. Ist wirklich sehr hilfreich, danke.
Ich dachte ich müsste den any-zeiger benutzen, da ich auch den Datentyp auf dem Display angeben muss (byte oder word)?
Habe leider wenig Hintergrundwissen und bis jetzt nur in Theorie Büchern gelesen.. Mit dem Programmieren selbst habe ich, bis auf ein paar einfache Aufgaben, kaum Erfahrung. Bin deshalb glücklich über Hilfe zu einem Ansatz!

Gruß

volker
11.04.2007, 12:31
du hast recht. wenn du die länge des typs ändern willst benutzt du am besten den any zeiger.

ich weiss ja nicht genau wofür du das brauchst, aber ich habe da was was der sache mindestens ganz nahe kommt.

Status / Steuern Variabel für HMI-Geräte, die diese Funktion im Gerät nicht
integriert haben. (z.B. Siemens OP170)

Status von: E, A, M, D, T, Z
Steuern von: A, M, D

Steuern ist nur möglich, wenn Status gestoppt.
Steuern von Zeiten und Zählern ist nicht möglich.

Es werden alle angezeigten Variablen gesteuert.
Wenn eine Variable nicht gesteuert werden soll,
das Auswahlfeld Variablentyp auf '---' setzen.

(c) Februar 2007 by V.Lischnewski, www.Lischis-Home.de

findest du auf meiner hp unter sps/protool/op170_status.zip

Thomas86
13.04.2007, 14:17
Vielen Dank für die Antworten.

Habe noch ein paar grundsätzliche Fragen, die ihr mir sicherlich leicht beantworten könnt:
1. Ich finde in meinen Unterlagen zum Bau des Any-Pointers keine Information über die Angaben "LB" bzw. "LW" und "LD". Was bedeutet das?


2. Wie kann ich eine Fallunterscheidung im Bau eines Any-Pointers integrieren. Ich muss unterscheiden ob eine Byte- oder Wordeingabe erfolgt.
(Wenn ich an einem festgelegten Eingang z.B. W für Word oder B für Byte eingebe, muss ich erreichen, dass der Any Pointer B#16#02 oder B#16#04 bei der Angabe des Datentyps annimmt.)

3. Ist die Anzahl (Wiederholungsfaktor) bei Byte immer 8 und bei Word immer 4 ?


Grüße

Ralle
13.04.2007, 16:43
1. Ich finde in meinen Unterlagen zum Bau des Any-Pointers keine Information über die Angaben "LB" bzw. "LW" und "LD". Was bedeutet das?


LB = Lokalbyte
LW = Lokalwort
LD = Lokaldoppelwort

Das bezieht ich auf die Temp-Variablen eines FB/FC. Du kannst hiermit direkt auf die Temp-Daten eines Bausteins zugreifen, auch ohne Rücksicht auf die im Tempbereich angelegte Variablenstrucktur, bzw. ebend auch über Any-Zeiger.



2. Wie kann ich eine Fallunterscheidung im Bau eines Any-Pointers integrieren. Ich muss unterscheiden ob eine Byte- oder Wordeingabe erfolgt.
(Wenn ich an einem festgelegten Eingang z.B. W für Word oder B für Byte eingebe, muss ich erreichen, dass der Any Pointer B#16#02 oder B#16#04 bei der Angabe des Datentyps annimmt.)


Ok, ich hab mal 3 Eingänge genommen, weil ich einfach nur mit 3 Boolean-Variablen arbeiten wollte. Das sah dann so aus:


U #In_Byte
SPB B1

U #In_Word
SPB W1

U #In_DWord
SPB D1

SPA ERRO
Es geht natürlich auch über einen Eingang und du arbeitest dann mit Vergleichern und springst zu den Marken B1, W1, D1. Dort lädst du dann den entsprechenden Code für den Any-Zeiger.



3. Ist die Anzahl (Wiederholungsfaktor) bei Byte immer 8 und bei Word immer 4 ?


Der Wiederholungsfaktor bezieht sich auf den von dir in Punkt 2 gewählten Datentyp und hängt von der Länge der Daten ab, auf die der Zeiger verweisen soll. Im Beispiel in der FAQ werden dann 8 Byte Daten vom SFC20 umkopiert.


CALL SFC 20
SRCBLK :=#myZeiger
RET_VAL:=MW200
DSTBLK :=P#DB10.DBX 4.0 BYTE 8

Aber klar, 8 Byte sind 4 Worte, wenn also ein Any-Zeiger 8 Byte adressiert und ein anderer Worte adressiert, müssen es 4 Worte sein, damit es paßt.

Unregistrierter gast
13.04.2007, 16:45
Aber klar, 8 Byte sind 4 Worte, wenn also ein Any-Zeiger 8 Byte adressiert und ein anderer Worte adressiert, müssen es 4 Worte sein, damit es paßt.

Du kannst antürlich auch 10, 20 oder 30 Byte / Worte adressieren, oder 128 bool, das geht auch.

volker
13.04.2007, 19:59
Ich muss unterscheiden ob eine Byte- oder Wordeingabe erfolgt.
wenn über ein hmi gerät ist nimm ein listenfeld mit den einträgen
wert=1 text=byte
2 word
4 dword

so hab ich das bei beim oben erwähnten projekt (hast du dir das mal angesehen?) gemacht.
der wert des listenfeldes entspricht dann dem wiederholungsfaktor. vorrausgesetzt du arbeitest im any mit mit byte.

Thomas86
14.04.2007, 18:20
Vielen Dank für die ausführlichen Antworten!

Ich habe mir das Projekt durchgelesen, allerdings trotz großer Bemühungen nicht wirklich alles verstanden.

Werde nun versuchen, eure Informationen umzusetzen.
Falls ich noch Fragen habe, weiß ich ja an wen ich mich wenden kann.

Gruß

Thomas86
16.04.2007, 11:54
Hallo!

Habe das Programm soweit ich konnte angefangen. Komme aber schon wieder nicht weiter.

Wie kann ich den Wert, auf den der Any-Pointer zeigt, an einen Ausgang übergeben?

Anschließend muss ich diesen Wert auch verändern können. Ist es richtig, dass hier…..:

L B#16#10 //10h für s7
T LB 0
L B#16#02 //Typ BYTE
T LB 1
L 8 //Anzahl (Wiederholungsfaktor)
T LW 2
L 33 //Datenbaustein
T LW 4
L 14 //Anfangsadresse
SLD 3 //Pointer bauen
T LD 6
L B#16#84 //Speicherbereich (hier DB)
T LB 6


……der Wert des Pointers in LD 6 gespeichert wird?

Wenn es so ist, kann ich dann einfach den Wert eines Eingangs laden und ihn an LD 6 transferieren, sodass er dann an der Stelle des ursprünglichen Werts steht?

Bin für jede Antwort dankbar, habe echt Probleme damit den Einstieg in diese Programmiersprache zu finden.


Gruß

Thomas86
17.04.2007, 08:57
Hat sich erledigt! Habe eine Möglichkeit gefunden.

Gruß