Speicher indirekter Bitzugriff?

s3amdrer

Level-1
Beiträge
210
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen.

ich möchte mittels speicherindirekter Adressierung ein BOOL-Zustand von einem DB (z.B. DB8.DBX28.4) in einen anderen (z.B. DB6.DBX17.1) schreiben.
Die Werte werden durch ein TP170 in den DB8 geschrieben und sollen von dort aus mittels Teach Button in den Rezepturbaustein(DB6) gespeichert werden. Der DB8 hat ARRAY Elemente.Meine anderen Variablen DW & Byte habe ich schon verschoben bekommen. Nur weis ich leider nicht wie ich den Zeiger aufbauen muss und wie ich den BOOL Wert in mein Rezeptur DB bekommen.

Die Forensuche hat mir leider nichts brauchbares geliefert :-(

Hier mal mein Code:
Netzwerk6 (das funktioniert)
U "DB_Panel".Teachen_Pos
FP M 0.2
SPBNB _003
L "DB_Panel".Pos_Achse1_Soll
AUF DB [#DB_No]
T DBD [#Zeiger]
L #Zeiger //V 1 schreiben
L #DB_Position
L 4
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".V_Achse1_Soll
AUF DB [#DB_No]
T DBB [#Zeiger]
L #Zeiger //Position 2 schreiben
L #DB_Position
L 2
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".Pos_Achse2_Soll
AUF DB [#DB_No]
T DBD [#Zeiger]
L #Zeiger //V 2 schreiben
L #DB_Position
L 4
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".V_Achse2_Soll
AUF DB [#DB_No]
T DBB [#Zeiger]
L #Zeiger //Position 3 schreiben
L #DB_Position
L 2
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".Pos_Achse3_Soll
AUF DB [#DB_No]
T DBD [#Zeiger]
L #Zeiger //V 3 schreiben
L #DB_Position
L 4
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".V_Achse3_Soll
AUF DB [#DB_No]
T DBB [#Zeiger]
_003: NOP 0

Netzwerk7 (das funktioniert leider nicht)
L #Zeiger
L 1
+I
T #Zeiger
U "DB_Panel".Aktieren_Pos
S DBX [#Zeiger]

Hoffe das Ihr mir helfen könnt.
Gruß Rene
 
Code:
L #Zeiger // Position aktivieren
L 1
+I
slw 3  // du musst das ganze für Pointer aufbereiten
T #Zeiger
U "DB_Panel".Aktieren_Pos
S DBX [#Zeiger]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gerhard,

leider geht mit deinem Code die CPU wegen Bereichslängenfehler in Stopp.

Durch meinen letzten Code im Netzwer6:

L #Schiebebits //dies
L #DB_Position //entspricht
SLW //deinem SLW 3
T #Zeiger

ist meine temp Variable #Zeiger schon im Pointerformat.
Der Zeiger steht auf Byteadresse 16 im DB 6. Nun muss ich meinen Pointer auf 17.0 (um eine Bitadresse festzulegen) ändern. Dann meine BOOLvariable aus dem DB8 laden und mittels indirekter Adressierung irgendwie in meinen DB6 bekommen.
 
L #Schiebebits //dies
L #DB_Position //entspricht
SLW //deinem SLW 3
T #Zeiger

ist meine temp Variable #Zeiger schon im Pointerformat.
Der Zeiger steht auf Byteadresse 16 im DB 6. Nun muss ich meinen Pointer auf 17.0 (um eine Bitadresse festzulegen) ändern.
Probiere mal schnell das.
Code:
     L #Zeiger
     + AR1, P#1.0
Was mich wundert, Du sagst das der Code im NW 6 korrekt ist.
Du schreibst nur SLW , ohne was dazu?

Nachtrag: Probiere lieber das von Gerhard aus. ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
als erstes mal Danke für die Tipps. Habe es so hinbekommen:

U "DB_Panel".Teachen_Pos
FP M 0.2
SPBNB _003
L "DB_Panel".Pos_Achse1_Soll //Position 1 schreiben
AUF DB [#DB_No]
T DBD [#Zeiger]
L #Zeiger //V 1 schreiben
L #DB_Position
L 4
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".V_Achse1_Soll
AUF DB [#DB_No]
T DBB [#Zeiger]
L #Zeiger //Position 2 schreiben
L #DB_Position
L 2
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".Pos_Achse2_Soll
AUF DB [#DB_No]
T DBD [#Zeiger]
L #Zeiger //V 2 schreiben
L #DB_Position
L 4
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".V_Achse2_Soll
AUF DB [#DB_No]
T DBB [#Zeiger]
L #Zeiger //Position 3 schreiben
L #DB_Position
L 2
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".Pos_Achse3_Soll
AUF DB [#DB_No]
T DBD [#Zeiger]
L #Zeiger //V 3 schreiben
L #DB_Position
L 4
+D
T #DB_Position
L #Schiebebits
L #DB_Position
SLW
T #Zeiger
L "DB_Panel".V_Achse3_Soll
AUF DB [#DB_No]
T DBB [#Zeiger]
L #Zeiger // Position aktivieren
L 8
+I
T #Zeiger
U "DB_Panel".Aktieren_Pos
AUF DB [#DB_No]
S DBX [#Zeiger]
UN "DB_Panel".Aktieren_Pos
AUF DB [#DB_No]
R DBX [#Zeiger]
L #Zeiger // Greifer aktivieren
L 1
+I
T #Zeiger
U "DB_Panel".Handling
AUF DB [#DB_No]
S DBX [#Zeiger]
UN "DB_Panel".Handling
AUF DB [#DB_No]
R DBX [#Zeiger]
_003: NOP 0

@ gerhard 315 2-DP

@ Paule
Mein SLW Befehl wird mit #Schiebebits (Variable hat vorher den Wert 3 bekommen) ausgeführt.
Ich wollte es erst einmal mit speicherindirektem Adressieren schaffen und dann registerindirektes Adressieren ausprobieren. ich glaube der Code ist nicht besonders schön, aber er funktioniert und es ist auch meine erste indirekte Adressierung.

Vielen Dank für eure Anregungen.
Gruß rene
 
Oh ja . . .

der erste Ladebefehl ist ein überflüssigeer Code. Danke

Bin ja auch noch ein direkter, indirekter AWL Neuling :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Rene,

hoffentlich siehst Du nächsten Monat noch durch in Deinem Kopierbaustein ...
Ohne Dein Netzwerk 6 genau zu analysieren, grenzt es für mich an ein Wunder, daß es funktionieren soll.
Und da ist auch noch die Frage, welcher Deiner 3 aufeinanderfolgenden Ladebefehle nun überflüssig ist.
Das L #Zeiger hat jedenfalls keine Auswirkung auf Deine nachfolgende Adressberechnung.

Wäre es nicht besser, Du machst in DB8 und DB6 identische Strukturen (UDT) und kopierst die Struktur
im Ganzen einfach mit SFC20? Das entspräche besser dem Grundgedanken von Rezepturen/Datensätzen.

Und statt
Code:
U "DB_Panel".Handling
AUF DB [#DB_No]
S DBX [#Zeiger]
UN "DB_Panel".Handling
AUF DB [#DB_No]
R DBX [#Zeiger]
schreib einfach
Code:
U "DB_Panel".Handling
AUF DB [#DB_No]
[COLOR="Red"]=[/COLOR] DBX [#Zeiger]

Gruß
Harald
 
Hallo Harald,

all deine Tipps sind richtig. Wie gesagt, dei indirekter Adressierung bin ich noch Neuling. Ich mache das hauptsächlich um mich weiter zu bilden. Das mit dem SFC20 schaue ich mir mal an.

Es ist auch nicht wirklich eine Rezeptur, sondern eher eine Positionsmerkung für ein 3Achsportal. Die Positionen und die Geschwindigkeiten möchte ich am Bediengerät eingeben können und dann per Teachtaste in den DB schieben. Im Automatikbetrieb dann genau anders herrum. Erst aus meinem "Rezeptur/Positionsmerkungs DB lesen und in die entsprechenden FM353 schreiben.
 
Gleichnis

Betrachte es wie ein Koch:
Kopierprogramme mit indirekten Aufrufen sind wie exotische Gewürze-
SFC20 "Blockmove" und SFC21 "Füllen" sind wie Salz und Pfeffer...
Das musst Du dir einfach aneignen.
;) Gruß Approx
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, du hast das einfach ausgedrückt, aber dennoch den Nagel auf den Kopf getroffen.

Heut Abend wollte ich die FM's beschreiben und da werde ich mal genauer auf den SFC20 und SFC21 schauen.

Danke
 
Zurück
Oben