Zugriff auf Adressen mittels Pointer

Jiss

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

ich möchte mehrere Bits aus einem Wert in einem Datenbaustein lesen. Folgendes habe ich zur Verfügung.
DB2.Wert Typ: Integer mit irgendeinem Wert, Sagen wir mal 5. Also ist dort gespeichert: 0000 0000 0000 0101

Jetzt möchte ich von DB2.Wert angefangen bei dem niederwertigsten Bit z.B. 8 Bits lesen und diese in ein Merkerbyte speichern. Ich weiß, dass das mit Pointern geht, aber ich bekomme das Partout nicht hin.

Also Form soll dann irgendwie so aussehen:
L DB2.Wert
< lese davon die 8 Bits>
T MB10 (hat den Wert 0000 0101)



Das ganze soll auch für Werte funktionieren, die über den parameter IN des FC/FB an den baustein übergeben werden, bei denen aber nicht klar ist, ob es sich um einen Merker oder einen Eingang handelt.
Hoffe ihr könnt mir da weiterhelfen
 
Absolut geht es wie folgt:

Code:
Auf DB 2
L DBB x
T MB 10

x für das Byte im DB. Ob es symbolisch auch geht, weiß ich nicht. Da bin ich auch mal gespannt drauf...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
also erstmal geht es so, wie schon von Zoomy geschrieben - vielleicht noch etwas eleganter mit :
Code:
L DB2.DBW2
T MW10
mit der IN-Variable eines FC / FB läuft es dann genauso :
Code:
L #my_In_Var   // so habe ich sie jetzt mal genannt ...
T MW 10
... ich glaube aber nicht, das es das war, was du wissen wolltest ...
Was hast du denn nun konkret mit den Bit's vor ?

Gruß
LL
 
Ich migriere eine Steuerung eines AEG Modicon A120 (Dolog AKF).

Dort gibt es einen Befehl, um aus einer Bitspur eine bestimmte Anzahl an Bits in eine Zielvariable zu kopieren.

So sieht das dann aus:
LBB MB10 (z.B. 1111 1111)
DBB ANZ 5
= MB20 (wäre dann 0001 1111)

(LBB = Lade Bitspur in Byte-Akku)
(DBB = Definierte Bitspur-Breite, um Speicherbereichsverletzungen zu vermeiden muss die Breite der zu kopierenden Bitspur angegeben werden)

Alternativ gibts auch noch den Befehl LBW, mit dem eine Bitspur in ein Wort-Akku geladen wird.

Es soll also nicht das komplette Byte bzw. Wort kopiert werden, sondern lediglich ein Teil bzw. auch das ganze Byte/Wort, wenn die DBB entsprechend breit angegeben wird.
Für LBB können angegeben werden: 1-16(Bit) und für LBW 1-2(Byte)

LBW MW10 (z.B. 1111 1011 0100 0100)
DBB 1
= MW20 (wäre dann: 0000 0000 0100 0100)
Aus MB10 werden also die ersten 5 Bit gelesen und in MB20 kopiert.
 
Zuletzt bearbeitet:
Hallo,
das wäre in Step7 ein wenig komplizierter ...
Hier mal ein nicht getesteter Quick'n'dirty-Code :
Code:
L 1
L #Anzahl
SLW
L -1
-I
T #Maske   // bis hier wird deine Maske gebildet

L #Quell_Variable
L #Maske
UW
T #Ziel_Variable
meintest du das so ?

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

also ohne jetzt nen code präsentieren zu können :

ich würde es mit einer schleife probieren.
schleifenzähler= anzahl der zu ransferierenden bits.
und in jedem schleifendurchgang ein bit welches durch den schleifenzähler indiziert wird kopieren ala

L #sz
lar1

