ANY-Pointer auf DB größer Byte 8480 möglich?

HarryH

Level-1
Beiträge
142
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe einen DB mit 16160Byte. Das ist ein DB mit Parametersätzen für 99 verschiedene Produkte. Ein Parametersatz hat 160Byte. Der Aufbau ist folgender:

Byte 0- 159 Arbeitsfach
Byte 160- 319 Parametersatz 1
Byte 320- 479 Parametersatz 2
...
Byte 15840-15998 Parametersatz 99
Byte 16000-16158 Sicherungsfach

In meinem S7-Programm habe habe ich nur die Parameter im Arbeitsfach verarbeitet. Wird das Produkt gewechselt, kopiere ich mit dem SFC20 den jeweiligen Parametersatz in das Arbeitsfach. Das mache ich dynamisch, indem ich mir den ANY-Pointer abhängig vom angewählten Produkt auf den entsprechenden Parametersatz berechne. Das sieht so aus:

Code:
// Netzwerk 1
      L     #Produkt                    // Aus aktuellem Produkt und ...
      L     160                         // der Datensatzlänge ...
      *I    
      T     #QuellDW                    // die QUELL-Startadresse berechnen.


// Netzwerk 2
      LAR1  P##Quelle                   // Anfangsadresse des ANY-Pointers in AR1 laden
      L     B#(16, 2)                   // Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]
      L     160                         // zu kopierende Länge (in Byte)
      T     LW [AR1,P#2.0]
      L     300                         // Quelle-DB 
      T     LW [AR1,P#4.0]
      L     P#DBX 0.0                   // Anfangs-Adresse im Quell-DB
      L     #QuellDW
      SLW   3
      +D    
      T     LD [AR1,P#6.0]

// Netzwerk 3
      CALL  SFC   20
       SRCBLK :=#Quelle
       RET_VAL:=#RET_value
       DSTBLK :=P#DB300.DBX0.0 BYTE 160
Nun habe ich festgestellt, das ab Parametersatz 53 (Byte 8480) der Datensatz nicht mehr kopiert wird. Weiß jemand woran das liegen kann? Gibt es irgendwo einen Überlauf? Oder wie kann ich das Netzwerk 2 in welchem ich den ANY-Pointer zusammenstelle anders aufbauen? Bin für jeden Hinweis dankbar!

Gruß HarryH
 
Hallo,
mach doch für #Quell_DW spaßeshalber mal den Datentyp DINT und die Operation davor mit *D ...
Du hast nämlich einen Integer-Überlauf produziert ...

Gruß
LL
 
@Grubba:
Da hast du natürlich Recht ... den hatte ich dann gar nicht mehr gesehen ... ;)
Also ... statt SLW 3 dann vielleicht lieber SLD 3 schreiben ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwie stör ich mich an deiner Addition:
Üblicherweise löse ich es so:
Code:
L #QuellDW
SLD 3
L P#DBX0.0
OD
T DW[AR1,P#6.0]
Gruß
Dieter
 
Zuletzt bearbeitet:
Vielen Dank zusammen!!!

Das SLW war das Problem. Mit SLD funktioniert es einwandfrei!
Vielen DANK!!! :s1: :s1:

Gruß HarryH
 
Zurück
Oben