Step 7 Pointer[Bereichslängenfehler]

NiklasM

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

ich habe ein Problem mit einem Baustein. Dieser soll die Systemzeit auslesen und auswerten einzel ausgeben und herausfinden ob eine bestimmte Uhr-Zeitspanne gerade aktiv ist, z.B ob die aktuelle Uhrzeit zwischen 16 Uhr und 20 Uhr liegt.
Das ist im großen und ganzen kein Problem das einzige Problem liegt beim Pointer wenn ich die Simulation starte kommt ein Systemfehler. Dieser ist ein Bereichslängenfehler der angeblich von einem Pointer kommt. Ich habe bereits vieles Probiert und komme einfach nicht hinter den Fehler.
Ich habe schon Teile des Programms entfernt deswegen gibt es hier und da mal ein Platzhalter.
Das war das erste mal das ich mit Pointern bzw. Zeigern gearbeitet habe, deshalb sind noch Lücken im Programm da ich etwas verändert habe.

Danke schon mal im voraus
Niklas

im Anhang der Code
 

Anhänge

  • DB.JPG
    DB.JPG
    129 KB · Aufrufe: 34
  • Pointer.JPG
    Pointer.JPG
    51,2 KB · Aufrufe: 32
  • Sys_clock und Stat.JPG
    Sys_clock und Stat.JPG
    116,3 KB · Aufrufe: 31
  • Blk_mov und out.JPG
    Blk_mov und out.JPG
    78,5 KB · Aufrufe: 31
Gleich im ersten Bild fällt mir auf: CDT soll DATE_AND_TIME sein (8 Byte) und das willst Du nach DINT (4 Byte) kopieren: Also ist der Zielbereich kleiner, als der Quellbereich, so weiß ich nicht, ob das zum Systemfehler führt. Laut Hilfe eigentlich nicht.
Aber trotzdem scheint es mir nicht richtig zu sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
JSEngineering

Danke schonmal aber mir fällt nicht auf wo ich Date_And_Time nach DInt kopiere weil CDT geht durch BLK_mov durch und kommt am ende in ein Array of bytes [0..7]. Aber wenn ich das doch irgendwo mache dann könnte das ja schon der Fehler sein.

Niklas
 
Dein Netzwerk 2 ist damit beschriftet: "Kopiere Daten_and_time nach DInt"... daher gehe ich davon aus, daß Du das so beschriftest, wie Du die Variablen deklariert hast.

Aber ich komme jetzt erst dazu, mir die anderen Bilder anzusehen...
Du schreibst ja gleich als erste AWL-Anweisung L LB[AR1, #P60.0]. In AR1 steht aber die Anfangsadresse Deines - wie Du sagst - Arrays.
Wenn Du mal in die Hilfe guckst, so steht dort:
Die genaue Adresse der Daten, die bearbeitet werden sollen, errechnet sich durch Addieren der beiden Pointer.
Bedeutet, daß Du AR1 + P#60.0 rechnest. Dein Array müßte also 60 Byte groß sein, um diese Pointerarithmetik zu verkraften. Da Du aber nur (vermutlich) 8 Byte hast, greifst Du auf einen Bereich jenseits Deines Arrays zu - und da Du vermutlich auch nicht so viele Lokaldaten hast, greifst Du ins Nirvana.
Du müßtest also mit L LB[AR1, P#0.0] auf das erste Byte zugreifen.
Zudem verstehe ich den Sinn von +AR1 nicht.
+AR1 (Addiere zu AR1) addiert einen Versatz, der entweder in der Anweisung oder in AKKU1-L angegeben wird, zum Inhalt von AR1. Die Ganzzahl (16 Bit) wird zunächst vorzeichenrichtig auf 24 Bit erweitert und danach zu den niederwertigsten 24 Bit von AR1 (Teil der relativen Adresse in AR1) addiert.
Im schlimmsten Fall verdoppelst Du Dir hier schon einmal die Startadresse...

Also ich würde mal probieren, das +AR1 rauszuschmeißen und dann in den Zugriffen den P# nur mit dem einfachen Offset von der Startadresse des Arrays anzugeben: P#0.0 / P#1.0 / P#2.0 / ...
Dann vermute ich, daß es funktionieren wird.

Gruß
JS
 
Danke !

Ich werde das gleich testen das mit dem Netzwerk Titel ist mir untergegangen als ich das Programm umgeschrieben hab. Wenn man nur ein Dint an den Out der Blk_mov schreibt wird alles bis Stunde reingeschrieben.
Ich melde mich nochmal wenn es Funktioniert hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie JS ja schon festgestellt hat schaut mir das ganze nach nem missglückten Versuch aus eine DATE_AND_TIME in seine Einzelteile zu zerlegen.

Dir Ursachen für den Bereichslängenfehler hatte JS ja schon aufgezeigt. LAR1 und dann nach mal +AR1 und dann noch mal P#60.0 drauf.
Das ist dann die Anfangsadresse von Time_Reg (das wäre schon 60.0) dann noch dass was du zu dem Zeitpunkt in Akku1 hast drauf (+ ?) und dann beim tatsächlichen Zugriff noch mal den Offset 60.0 dazu. Ergibt 120.0+?

Des weiteren scheint das ja auch noch ein FB zu sein. Beim LAR1 P##Time_Reg handelt es sich ja um einen STAT-Wert, da wäre noch das Thema Multi-Instanz-Offset.

Schau mal HIER. Da hatte ich ein AWL Beispiel gepostet wie man einen DATE_AND_TIME zerlegt. Was ist dem Beispiel #DT_Temp ist, ist bei dir CDT und die Variablen YY,MM,DD,ss,hh,min sind einfache Integer. Den CDT musst du bei dem Beispiel aber in den Temp legen.

Wenn die Sache mit dem Blockmove (DateTime auf 8Byte Array) geht (bin mir nicht sicher), dann kannst du dir die Pointer-Zugriffe eh sparen.
Den DateTime auf ein 8Byte Array umkopieren und dann die einzelnen Bytes mittels BTI (so wie im meinen Beispiel) umwandeln.
 
Zuletzt bearbeitet:
Zurück
Oben