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

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

Thema: werte in ein db schreiben über indirekte adressierung

  1. #1
    Registriert seit
    26.04.2011
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hi,
    möchte jede sekunde mein db mit werten füllen. db ist ein array mit real platzhaltern. möchte das erstmal mit einem schieberegler in wincc flex simulieren. habe mir folgenden code überlegt

    AUF DB 1
    L 0
    T #index
    b001: NOP 0
    U M 1.0 // immer 1 merker
    FP M 0.5 // taktmerker mit 1s periode
    SPBN a001
    L #index
    L 4
    *I
    SLD 3
    LAR1
    L MD 10
    T DBB [AR1,P#0.0]
    L #index
    L 1
    +I
    T #index
    L #index
    L 20
    <D
    SPB b001
    SPA a001
    a001: NOP 0

    problem ist das der index sich nicht erhöht, wo ist mein denkfehler
    Zitieren Zitieren werte in ein db schreiben über indirekte adressierung  

  2. #2
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.539
    Danke
    1.153
    Erhielt 1.254 Danke für 983 Beiträge

    Standard

    Also deine Flankenauswertung ist etwas seltsam...

    Probier mal...

    Code:
    U M0.5
    FP Mx.y //freier Merker
    SPBN a001
    AUF DB1
    L 0
    T #index
    b001: NOP 0
    
    Rest

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    falls #Index eine TEMP-Variable ist ... die merkt die Steuerung sich nicht.

    Das Skript darfst du natürlich auch nicht als Schleife durchlaufen - dann ändert sich der M1.0 auch nicht.

    Ansonsten wäre der OB35 auch noch eine Möglichkeit an Stelle des Taktgebers. Den OB35 kannst du so parametrieren, dass er jede Sekunde (oder auch sehr viel schneller) aufgerufen wird.

    Gruß
    Larry

  4. #4
    Registriert seit
    01.09.2009
    Ort
    Nürnberg
    Beiträge
    28
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Welches Datenformat hat die Indexvariable denn ?
    Geändert von B.Dom (01.08.2011 um 15:43 Uhr)

  5. #5
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.865
    Danke
    78
    Erhielt 805 Danke für 548 Beiträge

    Standard

    genau

    versuchs mal so
    Code:
     
    U M 0.5 // taktmerker mit 1s periode
    FP M 1.0 // flankenspeicher
    SPBN a001
     
    AUF DB 1
    L #index
    L 4
    *I 
    SLD 3
    LAR1 
    L MD 10
    T DBD [AR1,P#0.0]
    L #index
    L 1
    +I 
    T #index
    b001: nop 0
     
    L #index
    L 20
    >D
    spbn m001
    L 0
    T #index
    m001: nop 0
    Geändert von volker (01.08.2011 um 15:48 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  6. #6
    Registriert seit
    26.04.2011
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    index ist eine int und befindet sich in IN_OUT
    was heisst freier merker?

  7. #7
    Registriert seit
    01.09.2009
    Ort
    Nürnberg
    Beiträge
    28
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Wenn man deinen Kommentar hinter dem Flankenmerker richtig interpretiert, dann belgst du eines von den Taktmerkerbits mit ner positiven Flanke von M1.0.
    Deshalb das nicht so machen, sondern für die Flanke einen freien Merker nehmen.

    Läuft dein Programm denn und nur der Index wird nicht hochgezählt ?
    beim Überfliegen hätte ich jetzt, bei dem Programm, getippt dass die CPU in Stop geht.

  8. #8
    Registriert seit
    26.04.2011
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ok freier merker leuchtet ein
    programm läuft aber index zählt nicht hoch

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.325
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Zitat Zitat von aleXandroW Beitrag anzeigen
    programm läuft aber index zählt nicht hoch
    Hmm, dann hast Du hier wohl was anderes gepostet, als das Programm, was bei Dir "läuft".

    Außer dem Haupt-Problem mit dem fehlerhaften FP (was schon hinreichend beanwortet wurde) gibt es noch weitere "Probleme" und "Unschönheiten" in dem geposteten Code.
    Z.B. schreibst Du immer nur den Wert des MB13 (konstante! Quelladresse MD10) in jedes erste Byte (DBB [AR1,P#0.0]) eines Elements des REAL-Arrays in DB1 ab DBB0 (also in DBB0, DBB4, ... DBB76) - macht das irgendeinen Sinn?
    #index soll ein INT (0..20) sein - mal rechnest Du *I und +I, dann vergleichst Du <D - unschön.
    "SPA a001" ist überflüssig.

    Ich würde Dein Programm etwa so umformen:
    Code:
          U    M 0.5    // taktmerker mit 1s periode
          FP   M 2.0    // oder anderer freier Merker
          SPBN a001
    
          L    0
          T    #index
    
    b001: L    #index
          SLD  5        // *4 wegen REAL-Array + SLD 3 für P#
          L    P#0.0    // bzw. Anfangsadresse des Array in DB1
          +D
          LAR1
    
    //hier noch die zu schreibenden Werte in MD10 zur Verfügung stellen
    //dabei AR1 nicht verändern!
    //    ...
    
          L    MD 10
          AUF  DB 1
          T    DBD [AR1,P#0.0]
    
          L    #index
          +    1
          T    #index
          L    20
          <I
          SPB  b001
    
    a001: NOP  0
    Am Ende des Codes wird nach dem ersten Durchlaufen immer #index=20 sein (IN_OUT), ein Hochlaufen des #index wirst Du normal nicht beobachten können.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ähh ... vielleicht nur so als Anmerkung :
    Die Mittelwertbildung in einem (langen) Zyklus bringt nichts. Wie ich schon schrieb muss die Schleife so geändert werden, dass sie erst mit jeder Flanke einen Wert aufzeichnet und (erst) bei Erreichen von Index-Max. die Auswertung erfolgt.
    Das wäre eine schöne Aufgabe für einen FB ...

    @TE:
    Wenn das Ganze aber einen Bezug zu deinem anderen Thread hat, dann wird dir das auch nicht helfen. Dafür bräuchtest du einen "gleitenden Mittelwert" - das heißt, du müßtest dir eigentlich nur den vorhergehenden Wert merken und ihn mit der entsprechenden Gewichtung mit dem neuen Wert in den Ausgabewert umrechnen. Also vielleicht so :
    Code:
    Ausgabewert := (Einlesewert + (alterWert * Gewichtung)) / (Gewichtung + 1) ;
    alterWert := Ausgabewert ;
    Gruß
    Larry

    Nachsatz:
    Es wundert mich allerdings, dass die Siwarex das angeblich nicht kann. Ich hatte das Ding auch mal am Start und ich hatte dalediglich das Problem, dass ich den Rohwert da nicht rausbekam - ge-Mittelwert-et war kein Thema ...

Ähnliche Themen

  1. Indirekte Adressierung
    Von Bensen83 im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 26.01.2010, 11:33
  2. Indirekte Adressierung über einen ANY Pointer
    Von sventek im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.12.2009, 06:33
  3. Indirekte Adressierung
    Von PapaLeo im Forum Simatic
    Antworten: 19
    Letzter Beitrag: 11.05.2009, 17:52
  4. Werte über Bedienpanel schreiben
    Von breno im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 01.03.2009, 21:10
  5. Indirekte Adressierung
    Von hbck im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 29.06.2007, 17:11

Lesezeichen

Berechtigungen

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