auf db2
u dbx[ar1,p#0.0]
= m[ar1,p#0.0]
l sz
loop NEXT


vielleicht würde das ja ohne große schwierigkeiten gehen.


mfg


Edit:
wa müsste natürlich nach in der schleife abgefragt werden wie groß #sz ist und bei >7 noch eine anpassung erfolgen, da es ja z.b.: m1.8 nicht gibt...
 
Zuletzt bearbeitet:
Larry du bringst mich da auf ne gute Idee mit der Wort-Verknüpfung. Ich nehm mir einen Schmiermerker und füll den zuerst mit Nullen, danach an den benötigten Stellen mit einsen und führe eine Wort-Verknüpfung mit der Quelle durch.
Das Problem ist, dass bei dem alten AEG System die Merker 32bit haben. Also von M1.1-32, bei S7 von M1.0-7

Die Sache mit der Schleife hab ich auch schon überlegt. Ist aber recht kompliziert, da ich da mit Pointern arbeiten muss und die Stellen bit für bit übergebe. Daraufhin zielte meine Frage mit den Pointern eigentlich ab.
 
Hallo,
ich hatte da mit meinem Beispiel deine WORT-Anfrage aufgenommen. Du kannst in Step7 natürlich das Ganze auch noch mit DWORD (also 32 Bit) durchziehen. Dann sähe mein Beispiel dann so aus :
Code:
L 1
L #Anzahl
[COLOR=red]SLD
[/COLOR]L -1
-[COLOR=red]D
[/COLOR]T #Maske   // bis hier wird deine Maske gebildet

L #Quell_Variable
L #Maske
U[COLOR=red]D[/COLOR]
T #Ziel_Variable
Gruß
LL
 
Ich hab jetzt nochmal was probiert.
Und zwar übergebe ich die Adresse von DB2.M_2_1 über IN-Variable "IN1" an den FC4.

Nun habe ich das Problem, dass nur die übergebene Adresse ausgelesen und auf die Variable M200.0 geschrieben wird. In meinem Fall ändert sich also nur M200.0, wenn ich im DB2 den Aktualwert für M_2_1 ändere.
Bei M_2_2 (soll auf M200.1) und M_2_3 (soll auf M200.2) tut sich gar nix. Mich wundert auch, dass das AR1 20.0 ist, wo doch die Adresse im DB 2.0 ist?

Hier mal ein Bild:
http://www-home.fh-lausitz.de/~jtaubert/privat/Pointer.bmp
 
Hallo,
davon, dass du an "IN1" die Variable "M_2_1" übergibst weiß der Pointer auf IN1 noch nicht, wo "M_2_2" steht. Die Variable wird hier nicht als Referenz sondern als Wert übergeben.
Fazit : das kann so nicht funktionieren ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe ich inzwischen auch schon gemerkt. Danke trotzdem für den Hinweis ;) Komplizierte Sache mit den Pointern.

Gibt es eine Möglichkeit die Adresse derjenigen Variablen zu ermitteln, die an IN1 den Wert als Kopie übergibt? Da ich ein Programm zur automatischen Migration schreibe kann ich nicht einfach neue Schnittstellen festlegen und direkt den Pointer auf die zu übergebende Variable übergeben. Das liegt daran, dass ich im Moment jeden Baustein einzeln bearbeite und somit keine Möglichkeit habe in meinem Programm den Inhalt der IN/OUT-Variablen zu ermitteln.

Ich nehme mal an, dass dies nicht möglich ist und ich durch die Abarbeitung jedes Bausteins einzeln hier an die Grenze der Realisierung mit Pointern gelangt bin.
 
Hallo,
natürlich gibt es die Möglichkeit.
Du könntest hier entweder mit dem Datentyp POINTER (wenn du nur den Zeiger auf den Anfang des Datenbereichs übergeben willst) oder mit dem Datentyp ANY (wenn du gleich den ganzen Bereich übergeben willst) arbeiten. In diesem Fall hast du die Referenz, die du dann in deinem Baustein allerdings auch selber auswerten mußt (also die Pointer zerlegen und den Quellverweis bilden). Dafür gibt es aber auch schon gute Beispiele hier im Forum ...

Gruß
LL
 
Zurück
Oben