ChopinJunkie
Level-1
- Beiträge
- 18
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe die hier im Forum diskutierten Themen bezüglich indirekter Adressierung gelesen und anhand der Anforderungen meiner Aufgabenstellung mir einen eigenen Funktionbaustein selbst gebastelt.
Nun funktioniert das gebrauchte Eintragen der Werte in einen DB mit einem Array von DINT
hier ist der Code dafür
Leider habe ich jetzt Probleme mit dem Schieben der Werte in DB Register, wenn ich den allerersten Wert löschen möchte. Mit diesem Code geht der CPU einfach ins STOP und verweist im Diagnosepuffer auf die letzte Zeile im oberen Code, nämlich wo der erste Schreibzugriff auf DB gescheht
Könntet ihr mir, bitte erklären was ich so falsch mache? Oder was eurer Meinung nach bei mir falsch sein könnte?
Ich gehe selbstständig nicht mehr weiter :|
ich habe die hier im Forum diskutierten Themen bezüglich indirekter Adressierung gelesen und anhand der Anforderungen meiner Aufgabenstellung mir einen eigenen Funktionbaustein selbst gebastelt.
Nun funktioniert das gebrauchte Eintragen der Werte in einen DB mit einem Array von DINT
hier ist der Code dafür
Code:
U #bit_1
UN #bErase
AUF "Register_Puffer" //schlägt einen DB mit einem ARRAY[1..20] of DINT auf
L #iAnzahl_Werte //lädt aktuellen index, typ INT
T #dIndex
L #dIndex
L 4 //bildet ein Integer, das vielfach einem Doppelwort ist
*D
SLD 3 //bildet einen Pointer
LAR1 //speichert ins Adressregister 1
L #dTemp_data_in //lädt den Wert vom typ DINT
T DBD [AR1,P#0.0] //greift auf den DB ARRAY zu, schreibt den Wert unter Adresse des Pointers
Leider habe ich jetzt Probleme mit dem Schieben der Werte in DB Register, wenn ich den allerersten Wert löschen möchte. Mit diesem Code geht der CPU einfach ins STOP und verweist im Diagnosepuffer auf die letzte Zeile im oberen Code, nämlich wo der erste Schreibzugriff auf DB gescheht
Code:
U #bErase
//iAnzahl_Werte beinhaltet die nummer des letzten eintrages,
// dies kann auf seine adresse verweisen
AUF "Register_Puffer"
L #iAnzahl_Werte
//wir brauchen aber an der Stelle den zweitgeschriebenen Wert in der Tabelle
L 1
-I
T #iDekrement
anf: NOP 0
L #iAnzahl_Werte
L #iDekrement
-I
T #dIndex //schreibt die nummer des allerersten Eintrages
L #dIndex
L 4
*D
SLD 3 //bildet einen Pointer
LAR1 //speichert ins Adressregister 1
L DBD [AR1,P#4.0] //greift auf den nächsten nach allerersten Element zu
T DBD [AR1,P#0.0] //überschreibt den Allerersten mit nachfolgendem Element
//hier ist eine Verschiebung des verweisenden Pointers gebraucht
L #iDekrement
L 1
-I
T #iDekrement
L 0
>=I
SPB anf
SPA ende
//dekremintiert den Zähler für die anwesenden Einträge in der Tabelle um EINS
ende: NOP 0
L #iAnzahl_Werte
L 1
-I
T #iAnzahl_Werte
Könntet ihr mir, bitte erklären was ich so falsch mache? Oder was eurer Meinung nach bei mir falsch sein könnte?
Ich gehe selbstständig nicht mehr weiter :|