Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Zugriff auf Adressen mittels Pointer

  1. #1
    Registriert seit
    06.10.2009
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Zugriff auf Adressen mittels Pointer  

  2. #2
    Registriert seit
    02.02.2009
    Ort
    Raum Stuttgart
    Beiträge
    25
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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...

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    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

  4. #4
    Jiss ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.
    Geändert von Jiss (09.12.2009 um 19:18 Uhr)

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    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

  6. #6
    Registriert seit
    12.04.2007
    Beiträge
    140
    Danke
    5
    Erhielt 24 Danke für 22 Beiträge

    Standard

    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...
    Geändert von misconduct (09.12.2009 um 19:49 Uhr)

  7. #7
    Jiss ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    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
    SLD
    L -1
    -D
    T #Maske   // bis hier wird deine Maske gebildet
    
    L #Quell_Variable
    L #Maske
    UD
    T #Ziel_Variable
    Gruß
    LL

  9. #9
    Registriert seit
    28.01.2009
    Ort
    Hamburg
    Beiträge
    199
    Danke
    52
    Erhielt 54 Danke für 34 Beiträge

    Standard

    Andere Möglichkeit

    Code:
      L     32
      L     #Bits_Anzahl
      -I    
      L     #wert
      SLD   
      SRD   
      T     #Maskierter_wert
    Viele Grüße Bernard
    Zitieren Zitieren Rechtsbündige Maskierung aus max. 32 Bit mit Bitanzahl  

  10. #10
    Jiss ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. FC Move mittels Any-Pointer
    Von Toki0604 im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 22.09.2011, 04:54
  2. Antworten: 7
    Letzter Beitrag: 02.09.2011, 11:43
  3. Pointer Adressen weiterleiten?!
    Von Der_Schakal im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 11.05.2011, 17:02
  4. Zugriff auf DB(String) über Pointer
    Von Thomas R im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.03.2007, 21:04
  5. DP-Zugriff-Adressen
    Von hobel im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 09.08.2006, 21:38

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •