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

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

Thema: Schleife mit indirekter Adressierung

  1. #1
    Registriert seit
    01.04.2010
    Beiträge
    17
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe folgende Aufgabenstellung:

    Ich möchte in einem Datenbaustein beliebiger Länge bei einer poitiven Flanke eines Eingangs in jedem ersten Byte eines Doppelwortes das Bit 5 (z.B. DB201.DBX0.5) auf 0 setzen.
    Ich habe daher folgendes programmiert:

    Zunächst rufe ich den SFC24 auf und speicher die Datenbausteinlänge lokal ab (#DBlength)

    Meine Schleife sieht dann wie folgt aus:

    U "E 8.4"
    FP M 80.5
    = L 0.0
    U L 0.0
    AUF "Status RohstoffM"
    L 0
    T #Bytenr
    ANF: L #Bytenr
    SLD 3
    LAR1
    L 5
    +AR1
    R DBX [AR1,P#0.0]
    L #Bytenr
    L 4
    +I
    L #Bytenr
    L #DBlength
    >=I
    SPB END
    SPA ANF
    END: NOP 0


    Leider kann ich es hier nicht simulieren. Daher habe ich zwei Fragen:

    1. Ist das so überhaupt funktionsfähig?
    2. Wenn ja, geht die CPU eventuell auf Stop, wenn ich damit einen Datenbaustein mit einer Länge von z.B. 884 Bytes durchratter (zu lange Zykluszeit)?

    Für Hilfe wäre ich dankbar
    Zitieren Zitieren Schleife mit indirekter Adressierung  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Nur als Anmerkung:
    Bit 5 wäre in Deinem Beispiel DB201.DBX0.4 und nach L 0.0 fehlt sicher der bedingte Sprung ans Ende (vermutlich beim Posten unter gegangen, oder?).

  3. #3
    Tschigi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    01.04.2010
    Beiträge
    17
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Nee eigentlich nicht. Wenn ich die 5 in den Pointer lade dann sollte er auch auf x.5 zugreifen und nicht auf x.4.

  4. #4
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Wenn's so sein soll, ist's ja OK.

    Als Alternative zum Rücksetzen des einzelnen Bits wäre z.B. die VerUNDung des DWORDs möglich und man spart sich in jedem Schleifendurchlauf die zusätzliche Bitberechnung des Pointers und damit vermutlich etwas Zeit.

  5. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Das letzte "L #Bytenr" muss sicher auch eigentlich ein Transfer sein, oder?

    Oder davor noch dazwischen, um die neue Bytenummer zu sichern.

  6. #6
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Code:
    L 4
    +I 
    T #Bytenr
    Würrde ich mal sagen - sonst gibt's mit Sicherheit 'ne Zykluszeitüberschreitung...
    Das Grauen lauert in der Zwischenablage !!

  7. #7
    Registriert seit
    13.09.2010
    Beiträge
    2.292
    Danke
    178
    Erhielt 375 Danke für 355 Beiträge

    Standard

    .
    Zitat Zitat von Tschigi Beitrag anzeigen
    1. Ist das so überhaupt funktionsfähig?
    2. Wenn ja, geht die CPU eventuell auf Stop, wenn ich damit einen Datenbaustein mit einer Länge von z.B. 884 Bytes durchratter (zu lange Zykluszeit)?

    Für Hilfe wäre ich dankbar
    Leider machst du keine Angaben über Anwendung
    und eingesetzter CPU.

    zu 1.
    Nee, ist es so nicht.
    Schau dir die Beiträge von hucki und von dtsclipper
    an, die geben dir schon mal entscheidende Hinweise.

    zu 2.
    Wenn du deine Schleife aus 1. dann korrekt am
    Laufen hast, kannst du die Zykluszeitüberwachung
    je nach deiner eingesetzten CPU noch einstellen.

    Auch kannst du die Zeit für den Doppelwort-
    Zugriff aus den CPU-Daten entnehmen und
    dann einfach mal grob hochrechnen.

    Alternativ hast du die Möglichkeit, nur einen
    Schleifendurchlauf pro Zyklus bearbeiten zu
    lassen.
    kind regards
    SoftMachine

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Als Alternative zum Rücksetzen des einzelnen Bits wäre z.B. die VerUNDung des DWORDs möglich und man spart sich in jedem Schleifendurchlauf die zusätzliche Bitberechnung des Pointers und damit vermutlich etwas Zeit.
    Dann müßte man zusätzlich das DWORD aus dem DB lesen und spart dadurch eher keine Zeit.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    hucki (24.10.2013)

  10. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von Tschigi Beitrag anzeigen
    in jedem ersten Byte eines Doppelwortes das Bit 5 (z.B. DB201.DBX0.5) auf 0 setzen.
    [...]
    ANF: L #Bytenr
    SLD 3
    LAR1
    L 5
    +AR1

    R DBX [AR1,P#0.0]
    Wenn die Bitnummer nicht variabel vorgebbar sein soll sondern immer Bit .5, dann muß man P#0.5 nicht extra zum AR1 addieren sondern kann das direkt in der indirekten Operation angeben: "R DBX [AR1,P#0.5]"

    Wenn Du mehrere hundert Schleifendurchläufe machen willst, dann muß die Schleife effizient programmiert sein.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  11. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Stammt Dein Code aus einem FB und sind #DBlength und #Bytenr STAT-Variablen?
    Falls das TEMP-Variablen sind oder Du noch andere TEMP-Variablen hast, dann überlappt das L0.0 mit einer TEMP-Variable - nicht gut.

    Der Adressvergleich >=I muß genaugenommen >=D heißen, sonst funktioniert Dein Code nur in den ersten 32kB eines DB. Das +I funktioniert zwar, sollte aber ebenfalls ersetzt werden durch +D.

    Statt "SPB END + SPA ANF" kann man kürzer schreiben: "SPBN ANF"

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. TIA MOVE mit indirekter adressierung ...?
    Von MaMoe2909 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 02.09.2013, 15:16
  2. Datenbausteinhandling mit indirekter Adressierung
    Von CW-D im Forum Programmierstrategien
    Antworten: 1
    Letzter Beitrag: 23.12.2011, 12:39
  3. IN_OUT mit Indirekter Adressierung
    Von SCM im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 14.10.2011, 12:07
  4. Problem mit indirekter Adressierung
    Von Astralavista im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.09.2010, 11:25
  5. Kleines Problem mit indirekter Adressierung
    Von TobiS81 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.05.2007, 12:31

Lesezeichen

Berechtigungen

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