Übergabe von Parametern

Thomas86

Level-1
Beiträge
40
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß
 
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ß
 
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 ......
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß
 
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.
Code:
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
 
noch ein paar Fragen

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Code:
      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.

Code:
  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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß
 
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ß
 
Zurück
Oben