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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: IN_OUT mit Indirekter Adressierung

  1. #1
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!
    Hab ein kleines Problem mit dem Versatz als Multiinstanzfähigen Baustein.
    Es soll ein Einganswert eingelesen werden und dann schleifenmäßig verteilt werden.Wenn ich in der Multiinstanz schaue seh ich das der Erste wert auf DI 226.0 geschrieben wird in wirklichkeit ist er aber bei DI 228.0.
    Wo kommt der versatz her?Kann man nicht auf in_out veriablen lesen/Schreiben? Kann mir da jemand helfen?

    Hier mal mein Programm bisher


    L #CNT //Aktueller Schrittzähler
    T #CHANNEL //Ausgang für Adressierung Multiplexer
    U #TAKT //Abtasttakt
    FP #_flanke[1]
    SPBN m001
    TAR1 #RETTAR1 //Adressregister retten
    TAR2 #RETTAR2 //Adressregister retten
    LAR1 P##TEMP //Pointer auf erste relevante Daten setzen
    L #CNT
    L 4
    *I
    SLW 3
    +AR1 //Offset aktueller schritt mit einrechnen
    L #RETTAR2 //Adressregister 2 adieren für Multiinstanzfähigkeit
    +AR1
    L #INPUT //Eingangswert einlesen
    T DID [AR1,P#0.0] //Auf Position schreiben die im AR1 steht
    L DID [AR1,P#64.0] //Min auswerten
    <R
    SPBN min
    TAK
    T DID [AR1,P#64.0]
    min: L DID [AR1,P#0.0] //Max auswerten
    L DID [AR1,P#128.0]
    >R
    SPBN max
    TAK
    T DID [AR1,P#128.0]
    max: L #CNT //Schrittzähler laden
    INC 1 //um eins erhöhen
    T #CNT //wieder in schrittzähler variable schreiben
    LAR1 #RETTAR1 //Adressregister restaurieren
    LAR2 #RETTAR2 //Adressregister restaurieren
    m001: L #CNT //Schrittzähler auf überlauf prüfen
    L #LOOPCNT
    >I
    SPBN ende
    L #CNT
    L 0
    T #CNT
    ende: SET //Baustein immer mit vke 1 verlassen damit ENO immer 1 ist
    SAVE
    Mfg Mario
    Geändert von SCM (14.10.2011 um 06:46 Uhr)
    Zitieren Zitieren IN_OUT mit Indirekter Adressierung  

  2. #2
    SCM ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Hab den Baustein jetzt etwas angepasst mit dieser Variante funktioniert er!Nur würde mich interessieren warum er sonst nicht funktioniert hat?!
    Hab hier erstmal die ganzen Werte auf statische Variablen gelegt und dann mit Blockmove an den Ausgang übertragen!

    Hier der aktuelle code:
    L #CNT
    T #CHANNEL
    U #TAKT
    FP #_flanke[1]
    SPBN m001
    TAR1 #RETTAR1
    TAR2 #RETTAR2

    LAR1 P##TEMP
    L #CNT
    L 4
    *I
    SLW 3 //Offset mit einrechnen
    L #RETTAR2
    +D
    +AR1
    L #INPUT
    T DID [AR1,P#0.0]
    L DID [AR1,P#64.0]
    <R
    SPBN min
    TAK
    T DID [AR1,P#64.0]
    min: L DID [AR1,P#0.0]
    L DID [AR1,P#128.0]
    >R
    SPBN max
    TAK
    T DID [AR1,P#128.0]
    max: LAR1 #RETTAR1
    LAR2 #RETTAR2

    L #CNT
    INC 1
    T #CNT

    CALL "BLKMOV"
    SRCBLK :=#TEMP
    RET_VAL:=#_int
    DSTBLK :=#TEMP_OUT

    m001: L #CNT
    L #LOOPCNT
    >I
    SPBN ende
    L #CNT
    L 0
    T #CNT
    ende: SET
    SAVE
    Vielleicht kann ja noch jemand sagen warum es anders nicht passt!?

    Mfg Mario
    Geändert von SCM (14.10.2011 um 06:47 Uhr)

  3. #3
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Für Code gibt es Code-Tags, dann kann man den Spagetticode ein wenig lesen. Kommentare wären auch von Vorteil. Und wenn du in deinem 2. Code die Änderungen farbig gekennzeichnet hättest (+Codtags), dann würde vielleicht auch mal jemand drüberschauen. Versuchs mal selbst und du wirst dich nicht mehr wundern, warum keiner antwortet, dafür ist den meisten Leuten ihre Zeit zu schade.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. Folgende 3 Benutzer sagen Danke zu Ralle für den nützlichen Beitrag:

    Paule (13.10.2011),rostiger Nagel (13.10.2011),vierlagig (13.10.2011)

  5. #4
    SCM ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Für Code gibt es Code-Tags, dann kann man den Spagetticode ein wenig lesen. Kommentare wären auch von Vorteil. Und wenn du in deinem 2. Code die Änderungen farbig gekennzeichnet hättest (+Codtags), dann würde vielleicht auch mal jemand drüberschauen. Versuchs mal selbst und du wirst dich nicht mehr wundern, warum keiner antwortet, dafür ist den meisten Leuten ihre Zeit zu schade.

    Hallo!
    Hast ja recht hab nun die Beiträge angepasst!

    Mfg

  6. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    Hallo,
    ich muß zugeben, dass ich durch das Programm auch nicht durchsteige - so oder so ...

    Bei einer Multiinstanz kompensiert man den Versatz normalerweise durch Addieren des AR2-Registers auf den Pointer. So etwas in der Art machst du aber schon.
    Was mir hier unklar ist : du sprichst von einer IN_OUT-Variablen. Das sind normalerweise Pointer. Ich sehe gar nicht, wo du die Quell-Adresse des Pointers lädst ...
    Welches ist die IN_OUT-Variable ?

    Gruß
    Larry

  7. #6
    SCM ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo,
    ich muß zugeben, dass ich durch das Programm auch nicht durchsteige - so oder so ...

    Bei einer Multiinstanz kompensiert man den Versatz normalerweise durch Addieren des AR2-Registers auf den Pointer. So etwas in der Art machst du aber schon.
    Was mir hier unklar ist : du sprichst von einer IN_OUT-Variablen. Das sind normalerweise Pointer. Ich sehe gar nicht, wo du die Quell-Adresse des Pointers lädst ...
    Welches ist die IN_OUT-Variable ?

    Gruß
    Larry
    Hallo!
    Ja es wird immer das adr2 dazu gezählt und noch mal der offset für den aktuellen schritt!
    LAR1 P##TEMP
    mit diser anweisung setze ich auf die ersten relevanten daten!Ist in der in_out deklaration und ist ein udt.

    Mfg

  8. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    OK ... verstanden.
    An der Adresse steht dann aber nur der Pointer, der auf den Quell-Bereich des UDT zeigt. Du mußt jetzt also den Pointer decodieren ...

  9. #8
    SCM ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    OK ... verstanden.
    An der Adresse steht dann aber nur der Pointer, der auf den Quell-Bereich des UDT zeigt. Du mußt jetzt also den Pointer decodieren ...
    Wie muss man das decodieren?

    Mfg

  10. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    Wie ich es geschrieben habe :
    Du verweist an der Stelle auf einen Pointer. Lad dir mal aus der Step7-Hilfe den Aufbau des Pointer. Du mußt nun also die Adresse, die in dem Pointer hinterlegt ist, in dein AR1 laden und kannst dann auf den echten Datenbereich zugreifen.
    Schau dir mal den Instanz-DB deines FB an. Dort, wo der IN-OUT-Parameter steht wird nur ein 6 Byte großer Bereich reserviert und nicht die Größe deines UDT.

    Gruß
    Larry

  11. #10
    SCM ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Wie ich es geschrieben habe :
    Du verweist an der Stelle auf einen Pointer. Lad dir mal aus der Step7-Hilfe den Aufbau des Pointer. Du mußt nun also die Adresse, die in dem Pointer hinterlegt ist, in dein AR1 laden und kannst dann auf den echten Datenbereich zugreifen.
    Schau dir mal den Instanz-DB deines FB an. Dort, wo der IN-OUT-Parameter steht wird nur ein 6 Byte großer Bereich reserviert und nicht die Größe deines UDT.

    Gruß
    Larry
    Also müsste ich das dann wieder mit SLD3 umwandeln?
    Oder gehts auch schon wenn ich statt:
    T DID [AR1,P#0.0]
    T D[AR1,P#0.0] schreibe?
    Mfg

Ähnliche Themen

  1. Problem mit indirekter Adressierung
    Von Astralavista im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.09.2010, 11:25
  2. Antworten: 12
    Letzter Beitrag: 02.06.2009, 10:19
  3. Antworten: 12
    Letzter Beitrag: 10.05.2007, 21:14
  4. Kleines Problem mit indirekter Adressierung
    Von TobiS81 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.05.2007, 12:31
  5. Antworten: 1
    Letzter Beitrag: 19.06.2003, 19:34

Lesezeichen

Berechtigungen

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