TIA Bit Schieberegister (über großen Bereich) mit 1500er

Manfred Stangl

Level-1
Beiträge
944
Reaktionspunkte
174
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Kollegen,

in Sepp7 V55 hab ich den FC92 als Bitschieber verwendet. Ich such mit seit Tagen den Wolf, und find nix adäquates. Ich hab zwar ein Konstrukt mit 2 Blockmoves und einem Zwischenspeicher gefunden, aber gibt's da keine fertige Funktion? "Schiebe Doppelwort" ist mir leider zu kurz.
Muss man da wirklich selbst was basteln? -> ein Rückschritt!
Danke vorab
 
Wir hatten das ein paar mal im Forum, meißt lief das in AWL.

1. von Pizza ein Demo-Baustein, der sich auch in die 1500-er implementieren lassen sollte, wenn die nicht für AWL entscheidende Dinge weggelassen haben. #4

2. Hier noch eine andere, recht gute Variante: #7

Man könnte vielleicht im Forum auch noch etwas in SCL finden, aber eigentlich ist das eine AWL-Domäne, wobei die 1500-er ja mit AWL eher ein wenig langsamer sein soll als mit SCL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,
ich hab noch nie wirklich mit Schieberegistern gearbeitet, aber versuch doch mal diesen SCL code. den kannst du beliebig aufblähen.
Das hier wäre jetzt ein beispiel für 50 Register.
Code:
IF #trigger THEN
    #puffer_a := #Daten[1];
    FOR #i := 1 TO 50 DO
        IF #i < 50 THEN
            #puffer_b := #Daten[#i + 1];
            #Daten[#i + 1] := #puffer_a;
            #puffer_a := #puffer_b;
        END_IF;
    END_FOR;
    
END_IF;

Das Array Daten kann ja wiederum vom Typ Struct sein. somit kann man beliebig viele Informationen in jedem Register Speichern.

hoffe ich konnte helfen

Balu

*edit kleiner Fehler mit der Berreichslänge. So sollte es gehen
 
Zuletzt bearbeitet:
Kann man auch die +1 Durch eine variable ersaetzen ??

Man kann das natürlich machen, aber was genau willst du damit erreichen?
Wenn du den Code nicht auch noch entsprechend änderst (max. Länge des Array, Aufhören mit Schieben, am Array-Ende), wird das nicht korrekt funktionieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Suche was wo ich ein Bit 1 oder null um 1-10 Stellen verschieben kann damit ich weiss wo meine Teile sind
Was passiert am ende fallen die Bits raus ??
Gruß
Micha
 
Wann soll sich das Bit um 1-10 Stellen verschieben?
1-10 Stellen: da reicht ein Word und z.B. SHL (gibt es in FUP/KOP/SCL/AWL)
Weißt Du auch schon, wie Du das um x Stellen verschobene Bit dann ansprechen/lesen willst/kannst?

Um detaillierter antworten zu können brauchen wir wie immer die Angabe welche SPS Du hast und welche Step7- oder TIA-Version.
Und es ist meistens nicht verkehrt etwas mehr über das Ziel/die Aufgabe zu erzählen, als so ein Einzeiler.

Harald
 
Suche was wo ich ein Bit 1 oder null um 1-10 Stellen verschieben kann damit ich weiss wo meine Teile sind
Was passiert am ende fallen die Bits raus ??
Ja, die Bits fallen alle raus. Einen Nullen- oder EinsenStau am Ende des Registers musst Du nicht befürchten. Die Bits fallen auch so, dass sie keinen Schaden anrichten und Du musst nicht mal einen Eimer unter die CPU stellen. :ROFLMAO:
Über die Teile, die am Ende des Bandes runterfallen, muss man sich viel mehr Gedanken machen.
Das zuletzt rausgefallene Bit kannst Du im Allgemeinen noch abfragen (StatusBit).
Du willst um 1 bis 10 BitPositionen verschieben können? Wenn die Bits Deine Teile repräsentieren, wann hast Du dann den Fall, dass alle Bits im SchiebeRegister auf einen Schlag um 10 Positionen weiterhüpfen müssen?

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey danke für die Hilfe
versuche es nochmal zu erklären.

