Schieberegister

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.
befasse mich seit kurzer zeit mit dem progrmmieren von S7/300.
und habe nun folgendes Problem
Ich habe eine Anlage mit 9 verschiedenen Stationen .
nun wird ein Teil an station 1 eingelegt also ist
Station 1 =1
Station 2 =0 usw.
nun lege ich wieder ein Teil an staion 1 ein und das Teil wo vorher bei Station 1 war ist nun bei Station 2
Station 1 =1
Station 2 =1
Station 3 =0 usw.
nun lege ich kein Teil an Station 1 ein aber die anderen Teile werden weiter geschoben
Station 1 =0
Station 2 =1
Station 3 =1
Station 4 =0 usw.
nun wird wieder einTeil an Station 1 eingelegt
Station 1 =1
Station 2 =0
Station 3 =1
Station 4 =1
Station 5 =0 usw.
wie kann ich dieses Problem am besten realisieren ???
wenn es überhaupt ein Problem ist aber ich stehe momentan auf dem Schlauch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich setze da immer ein Schieberegister in folgender Art ein, da ein Bit nicht mir reicht:

Code:
u schieben
fp mx.x
spbn ende

AUF DBxx

L DBW 9     Station 9
T DBW10    Entladung
L DBW 8     Station 8 --> Station 9
T DBW 9
L DBW 7     Station 7 --> Station 8
T DBW 8
L DBW 6     Station 6 --> Station 7
T DBW 7
L DBW 5
T DBW 6
L DBW 4
T DBW 5
L DBW 3
T DBW 4
L DBW 2
T DBW 3
L DBW 1
T DBW 2

ende: nop 0

Das DW1 wird abhängig des Zustands an der Beladesation beschrieben! 

In meinen Anlagen ist der Datenbereich pro Station um einiges größer (20 Worte pro Station), da dort in einem Byte die Anzahl der Werstücke, der Status (IO/NIO) der Werkstück-Typ, der Bearbeitungsstatus der jeweiligen Station uvm. abgebildet ist. 

In deinem Fall könntest Du neben Wersktück vorhanden/nicht vorhanden auch IO/NIO und bearbeitet oder nicht bearbeitet schieben!

DBX1.0       WST 1 vorhanden
DBX1.1       WST 1 io/NIO
...
DBB2          WST Typ

Aber 1000 Wege füren nach Rom  :wink:
 
also bei bits ist es am einfachsten, wenn du srw1 bzw sld1 benutzt.

willst du bytes/word/dword verschieben, schau dir mal den fifo auf meiner hp an.
 
Schleife für Daten verschieben

Hallo Kollege,

für das verschieben einer Anzahl von X-Wert empfiehlt sich eine kleine Schleife, die in der Ausführung länger dauert als reine Lade-/Transferbefehle, aber sehr flexible ist. Hier mein Vorschlag:

Code:
// Schleifen Voreinstellung

      AUF   DB     1                    // DB mit Stationswerten laden

// Der DB enthält nur die einzelnen Stationswerte. Durch die Größe vom DB
// wird die Anzahl der Stationen bestimmt, wie z.B. 9 Stationen.
// Dieses Beispiel wurde auf DINT/DWORD Werte ausgelegt.

      L     L#0                         // Schleifen anfangswert laden
      T     #DIT_Schleifenwert          // Schleifenanfangswert laden

      L     DBLG                        // Anzahl der DB-Bytes laden
      L     L#1                         // Wert zum anpassen laden
      -D                                // Schleifenwert anpassen
      T     #DIT_Schleifenende          // Schleifenende speichern

      L     MD     0                    // Neuerwert zum speichern laden
      T     #DIT_zsp_1                  // Wert zwischenspeichern

// Schleifenausführung

