Step 7 Pointer Adressierung bei S7300

Johannes.Ka

Level-2
Beiträge
5
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
  1. Klassik S7
  2. 317-T 3PN
  3. AWL
Ich habe einen Global Datenbaustein mit einem Array of UDT. Über eine Integer Variable möchte ich auf dessen Index verweisen.
Klassisch funktioniert es. und zwar so:


L #sAktiverSchritt
L 14 // Offset für ein Arrayelement
*I
L 280 // Offset für die Füegen 1 Struktur
+I
SLD 3
AUF "FuegeCont"
LAR1

U DBX [AR1,P#2.0]
= #Ueberpruefen_struct.Execute

Viel einfacher in den nächsten Programmabschnitten wäre aber, das gesamte Strukturelement in eine Statische Variable desselben Typs zu kopieren.
Das bekomme ich aber nicht hin. der BLKMOV frisst meinen Pointer nicht.


L #sAktiverSchritt
L 14 // Offset für ein Arrayelement
*I
L 280 // Offset für die Füegen 1 Struktur
+I
SLD 3
AUF "FuegeCont"
LAR1 P##Zeiger

CALL "BLKMOV"
SRCBLK :=#Zeiger
RET_VAL:=#tRet_Val
DSTBLK :=#sCont

Kann mir jemand weiterhelfen ?

Vielen Dank und Gruß

Johannes
 
1. Musst du das so machen? In SCL kann man auch schon Classic Variablen als Index verwenden.

2. Du musst den Pointer auch wo beschreiben. Nur LAR1 P##Zeiger lädt nur die Anfangsadresse wo #Zeiger liegt.
 
Also ich habe hier ein Beispiel aus einem anderen Programm:

//;
L "Daten schiebenNEU".Daten_an_Etikett // WTnummer
L 120 // Größe Rezept
*I
L 44 // Byte 44
+I
T #Adr_Zeitstemp // Adresse für Zeitstempel
//;
AUF DB [#DB_Daten]
//; Zieladresse auf Zeiger schreiben
//;
LAR1 P##DB_NR_F // Lade Anfangsadresse des Zeigers
L B#16#10 // Syntax-ID
T LB [AR1,P#0.0]
L B#16#2 // Datentyp Byte
T LB [AR1,P#1.0]
L 8 // Anzahl Byte
T LW [AR1,P#2.0]
L #DB_Daten // Datenbausteinnummer
T LW [AR1,P#4.0]
L #Adr_Zeitstemp // Datenbytenummer Zeitanfang
L 8 // laenge in Bits für Datentyp Bytes
*D
L DW#16#84000000 // Bereichs-Cod (84Hex)
+D
T LD [AR1,P#6.0]

//;
CALL "UBLKMOV"
SRCBLK :=#DB_NR_F // QuellDB und länge von PCS
RET_VAL:=#dummy // DW für Fehler
DSTBLK :="GALILEO - SollwertNEU".Zeit2 // ZielDB
//;

Der blau markierte Bereich wird wohl der Aufbau des Pointer sein, oder ?
Allerdings passt das irgendwie nicht zur Hilfe aus step7
 

Anhänge

  • Snag_43a5ee.png
    Snag_43a5ee.png
    52,6 KB · Aufrufe: 12
das was da zusammengebaut wird ist kein pointer sondern ein any-zeiger
siehe hier
und hier
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das bekomme ich aber nicht hin. der BLKMOV frisst meinen Pointer nicht.
Vermutlich bekommst du eine Fehlermeldung, dass #Zeiger vom falschen Datentyp ist?
Siehe die Hilfe zu BLKMOV. SRCBLK und DSTBLK müssen vom Datentyp ANY sein --> #Zeiger muss ein ANY in TEMP sein

Viel einfacher in den nächsten Programmabschnitten wäre aber, das gesamte Strukturelement in eine Statische Variable desselben Typs zu kopieren.
1) Du willst nur ein Element des globalen Array of UDT in eine lokale Variable kopieren?
Das ist ziemlich einfach mit SCL zu realisieren:
Code:
sMyLocalUDT := "FuegeCont".sArray[sAktiverSchritt];

In AWL muss beim Basteln des ANY-Pointers für BLKMOV die Anfangsadresse des sArray und die Länge des UDT als "magic"-Konstanten manuell in den Code eingetragen werden. Hier der Code (ungetestet). #tempSrcANY muss eine ANY-Variable in TEMP sein
Code:
LAR1 #tempSrcANY   // AR1: Hilfspointer auf den ANY-Pointer tempSrcANY auf das Quell-Strukturelement

L W#16#1002        // ANY: Syntax-ID + Datentyp Byte
T LW [AR1,P#0.0]

AUF "FuegeCont"
L DBNO             // DB-Nummer vom DB "FuegeCont"
T LW [AR1,P#4.0]   // ANY: DB-Nummer

L 14               // Länge des UDT in Byte
T LW [AR1,P#2.0]   // ANY: Wiederholfaktor
L #sAktiverSchritt
*I
L 280              // Anfangsadresse des Arrays im DB "FuegeCont"
+D
SLD 3              // Byteadresse --> Bitadresse P#b.x
L P#DBX0.0         // Bereichskennung "DB" (16#84000000)
OD
T LD [AR1,P#6.0]   // ANY: Bereichsadresse mit Bereichskennung

CALL "BLKMOV"
 SRCBLK :=#tempSrcANY
 RET_VAL:=#tRet_Val
 DSTBLK :=#sCont

2) Muss das wirklich eine statische Variable (im Instanz-DB) sein? Oder ist eine Variable in TEMP auch möglich?
Wenn du einen Pointer oder ANY-Pointer auf die statische UDT-Variable in der Instanz eines multiinstanzfähigen FB brauchst (z.B. zum Zusammenbasteln eines ANY-Pointers), dann muß zu der Adresse in der Instanz noch der Multiinstanz-Offset aus AR2 addiert werden. Wenn die Variable in TEMP liegt, dann entfällt dieser Offset.
 
Zurück
Oben