Ich habe ein Band dreht sich im Kreis auf dem Band sind Nester ca 300
Da werden Teile gepuffert ja nach bedarf fahre ich 1-10 Weiter das gebe ich als Zahl an dann markiere ich beladen und muss halt wissen wo sich das Teil bzw die Teile befinden
Dieses wird dann auch visualisiert
Gruß Micha

PS CPU 1510F/PN ET 200 SP
TIA V15.1
 
Du willst um 1 bis 10 BitPositionen verschieben können? Wenn die Bits Deine Teile repräsentieren, wann hast Du dann den Fall, dass alle Bits im SchiebeRegister auf einen Schlag um 10 Positionen weiterhüpfen müssen?
Tja Heini Fördertechnik ist ein weites Feld ... Da gibt es fast nix was es nicht gibt.
Flexible Schieberegister benötigt man z.B. bei variabler Pulk-Fahrweise.
Bit-Register habe ich persönlich das letztemal allerdings mit S5 verwendet.

Gruß
Blockmove
 
Hallo

ich schiebe oder routiere die Aufnahmen von Rundschalttischen oder auch getaktete Bänder mit der Funktion "MOVE_BLK_VARIANT"
Der Baustein achtet auch beim vorwärtskopieren darauf das keine Elemente überschrieben werden (ca. ab TIA V14SP1).
Bedingung ist ein Array. Ich benutze ein Array von Typ UDT. So mit kann ich in den UDT Bits für den Bearbeitungszustand oder auch Messwerte unterbringen. Für die Entkopplung in die Bearbeitungsbausteine kann man dann ein Array - Element benutzten.

Register.jpg

Im Beispiel wird ein Array von 100 bis 110 um eine Stelle verschoben. Das Array 100 dient zum löschen des ersten benutzten Array 101. Im NW 2 wird es zu einen Ring.
Man kann das Beispiel leicht erweitern, auch um wenn man mehr als eine stelle schieben will.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Will ja nur True oder false weiterschieben je nach dem ob ich ein teil geladen habe oder nicht um 1-10 muss halt wisen wo teile sind
alo array typ bool 0-300
Gruß Micha
 
also irgendwie verstehe ich deine anforderung nicht so ganz.
du willst variabel um 1-10 bits mit EINEM Triggerbit (Flanke) verschieben?
und das ganze über ein array of bool [0..300]?

wenn du nur ein bit schieben willst ob ein platz bei einem trigger-bit (z.b. eine ls) belegt ist, ist das in scl recht einfach
oder du nutzt das was pn/dp in post #7 erwähnt hat
 
Hallo
Micha,

Dann "Array[0..310] of Bool". Der Rest im NW1 kann bleiben. NW2 muss auf Bitzuweisung umgestellt werden.

Wenn zum Beispiel um 10 geschoben werden soll, dann "DEST_INDEX" =10 statt 1. und die ersten 9 Bits löschen (RESET_BF).



Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau möchte entwerder 0 oder 1 schieben
also wenn ich 1-10 Weiter drehe 0 oder 1
Also variabel 0 oder 1 vorbelgen dann sschiebe x 1-10
Und will nichts löschen
Versuche es nochmal kurz zu erklären

habe ein band mit 300 Aufnahmen das ich nach bedingungen takte mal 1 mal 5 mal 10 zb
Mal belade ich mal nicht
Gruß Micha
Und möchte wisen wo teile sind wo nicht
 
Hallo Micha,

hier nochmal das auf dich angepasste Program-

Der Baustein darf nur für ein Zyklus gerufen werden. In ihn übergibst du für die Aufnahme 1 ob ein Teil da ist oder nicht (0 oder 1).
Weiterhin die Anzahl der Takte die du schieben willst (1-10).

Register1.jpg

Wenn du nun Teil_da=1 und Anzahl_Schieben=5 übergibst dann ergibt sich folgendes Bild:

Nach NW1
Aufnahme[1] = 1
Aufnahme[2] = 0
Aufnahme[3] = 0
Aufnahme[4] = 0
Aufnahme[5] = 0
Aufnahme[6] = 0

nach NW2
Aufnahme[1] = 0
Aufnahme[2] = 0
Aufnahme[3] = 0
Aufnahme[4] = 0
Aufnahme[5] = 1
Aufnahme[6] = 0


