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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: werte in ein db schreiben über indirekte adressierung

  1. #11
    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 pn/dp
    kling logisch was du sagst, nur in deinem code schreibt er die werte nicht jede sekunde rein. da er in der schleife bleibt spielt der taktmerker ja keine rolle mehr
    und warum schiebst du um 5 nach links? verstehe nicht wie du das meinst

  2. #12
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Zitat Zitat von aleXandroW Beitrag anzeigen
    hi pn/dp
    kling logisch was du sagst, nur in deinem code schreibt er die werte nicht jede sekunde rein. da er in der schleife bleibt spielt der taktmerker ja keine rolle mehr
    In der Tat.
    Ich habe Harald's Code mal schnell angepasst:
    Zitat Zitat von PN/DP Beitrag anzeigen
    Code:
          U    M 0.5    // taktmerker mit 1s periode
          FP   M 2.0    // oder anderer freier Merker
          SPBN a001
     
     
          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  a001
          L    0
          T    #index
    a001: NOP  0
    Die Variable #index muss jetzt allerdings irgendeine statische Variable sein.
    Larry hat es ja schon erwähnt, könnte was für einen FB sein.
    Oder du nimmst einfach ein freies Merkerwort.
    Zitat Zitat von aleXandroW Beitrag anzeigen
    und warum schiebst du um 5 nach links? verstehe nicht wie du das meinst
    Steht doch schon im Kommentar.
    Um 3 schieben für das Pointerformat (3 Bit-Stellen)
    und nochmals um 2 schieben für das Real-Format (index * 4 = 4 Byte)
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

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

    Standard

    in die indirekte adressierung muss ich mich noch reinfuchsen, habe eigentlich damit fast nie gearbeitet, kenne das nur mit
    L #index
    L 4
    *I
    SLD 3

    das es mit SLD 5 genauso geht wusste ich net

    @larry: Ausgabewert := (Einlesewert + (alterWert * Gewichtung)) / (Gewichtung + 1) ;
    alterWert := Ausgabewert ;

    mein Einlesewert ist doch das gewicht, ist ja das gleiche wie Gewichtung wenn ich das richtig sehe

  4. #14
    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

    Mit Gewichtung meinte ich das Verhältnis mit dem der alte Wert zum neuen steht. Wenn du für meine Gewichtung z.B. den Wert 10 als Betrag annimmst dann würde der neuste eingelesene Wert nur im Verhältnis 1:11 den letzten Wert beeinflussen, was dann etwas Ähnliches ist wie das, was du mit deinem Werte-Speicher wahrscheinlich vorhast ...

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

    Standard

    ah ok

    hab nochmal in die bedinungsanleitung der siwarex cs geguckt, finde da nichts mit gemittelter wert

  6. #16
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.316
    Danke
    932
    Erhielt 3.331 Danke für 2.689 Beiträge

    Standard

    Zitat Zitat von aleXandroW Beitrag anzeigen
    nur in deinem code schreibt er die werte nicht jede sekunde rein. da er in der schleife bleibt spielt der taktmerker ja keine rolle mehr
    Macht Dein Code ja auch nicht. Wenn Dein im EP geposteter Code "laufen" würde, dann würde er ebenfalls bei jedem Sekundenpuls alle 20 Array-Elemente beschreiben.
    Ich habe Deinen Code nur so verändert, daß er korrekt mit dem von Dir vorgegebenen Ablauf funktioniert.
    Der Taktmerker spielt schon noch eine Rolle, er gibt ja vor, daß nur jede volle Sekunde der Code 1x durchlaufen wird und die ~ 400 anderen Programm-Zyklen dazwischen nicht. Bedenke: ein SPS-Programm wird zyklisch abgearbeitet - daher wohl auch Deine falsche Vorstellung, wie eine Schleife funktioniert.

    Wenn Du aber eigentlich jede Sekunde die selbe eine Variable in das nächste Array-Element schreiben wolltest (sowas nennt sich Ringpuffer mit Überschreiben der ältesten Einträge, nur Schreib-Pointer), dann solltest Du das deutlicher schreiben. (Programmieren ist ein "exaktes" Handwerk, wo es sehr darauf ankommt, eine Aufgabe und dann das Programm exakt zu formulieren.)

    In dem Fall darf es natürlich keine Schleife geben, sondern von Durchlauf zu Durchlauf (von Sekundenpuls zu Sekundenpuls) wird nur der Index erhöht und nur auf das eine Array-Element Array[Index] geschrieben. Das könntest Du so wie von Paule geändert machen. Da ich bei indirekter Adressierung grundsätzlich den Index VOR Verwendung prüfe, würde ich etwa so schreiben:
    Code:
          U    M 0.5    // taktmerker mit 1s periode
          FP   M 2.0    // oder anderer freier Merker
          SPBN a001
    
          L    #index
          +    1        // index weiterstellen und auf
          L    20       // Anzahl Array-Elemente
          MOD           // (0..19) begrenzen
          T    #index
    
          SLD  5        // *4 wegen REAL-Array + SLD 3 für P#
          L    P#0.0    // bzw. Anfangsadresse des Array in DB1
          +D
          LAR1
    
          L    MD 10    // der einzuspeichernde REAL-Wert
          AUF  DB 1
          T    DBD [AR1,P#0.0]
    
    a001: NOP  0
    #index muß eine Variable mit "Gedächtnis" sein (STAT, IN_OUT oder globale Variable).
    Der Code erhöht zuerst den Index und schreibt danach auf das indizierte Array-Element, schreibt also beim ersten Durchlauf in das zweite Array-Element Array[1]. Es füllt also das Array in dieser Reihenfolge: Array[1], Array[2], ... Array[19], Array[0], Array[1] ...
    Bei Ringpuffern ist dieser Umstand aber meistens unerheblich.
    Wenn Dein Ringpuffer unbedingt beim ersten Durchlauf auf das erste Array-Element Array[0] schreiben soll, dann müßtest Du lediglich den Index vor der ersten Verwendung mit -1 (oder 19) initialisieren.

    Zitat Zitat von aleXandroW Beitrag anzeigen
    warum schiebst du um 5 nach links?
    Das ist ein altes Programmierer-Geheimnis, daß *4 einem SLD 2 entspricht , und SLD 2 und SLD 3 kann man dann gleich zu SLD 5 zusammenfassen.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Zitat Zitat von aleXandroW Beitrag anzeigen
    ah ok

    hab nochmal in die bedinungsanleitung der siwarex cs geguckt, finde da nichts mit gemittelter wert
    Habe ich jetzt auch mal gerade gemacht.
    Mit sind da die Parameter :
    - Grenzfrequenz für Tiefpassfilter [5Hz ... 0.05 Hz]
    - Filtertiefe Mittelwertfilter [0 ... 255]
    aufgefallen. Ohne groß danach zu suchen !!!
    Vielleicht beschäftigst du dich auch einmal damit. Die Schleifengeschichte ist natürlich auch toll - kannst du m.E. mit den Parametern der CS auch komplett umgehen ...

    Gruß
    Larry

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

    Standard

    danke an alle

    @larry die idee mit dem array war ja auf halbwegs auf mein reglerthema bezogen, wollte ja so mein istwert öfters aktualisieren damit ich keine große totzeit habe
    wie ich das richtig verstehe ist der mittelwert hauptsächlich dafür da, damit er bei vibration gleich ausschlägt

  9. #19
    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

    ... die beschriebenen Parameter der CS würden das Gleiche bewirken, wie du es mit dem Ringpuffer vorhast.

    Die CS würde dir aber (so oder so) in einem schnelleren Zyklus ihren "Istwert" abliefern auf den du dann reagieren kannst. Da ist für mich der Zusammenhang zu deinem Regler-Thema ein bißchen "auf der Strecke" geblieben ...

    Gruß
    Larry

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    SLD 5
    L P#0.0
    +D

    warum addiert man hier noch den pointer dazu? kann man den auch weglassen?

Ä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
  •