Array in Temp laden

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es wird gut möglich sein dass mein Problem nicht nur einmal aufgekommen. Habe in der Suche aber nichts Passendes gefunden.

Code:
Auf  BlockDB // block DB
L DBB  0
T #TempArray[0]
L DBB  1
T #TempArray[1]
.
.
.
Usw.

Es ist ein Array[0..49] of byte welches ich indirekt ansprechen möchte und in ein temparray[0..49] laden möchte. Meine Methode funktioniert zwar, ist aber sehr viel Handarbeit. Muss den Lade- und Transferbefehl ja 50 mal tippen. Gibt es ja was eleganteres? Läuft es auf Adressregister mit Schleife und so hinaus ?

Oder kann ich es einfach blockmoven:

Also so ungefähr(bei mir funktioniert so nicht)

Code:
SRCBLK: P#L BlockDB.DBB0.0 BYTE 50
RET_VAL: #ret_val
DSTBLK: #TempArray
Grüße
 
Wenn der 2. Codeschnipsel den gutan alten SFC20 darstellt muss auch an DSTBLK ein Pointer.

Also musst Du nur noch einen Zeiger basteln der auf Dein #TempArray zeigt.

hängt die Problemstellung mit http://www.sps-forum.de/showthread.php?49917-array(IN)-auf-any(in_out) zusammen?


Hängt (eigentlich) nicht mit der einen Problemstellung zusammen. "Gebs" tipp scheint mir ein wenig aufwendiger, deshalb würde ich es mit dem blkmov erschlagen (soweit möglich)

Code:
SRCBLK: P#L BlockDB.DBB0.0 BYTE 50
RET_VAL: #ret_val
DSTBLK: #TempArray

der DSTBLK bräuchte also auch einen Pointer. Leider nimmt er den SLCBLK so auch nicht(wird rot). irgendwas muss da ja noch falsch sein. wo kann ich da nachgucken, wie man das korrekt adressiert ?
 
Hallo

CALL "BLKMOV"
SRCBLK :=P#DB123.DBX0.0 BYTE 50
RET_VAL:=#tInt
DSTBLK :=#TempArray

mfg Karl
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Limette,

wenn ich es richtig deute, willst Du Deinen Quell-DB als IN-Variable übergeben und an den SFC 20 weiterleiten.
Das geht leider nicht. Es bleibt Dir nichts anderes übrig, als den Pointer "von Hand" zusammenzubauen:
Code:
// Pointer 1 
L     B#16#10                     // 10h für S7       
T     LB    0 
L     B#16#2                      // 02h für BYTE 
T     LB    1 
L     50                             // 50 Bytes 
T     LW    2 
AUF   #Block_DB                // Block-DB öffnen
L     DBNO                         // DB-Nummer 
T     LW    4 
L     0                              // Anfangsadresse   
SLD   3 
OD    DW#16#84000000     // Speicherbereich (DB) 
T     LD    6  

CALL  "BLKMOV"        
   SRCBLK :=#Pointer1        
   RET_VAL:=#TempRetVal        
   DSTBLK :=#TempArray
Dabei musst Du #Pointer1 als 1. Eintrag (TYP ANY) in den Temp-Variablen deklarieren!

Probier es mal aus. So kompliziert ist es nicht.

Grüße
Gebs
 
das ist natürlich gut, wenn es nicht so kompliziert ist. bei mir ist folgendes schon aufgetaucht:

Code:
AUF   #Block_DB                // Block-DB öffnen
L     DBNO                         // DB-Nummer 
T     LW    4

Die DB-Nummer habe ich schon ein netzwerk davor herausgefunden und es in #dbnummer gespeicher.

wenn ich nun

Code:
L #dbnummer
T LW 4

eingebe. wird nachdem speichern komischerweise:

Code:
L #dbnummer
T #dbnummer


an was liegt sowas ?




Hallo Limette,

wenn ich es richtig deute, willst Du Deinen Quell-DB als IN-Variable übergeben und an den SFC 20 weiterleiten.
Das geht leider nicht. Es bleibt Dir nichts anderes übrig, als den Pointer "von Hand" zusammenzubauen:
Code:
// Pointer 1 
L     B#16#10                     // 10h für S7       
T     LB    0 
L     B#16#2                      // 02h für BYTE 
T     LB    1 
L     50                             // 50 Bytes 
T     LW    2 
AUF   #Block_DB                // Block-DB öffnen
L     DBNO                         // DB-Nummer 
T     LW    4 
L     0                              // Anfangsadresse   
SLD   3 
OD    DW#16#84000000     // Speicherbereich (DB) 
T     LD    6  

CALL  "BLKMOV"        
   SRCBLK :=#Pointer1        
   RET_VAL:=#TempRetVal        
   DSTBLK :=#TempArray
Dabei musst Du #Pointer1 als 1. Eintrag (TYP ANY) in den Temp-Variablen deklarieren!

Probier es mal aus. So kompliziert ist es nicht.

Grüße
Gebs
 
Das liegt daran, wie Du Deine Variablen deklariert hast.
Hast Du den Pointer als 1. Eintrag in Deiner Variablentabelle?
Stell doch mal Deine Variablendeklaration hier rein.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das liegt daran, wie Du Deine Variablen deklariert hast.
Hast Du den Pointer als 1. Eintrag in Deiner Variablentabelle?
Stell doch mal Deine Variablendeklaration hier rein.

Grüße
Gebs

habs jetzt einfach den any ans ende meiner Temp gestellt und die adressen angepasst. so müsste es ja gehen. muss es nur noch kurz testen.
kann ich der problematik eigenltich entgehen, wenn ich alles ins register schreibe oder gibt es da auch tretminen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jo, wenn Du mit

LAR1 ##Pointer1

Dein Adressregister versorgst, sollte es auch bei späteren Änderungen der Variablendeklaration keine Probleme geben.

Grüße
Gebs
 
kurze Frage dazu:

willst Du im Endeffekt ein Array ins andere kopieren? (ist Deine Quelle auch ein Array?)
ist der Baustein den du schreibst ein FB oder ein FC?
hast Du SCL zur Verfügung?
 
Zurück
Oben