Also das Bit wird um 5 Stellen verschoben.
 
Tja . . . Fördertechnik ist ein weites Feld
Tatsächlich, hier ist KreisVerkehr angesagt:
Ich habe ein Band dreht sich im Kreis auf dem Band sind Nester ca 300
Da werden Teile gepuffert ja nach bedarf fahre ich 1-10 Weiter das gebe ich als Zahl an dann markiere ich beladen und muss halt wissen wo sich das Teil bzw die Teile befinden
Das erklärt die besorgte Frage nach den herausgefallenen Bits!
Es wird nicht geschoben, sondern rotiert! Dass normalerweise nur das zuletzt herausgeschobene Bit aufgefangen werden kann, ist ein allzu schwacher Trost, wenn man einem SchiebeRegister das Rotieren um mehere BitPositionen beibringen will.
ich schiebe oder routiere die Aufnahmen von Rundschalttischen oder auch getaktete Bänder mit der Funktion "MOVE_BLK_VARIANT"
Der Baustein achtet auch beim vorwärtskopieren darauf das keine Elemente überschrieben werden (ca. ab TIA V14SP1).
Tja ... TIA, immerhin ab ca.. Ich musste schon bei der CS600 darauf achten.
Im NW 2 wird es zu einen Ring.
Na ja, mit etwas Überarbeitung.
Wenn zum Beispiel um 10 geschoben werden soll, dann "DEST_INDEX" =10 statt 1. und die ersten 9 Bits löschen (RESET_BF).
Nein, beim Rotieren nicht löschen, sondern mit dem Zustand überschreiben, den die letzten 9 Bits vor dem Schieben hatten.

Nichts ist unmöglich, aber ein Array mit 300 Elementen als Ringpuffer, bei dem lediglich ein Index oder zwei um 10 erhöht werden müssen (unter Berücksichtigung des Überlaufs versteht sich), wäre definitiv einfacher zu beherrschen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nichts ist unmöglich, aber ein Array mit 300 Elementen als Ringpuffer, bei dem lediglich ein Index oder zwei um 10 erhöht werden müssen (unter Berücksichtigung des Überlaufs versteht sich), wäre definitiv einfacher zu beherrschen.
Jo, in einem Ringpuffer braucht man eigentlich nicht den kompletten Inhalt weiterschieben/rotieren, sondern nur den Anfangspunkt verschieben (den Zeiger/Index der auf den Anfang zeigt). Allerdings wird da das Einspeichern und Auslesen etwas komplizierter, weil immer das Bit, was zu einer Position gehört, indirekt adressiert werden müsste. Wenn man den kompletten Inhalt schiebt, dann gehört immer die selbe Bitadresse zu einer Position und kann direkt adressiert werden. Das kann bei einem Bool-Ring insgesamt effizienter sein.

Harald
 
Ja genau ich brauche ein Ringpuffer, da die Teile auch im Kreis fahren können
Und nur bei Entnahme abgelöschte werden also was hinten raus fällt muss vorne wieder Rein
Da ich das auch visualisieren wollte wäre direkte Adressierung besser
Muss zugeben scl noch nie gemacht
Gruß Micha
 
Allerdings wird da das Einspeichern und Auslesen etwas komplizierter, weil immer das Bit, was zu einer Position gehört, indirekt adressiert werden müsste.
Wenn man den kompletten Inhalt schiebt, dann gehört immer die selbe Bitadresse zu einer Position und kann direkt adressiert werden. Das kann bei einem Bool-Ring insgesamt effizienter sein.
Wenn jedes ArrayElement 1 Bit repräsentiert, ist das von der Logik her auch kein Drama, sondern ein übersichtliches Verfahren. Lediglich über die Ausführungszeit müsste man sich bei 300 (+ Anzahl der Positionen, um die maximal rotiert werden soll) Elementen Gedanken machen.
Will man andererseits ein SchiebeRegister aus z.B. 10 DWORDs basteln, das um mehr als 1 BitPosition verschieben/rotieren können soll, dann wird es auch trotz schönster Kommentierung nicht mehr so ganz leicht nachvollziehbar sein.
 
Zurück
Oben