- Beiträge
- 6.648
- Reaktionspunkte
- 2.340
-> Hier kostenlos registrieren
Du hast doch gerade was mit Pointern üben wollen (immer noch ungetestet):
[EDIT] Hinweise zu Fehler bei der LOOP-Schleife von Ralle ab Post #53 beachten! [/EDIT]
[EDIT] Hinweise zu Fehler bei der LOOP-Schleife von Ralle ab Post #53 beachten! [/EDIT]
Code:
[FONT=Courier New] U #Speichern // IN: BOOL
FP #FM_Speichern // STATIC: BOOL
SPBN Neu
AUF #Register // IN: BLOCK_DB
// Zeiger inkrementieren
L #Zeiger_Ringpuffer // Zeiger für Ringpuffer (STATIC: INT)
+ 1
T #Zeiger_Ringpuffer // Zeiger für Ringpuffer
// Zeiger auf Überlauf prüfen
L #DS_Anzahl // maximale Anzahl an Datensätzen (IN: INT, Wert 10 über die Schnittstelle übergeben)
L #Zeiger_Ringpuffer // Zeiger für Ringpuffer
<=I
SPBN over
L 0
over: T #Zeiger_Ringpuffer // Zeiger für Ringpuffer
// Ereigniszähler inkrementiern
L #Ereigniszaehler // Ereigniszähler (STATIC: INT)
+ 1
T #Ereigniszaehler // Ereigniszähler
// AR1 sichern
TAR1 // AR1 in Akku1 laden
T #Sicherung_AR1 // und im Temp sichern (im Forum so gelernt :), TEMP: DWORD )
// Pointer erstellen
L #Zeiger_Ringpuffer // Zeiger für Ringpuffer
L #DS_Laenge // Datensatzlänge (IN: INT, Wert 8 über die Schnittstelle übergeben)
*I
L #DS_Offset // Startadresse des Datenfeldes (IN: INT, Wert 10 über die Schnittstelle übergeben)
+I
SLD 3 // berechneten Wert auf die Byteadresse schieben
LAR1 // und ins Adressregister 1 schreiben
// Daten eintragen
L #Ereigniszaehler // Ereigniszähler
T DBW [AR1,P#0.0] // und wieder sichern
L #Uhrzeit.Aktuell_Stunden // Aktuelle Stunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
T DBB [AR1,P#4.0] // und in Ringpuffer sichern
L #Uhrzeit.Aktuell_Minuten // Aktuelle Minute (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
T DBB [AR1,P#5.0] // und in Ringpuffer sichern
L #Uhrzeit.Aktuell_Sekunden // Aktuelle Sekunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
T DBB [AR1,P#6.0] // und in Ringpuffer sichern
// AR1 wiederherstellen
L #Sicherung_AR1 // Gesicherten Wert laden
LAR1 // und ins AR1 zurückschreiben
// Register ggf. resetten
Neu: U #Reset // Öffner-Taster
FN #FM_Reset // deswegen negative Flanke
SPBN ende
// AR1 sichern
TAR1 // AR1 in Akku1 laden
T #Sicherung_AR1 // und im Temp sichern
// Zeiger initialisieren
L #DS_Anzahl // maximale Anzahl an Datensätzen
+ 1 // für Start um 1 erhöhen
// Schleifenstart = Zeiger dekrementieren
Next: + -1 // um 1 verringern
T #Zeiger_Ringpuffer // Zeiger für Ringpuffer speichern
// Pointer erstellen
L #Zeiger_Ringpuffer // Zeiger für Ringpuffer
L #DS_Laenge // Datensatzlänge
*I
L #DS_Offset // Startadresse des Datenfeldes
+I
SLD 3 // berechneten Wert auf die Byteadresse schieben
LAR1 // und ins Adressregister 1 schreiben
// Daten eintragen
L 0 // Wert 0
T DBD [AR1,P#0.0] // ins 1. DWORD eintragen
L 0 // Wert 0
T DBD [AR1,P#4.0] // ins 2. DWORD eintragen
// Zeiger auf Null prüfen
L #Zeiger_Ringpuffer // Zeiger für Ringpuffer laden
LOOP Next // Schleife wiederholen, bis Ringpuffer bei Null steht
// AR1 wiederherstellen
L #Sicherung_AR1 // Gesicherten Wert laden
LAR1 // und ins AR1 zurückschreiben
ende: NOP 0
[/FONT]
Zuletzt bearbeitet: