S7-300 Schieberegister schreiben

T

TomTom

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe folgendes Problem :

Ich möchte gern zu Testzwecken ein Schieberegister schreiben wo sich die Worte in einem 1Hz-Takt ändern.
Ein Vergleicher soll dabei prüfen wie oft bereits geschoben worden ist und das ganze bei >5 wieder löschen.

Nun weiß ich nicht genau wie ich anfangen soll und welche Realisierung am sinnvollsten ist (z.B. mit INC oder SLW).

Vielleicht kann mir ja einer ein wenig helfen


Danke
 
Ich würds so machen:
Code:
      L     0
      L     #Anzahl                     //Anzahl um wieviel Stellen geschoben werden soll
      ==I   
      SPBN  m3
      L     #Wert                       //Wert der geschoben werden soll
      T     #Rette_Wert                 //wenn Anzahl Null ist dann Rette Wert
m3:   L     5
      L     #Wert                       //Wert der geschoben werden soll
      <I    
      SPB   m4
      L     #Rette_Wert                 //Wenn Anzahl größer als 5 dann beschreibe
      T     #Wert                       //Wert der geschoben werden soll mit geretteten Wert
      L     0                           //Und lösche
      T     #Anzahl                     //Anzahl um wieviel Stellen geschoben werden soll
m4:   U     M      0.1                  //Taktmerker (Welcher es mit 1Hz ist weiß ich gerade nicht)
      FP    #HM
      SPBN  m5
      L     #Anzahl                     //Anzahl um wieviel Stellen geschoben werden soll
      L     1
      +I                                //zähle plus 1 zu
      T     #Anzahl                     //Anzahl um wieviel Stellen geschoben werden soll
      L     #Wert                       //Wert der geschoben werden soll
      SLW                               //Schiebe Wert um die Anzahl die im Akku 2 LL steht
      T     #Wert                       //beschreibe Wert der geschoben werden soll mit neuen Daten
m5:   NOP   0

Aber weiß nicht obs so auch sinnvoll ist :rolleyes:

Lg Godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich würde über den SFC20 (Blockmove) schieben.
Zu beachten ist dabei nur, dass der aktuellste Wert im letzten
Datenwort steht. Beispiel

Code:
      U BLINK1HZ         //1Hz Flasher
      FP HMBLINK        //Hilfsmerker für pos.Flanke des Flashers
      SPBN  MOVE
//Zu scheibenden Wert bereitstellen
      L     #SCHIEBEWERT
      T     DB100.DBW10
//Werte schieben
      CALL  "BLKMOV"
       SRCBLK :=P#DB100.DBX2.0 BYTE 10
       RET_VAL:=#STATUS
       DSTBLK :=P#DB100.DBX0.0 BYTE 10
//Zähle durchgeführte Takte
     L #TAKTE
     + 1
     T #TAKTE
     L 5   //Vergleiche, ob schon 5 mal geschoben wurde
     >=I
     SPBN MOVE
     L B#16#0 //Füllwert zum Löschen des Bereiches bereitstellen
     T #FILL_VAL
     T #TAKTE //Anzahl der bisherigen Schiebevorgänge initialisieren
     CALL  "FILL"
       BVAL   :=#FILLVAL
       RET_VAL:=#STATUS
       BLK    :=P#DB100.DBX2.0 BYTE 10
MOVE: NOP 0
Der DB hat folgende Struktur:

DBW0...INT...rausfliegender letzter Wert
DBW2...INT...Wert 5
DBW4...INT...Wert 4
DBW6...INT...Wert 3
DBW8...INT...Wert 2
DBW10..INT...Wert 1
DBW12..INT...DUMMY

Ich baue auf diese Weise Puffer für Messwerte zur X/s-Berechnung auf.
Ist auch schön für längere Schiebepuffer aufzubauen.

Hoffe, das hilft Dir weiter.
 
Ich habe da ne Frage zum Sfc 20:
Laut Siemenshilfe darf sich Quell- und Zielfeld nicht überlappen.
Das würde ja in deinem Beispiel passieren oder verstehe ich da was falsch?
Bzw ist das egal?:confused:
 
Für normale Kopiervorgänge per SFC20 hat das schon seine Richtigkeit.
Der SFC20 arbeitet rückwärts, darum kann man (durch Ignorieren der Siemens-Hilfe) wie zuvor beschrieben ein Schieberegister mit grösseren
Datenblöcken aufbauen. Benutze dies um z.B. Mittelwert und Streuung über
x Messwerte zu berechnen.

@TomTom
Wahrscheinlich schoß meine Antwort an Deiner Frage vorbei, da ich mir nicht sicher bin, was Du mit Schieberegister meintest.
Willst Du das Wort selbst in sich schieben (SLW,SRW...) oder das
Wort in einem Datenbereich bewegen (meine Antwort) ?
 
Zurück
Oben