RS50: L     DBD [#DIT_Schleifenwert]    // DB-Bytewert zurücksetzen
      T     #DIT_zsp_2                  // Alten Wert zwischenspeichern

      L     #DIT_zsp_1                  // Wert laden
      T     DBD [#DIT_Schleifenwert]    // Neuen Wert in DB eintragen

      L     #DIT_zsp_2                  // Wert zum verschieben laden
      T     #DIT_zsp_1                  // Wert zwischenspeichern



// Kontrolle auf Schleifenende

      SET                               // VKE-1 laden
      L     #DIT_Schleifenwert          // Schleifenanfangswert laden
      L     L#32                        // Wert für Adressanpassung laden (bei INT/WORD Bearbeitung Wert 16 eintragen)
      +D                                // Adresse anpassen
      T     #DIT_Schleifenwert          // Schleifenanfangswert speichern
      SRD   3                           // Adresse für Schleifenende Kontrolle anpassen
      L     #DIT_Schleifenende          // Schleifenende laden
      <D                                // Wenn noch nicht alle Werte bearbeitet, dann
      SPB   RS50                        // Sprung für erneuten Schleifendurchlauf

Das ganze kann in einen parametrierbaren FC eingesetzt werden, um den DB sowie die Werteübergabe flexibel zu halten. Der FC kann dann immer wieder aufgerufen werden, wenn die Werte verschoben werden sollen.

Wenn du noch Fragen hast, melde dich einfach.

Auf gutes gelingen,

Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Re: Schleife für Daten verschieben

Hallo Kollege,

für das verschieben einer Anzahl von X-Wert empfiehlt sich eine kleine Schleife, die in der Ausführung länger dauert als reine Lade-/Transferbefehle, aber sehr flexible ist. Hier mein Vorschlag:

Code:
// Schleifen Voreinstellung

      AUF   DB     1                    // DB mit Stationswerten laden

// Der DB enthält nur die einzelnen Stationswerte. Durch die Größe vom DB
// wird die Anzahl der Stationen bestimmt, wie z.B. 9 Stationen.
// Dieses Beispiel wurde auf DINT/DWORD Werte ausgelegt.

      L     L#0                         // Schleifen anfangswert laden
      T     #DIT_Schleifenwert          // Schleifenanfangswert laden

      L     DBLG                        // Anzahl der DB-Bytes laden
      L     L#1                         // Wert zum anpassen laden
      -D                                // Schleifenwert anpassen
      T     #DIT_Schleifenende          // Schleifenende speichern

      L     MD     0                    // Neuerwert zum speichern laden
      T     #DIT_zsp_1                  // Wert zwischenspeichern

// Schleifenausführung

RS50: L     DBD [#DIT_Schleifenwert]    // DB-Bytewert zurücksetzen
      T     #DIT_zsp_2                  // Alten Wert zwischenspeichern

      L     #DIT_zsp_1                  // Wert laden
      T     DBD [#DIT_Schleifenwert]    // Neuen Wert in DB eintragen

      L     #DIT_zsp_2                  // Wert zum verschieben laden
      T     #DIT_zsp_1                  // Wert zwischenspeichern



// Kontrolle auf Schleifenende

      SET                               // VKE-1 laden
      L     #DIT_Schleifenwert          // Schleifenanfangswert laden
      L     L#32                        // Wert für Adressanpassung laden (bei INT/WORD Bearbeitung Wert 16 eintragen)
      +D                                // Adresse anpassen
      T     #DIT_Schleifenwert          // Schleifenanfangswert speichern
      SRD   3                           // Adresse für Schleifenende Kontrolle anpassen
      L     #DIT_Schleifenende          // Schleifenende laden
      <D                                // Wenn noch nicht alle Werte bearbeitet, dann
      SPB   RS50                        // Sprung für erneuten Schleifendurchlauf

Das ganze kann in einen parametrierbaren FC eingesetzt werden, um den DB sowie die Werteübergabe flexibel zu halten. Der FC kann dann immer wieder aufgerufen werden, wenn die Werte verschoben werden sollen.

Wenn du noch Fragen hast, melde dich einfach.

Auf gutes gelingen,

Matthias
 
Hallo

Ich würde den von Volker gemachten Vorschlag anwenden, da hier nur die geringstmögliche Datenmenge geschoben wird. Bei größeren Datenmengen ist das "tatsächliche" Verschieben von Daten ggf. eher etwas unsinnig, sei es auch, wenn man Schleifen einsetzt. Volker und ich hatten unlängst zum gleichen Thema eine Diskussion. Mal die Suchfunktion des Forums dazu anwenden.

Gruß Barnee
 
Zurück
Oben