Dynamischer Pointer???

klauserl

Level-2
Beiträge
246
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
HAllo Leute!!!:confused:
Steh auf dem Schlauch.
Ich soll bei einem bestehenden (ist so etwas wie ne Rezeptur) Programm zu jeder Rezeptur gewisse Werte (kwh,Bh,Durchsatzleistung...) zuweisen.
Habe folgendes Problem: Ich will mit SFC20 Daten vom DB10 in den DB20 schieben.
Mein Problem ist aber das ich immer gewisse Datenbereiche sowohl beim lesen als auch beim schreiben ansprechen soll. D.h. Wenn Rezeptur Nr:1 (liegt als Int Zahl vor) dann P#DB10.DBX 0.0 Byte 4.
Mit jeder erhöhung der Rezeptur soll der Pointer um den vorgegebenen Datenbereich (hier z.B. 4Byte) weiterspringen.
Wär für jede Hilfe sehr DANKBAR.

L.G.
 
das geht mit dem adressregister....

.....etwa so, allerdings ohne sfc20:

Beispiel:

Rezeptnummer=int


L rezeptnummer
L 12
*I //jedes rezept hat 12 Byte
SLW 3 //wegen dimension, keine bitadresse
LAR1 //Adressregister laden



Auf DB10
L DBD[ar1, P#0.0] ersten 4 Bytes kopieren
T DB20.dbd0

Auf DB10
L DBD[ar1, P#4.0] zweiten 4 Bytes kopieren
T DB20.dbd4

Auf DB10
L DBD[ar1, P#8.0] dritten 4 Bytes kopieren
T DB20.dbd8


das wars schon...
 
Hallo!

Du kannst das ganze über einen ANY - Pointer den du dir selber baust lösen:

Code:
//ANY Pointer für Datentypen
      L     P##Temp_ANY_Pointer_in
      LAR1  
      L     B#16#10                     //Syntax ID für Step7
      T     LB [AR1,P#0.0]
      L     B#16#2                      //Wert für TYP: 1 Bool, 2 Byte, 3 Char, 4 Word, 5 Int, 6 Dword, 7 Dint, 8 Real, 9 Date, A TOD, B Time, C S5Time, E DT, 13 String
      T     LB [AR1,P#1.0]
      L     4                        //Anzahl der zu Übertragenden Daten
      T     LW [AR1,P#2.0]
      L     10                      //Datenbausteinnummer
      T     LW [AR1,P#4.0]
      L     P#DBX 0.0                   //Bereichszeiger, in diesem Fall vom ersten Bit an. Für deine 2.Rezeptur brauchst du dann  P#DBX 4.0 
      T     LD [AR1,P#6.0]
 
L     P##Temp_ANY_Pointer_out
      LAR1  
      L     B#16#10                     //Syntax ID für Step7
      T     LB [AR1,P#0.0]
      L     B#16#2                      //Wert für TYP: 1 Bool, 2 Byte, 3 Char, 4 Word, 5 Int, 6 Dword, 7 Dint, 8 Real, 9 Date, A TOD, B Time, C S5Time, E DT, 13 String
      T     LB [AR1,P#1.0]
      L     4                        //Anzahl der zu Übertragenden Daten
      T     LW [AR1,P#2.0]
      L     20                      //Datenbausteinnummer
      T     LW [AR1,P#4.0]
      L     P#DBX 0.0                   //Bereichszeiger, in diesem Fall vom ersten Bit an. Für deine 2.Rezeptur brauchst du dann  P#DBX 4.0 
      T     LD [AR1,P#6.0]
 
 
 CALL  SFC   20
       SRCBLK :=#Temp_ANY_Pointer_in
       RET_VAL:=MW0
       DSTBLK :=#Temp_ANY_Pointer_out

die Pointer deklarierst du als Temp Variable mit den Datentyp ANY.
Du kannst dir ja den Bereichszeiger auch noch selbst bauen. Also wenn du noch eine Variable Deklarierst mit #Bereichszeiger (Dword) dann kannst du im Vorfeld die Adresse berechnen und in den Bereichszeiger schreiben. (siehe mertens2 anfang)

godi
 
Zurück
Oben