Bereichslängenfehler bei indirekter Adressierung

peraho

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

habe ein problem beim Schreiben in einen DB. Die ersten 5 Datensätze werden erfolgreich geschrieben und beim nächsten bekomme ich einen Bereichslängenfehler an der Adresse 94 (Bitzugriff). Ich habe schon versucht, dass ganze zu debuggen komme aber nicht dahinter wo der Fehler liegt.

Wäre super, wenn mir jemand auf die Sprünge helfen kann.

Hier mal ein Auszug aus dem Programm:

// Flanke neues Teil an Laser --------------------
U "Deb_Daten_schreiben"
FP "FP_Daten_schreiben"

U "FP_Daten_schreiben"
S M 200.0

// Neues Teil an Laser abfragen ------------------
U "FP_Daten_schreiben"
SPB M012
SPA M013

M012: NOP 0
//Datum aktualisieren ---------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
SLD 3
LAR1

L #Datum
T DBW [AR1,P#0.0]

// Uhrzeit aktualisieren -------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 2
+I
SLD 3
LAR1

L #Uhrzeit
T DBD [AR1,P#0.0]

// Stueckzaehler erhoehen -----------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 6
+I
SLD 3
LAR1

L "DB_Daten_IO_Teile".Stueckzaehler
T DBW [AR1,P#0.0]

// Angewaehlte Schicht aktualisieren ------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 12
+I
SLD 3
LAR1

L 3
T DBW [AR1,P#0.0]



// USS 30KHz IO --------------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 14
+I
SLD 3
LAR1

U DB4.DBX 9.5
SPB M040
SPA M041
M040: NOP 0
L DBW [AR1,P#0.0]
L 2#100000000
OD
T DBW [AR1,P#0.0]
M041: NOP 0

// USS 40KHz IO --------------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 14
+I
SLD 3
LAR1

U DB4.DBX 17.5
SPB M042
SPA M043
M042: NOP 0
L DBW [AR1,P#0.0]
L 2#1000000000
OD
T DBW [AR1,P#0.0]
M043: NOP 0

// WSS IO ------------------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 14
+I
SLD 3
LAR1

U DB4.DBX 21.5
SPB M044
SPA M045
M044: NOP 0
L DBW [AR1,P#0.0]
L 2#10000000000
OD
T DBW [AR1,P#0.0]
M045: NOP 0

// Widerstand IO -----------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 14
+I
SLD 3
LAR1

U DB4.DBX 25.5
SPB M046
SPA M047
M046: NOP 0
L DBW [AR1,P#0.0]
L 2#100000000000
OD
T DBW [AR1,P#0.0]
M047: NOP 0


// Widerstandswert
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 16
+I
SLD 3
LAR1

AUF "DB_Schieberegister"
L DBD 60

AUF "DB_Daten_IO_Teile"
T DBD [AR1,P#0.0]

// Stueckzaehler erhoehen
L "DB_Daten_IO_Teile".Stueckzaehler
L 1
+I
T "DB_Daten_IO_Teile".Stueckzaehler

// Index erhoehen
L "DB_Daten_IO_Teile".Index
L 20
+I
T "DB_Daten_IO_Teile".Index

M013: NOP 0

Geschrieben wird in einen DB mit einem Array von folgender Struktur:

0.0 Datum DATE D#1990-1-1
2.0 Uhrzeit TIME_OF_DAY TOD#0:0:0.0
6.0 Stueckzaehler INT 0
8.0 Prefix_Schicht STRING[1] 'S'
12.0 Schicht INT 0
14.0 USS30KHz BOOL FALSE
14.1 USS40KHz BOOL FALSE
14.2 WSS BOOL FALSE
14.3 Widerstand_IO BOOL FALSE
16.0 Widerstand REAL 0.000000e+000

In dem DB gibt es am Ende noch einen Stückzähler und einen Index der für die Anfangsadressen benutzt wird.
Falls noch Infos fehlen reiche ich diese gerne nach

Also vielen Dank schon mal im Voraus.

Gruß Peraho
 
Hallo,
wie groß ist denn dein DB bzw. wie groß ist das ARRAY of Struct definiert ?
Fragst du auch irgendwo ab, ob "DB_Daten_IO_Teile".Index größer wird als ARRAY_max ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Larry,

der DB hat 800 Elemente. Die Meldung kommt aber schon beim 5. Element.
also Index wäre bei 80 und Fehlerhafte Adresse, die den Bereichslängenfehler verursacht die 94. Also über die 800 Elemente bin ich noch nicht gekommen.
Die Abfrage der Grenzen muss ich noch programmieren und eine Meldung ausgeben, dass die Daten gesichert werden müssen.

Das kommt später.

Gruß Peraho
 
:confused: welche Zeile in deinem AWL-Script (in dem ich sonmst erstmal keinen Fehler erkenne) wird denn als die mit dem Fehler ausgewiesen ?
Was hast du an Werten in deinem DB stehen ? Vor Allem, was steht an der Index-Adresse für ein Wert, wenn die CPU aussteigt ? 80 ? Wo und als was ist "FP_Daten_schreiben" deklariert ?
 
S7 Code

Hallo,

ich kann im ersetn Anlauf keinen Fehler entdecken, außer das du Doppelwortweise veroderst und dann in ein Wort schreibst, das ist mir aufgefallen, weiß aber nicht einmal wie sich das verhält.

Stell doch mal den S7 Code als Zip hier ein, dann kann man es leichter testen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Mitch:
Stimmt, das mit dem OD ist nicht so schön - daran kann es aber nicht liegen ...
Es ist auch nicht so schön, dass INDEX anscheinend ein INT ist und daraus dann ein Doppelwort mittels SLD gebaut wird, das man ja für das AR-Register braucht - aber auch das ist nicht der Fehler sondern eher unschön ...
 
Zuletzt bearbeitet:
Hallo peraho,

hab mir deinen Code grad angesehen.

// USS 30KHz IO --------------------------------
AUF "DB_Daten_IO_Teile"
L "DB_Daten_IO_Teile".Index
L 14
+I
SLD 3
LAR1

U DB4.DBX 9.5
SPB M040
SPA M041
M040: NOP 0
L DBW [AR1,P#0.0]
L 2#100000000
OD
T DBW [AR1,P#0.0]
M041: NOP 0

Du schlägst mit der Bit-Abfrage den DB4 auf. Danach lädst du ein Wort indirekt aus dem DB. Allerdings ist der geöffnete DB nicht mehr dein "DB_Daten_IO_Teile" sondern der DB4. Ist das so gewollt? Wie groß ist denn der DB4?

Gruß pf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

wenn die CPU aussteigt steht 80 im Index. FP_daten _schreiben
ist Merker 10.0
die Zeile habe ich noch nicht nachgeschaut. Bin auch nicht mehr an der Anlage.

Gruß peraho
 
Hallo,
hab's grad extra nochmal getestet. Wenn ich den Code orginal teste, dann lande ich auf dem falschen DB. Aber wenn ich den Code erweitere, dann funktioniert es.
Code:
// USS 30KHz IO --------------------------------
      AUF   "DB_Daten_IO_Teile"
      L     "DB_Daten_IO_Teile".Index
      L     14
      +I    
      SLD   3
      LAR1  

      U     DB4.DBX    9.5
      SPB   M040
      SPA   M041
M040: [COLOR=Red]AUF "DB_Daten_IO_Teile"[/COLOR]
      L     DBW [AR1,P#0.0]
      L     2#100000000
      OD    
T     DBW [AR1,P#0.0]
M041: NOP   0
Nach der Lade-Anweisung wird ja normalerweise auch nochmal mitgeteilt, um welchen Speicherbereich es sich handelt (DBW, DIW, MW...). Obwohl das ganze ja eigentlich im Pointer hinterlegt ist.:confused:
Aber ich bin da auch schon drübergestolpert.
Wenn allerdings jetzt noch jemand eine gute Erklärung dafür hätte...
Immer her damit :p

Gruß pf
 
Hallo zusammen,

daran muss es wohl gelegen haben. Habe den benötigten DB vorher nochmal aufgeschlagen --> und siehe da, es funktioniert.

Ok. Dann sag ich mal vielen vielen Dank für eure Hilfe!!!!!!

Gruß Peraho
 
Zurück
Oben