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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Array Schieberegister

  1. #1
    Registriert seit
    07.11.2008
    Beiträge
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    Möchte ein Array (8Spalten und 64 Zeilen) erzeugen. Datentypen:1xString,7Int
    Immer 8 Zeilen gleichzeitig weiterschieben.
    Eventuell in jede Zeile einen Wert bzw. Spalte vor dem Schieben aktualisieren.
    Bin ein Neuling in der Codesyswelt.
    Verwendetes PLC-System: Eaton X-Soft

    Vielen Dank für die Hilfen
    Zitieren Zitieren Array Schieberegister  

  2. #2
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Ich würde da gar nichts schieben, sondern einen Ringpuffer bauen.
    Für die Daten ein "Array[0..63] of irgendwas"
    Dann eine INT-Variable "Index_Pos0", die Dir den aktuellen Array-Index für Position 0 des "Schieberegisters" liefert.
    Um die Daten z. B. um eine Stelle "weiterzuschieben":
    Index_Pos0:=(Index_Pos0+1) AND 63;
    Um den aktuellen Array-Index für eine andere Position zu berechnen:
    Index_PosX:=(Index_Pos0-PosX) AND 63;

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von StructuredTrash Beitrag anzeigen
    Um die Daten z. B. um eine Stelle "weiterzuschieben":
    Index_Pos0:=(Index_Pos0+1) AND 63;
    Genaugenommen müßte es so berechnet werden:
    Index_Pos0:=(Index_Pos0+1) MOD 64;
    Doch bei Array[0..63] funktioniert "AND 63" auch richtig.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Genaugenommen müßte es so berechnet werden:
    Index_Pos0:=(Index_Pos0+1) MOD 64;
    Doch bei Array[0..63] funktioniert "AND 63" auch richtig.
    Ja, das stimmt schon. Ich hätte vielleicht noch dazu schreiben sollen, dass das "AND" nur bei ganzen 2er-Potenzen funktioniert. Wenn man die allgemeingültige Version mit "MOD" wählt, müssen allerdings die Indexvariablen UINT sein, damit es keine negativen Werte gibt.

  5. #5
    Registriert seit
    15.03.2015
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen,

    ich schließe mich mal an diesen alten Threat an, da auch ich Probleme mit dem Ringpuffer habe. Ausgangspunkt ist meine Masterarbeit, in der ich eigentlich versuche eine Schnittstelle zwischen LabView und Beckhoff TwinCat zu erstellen. Da aufgrund der Menge der Daten ein Puffer nötig ist, wollen wir diesen schon in der SPS programmieren. Hierzu haben wir zunächst der Einfachheit halber und um die Daten besser auswerten zu können ein Array erstellt, welches Index für Index eine Zahl hochzählt. Wenn das Array voll geschrieben ist, wird am ersten Index weitergeschrieben. Da diese Variante jedoch zu Problemen in der anschließenden Auswertung mit LabView geführt hat, möchten wir nun, dass praktisch jeweils der neue Wert in den letzten Index geschrieben wird und oben herausgelöscht wird.


    Leider scheitere ich bisher kläglich in der Programmierung eines solchen Puffers in ST.


    Vielleicht habt ihr ja ein paar Tipps für mich als Anfänger. Leider kann ich auch mit den Erklärungen hier drüber noch nicht so viel anfangen.


    Mfg, Mathes

  6. #6
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    TwinCat hat eine Funktion "MemMove", die auch für das Kopieren von überlappenden Speicherbereichen geeignet ist. Damit könntest Du die Daten des Arrays in einem Rutsch von Array[0] nach Array[1] schieben und dabei den Inhalt des obersten
    Arrayfeldes unter den Tisch fallen lassen.

  7. #7
    Registriert seit
    15.03.2015
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    zunächst vielen Dank für deine Antwort. Ich bin nicht sicher, ob der Baustein unseren Anforderungen entspricht. Wenn ja, dann weiß ich nicht genau wie ich es umsetzen muss. Im Prinzip habe ich es bisher "im kleinen" völlig simpel so gelöst:

    Array [0] := Array[1]
    Array[1]:= Array[2]
    Array[2]:=Array[3]
    Array[3]:=sin(x)

    Hier wird ein Sinus von Index 3 des Arrays bis oben durchgereicht .. das eigentliche Problem ist, dass ich nun eine Möglichkeit suche, auf diese Weise bis zu 200 verschiedene Werte gleichzeitig von Stelle 100 bis Stelle 0 zu verschieben, was natürlich einen ungeheuren Programmieraufwand bedeuten würde. So sollen beispielsweise Index 91-100 an Stelle 81-90 durchgereicht werden und dabei dann mit neuen Werten beschrieben werden usw. Sollte die von Dir beschriebene Funktion das können, bitte ich um Nachsicht und würde mich über ein kurzes Beispiel freuen.

    Ansonsten bin ich für jeden Tipp dankbar!

    Viele Grüße,

    Mathes

    Edit: habe es jetzt mit einer Schleife gelöst und es funktioniert soweit. Es gibt aber sicherlich sauberer Lösungen?!
    Geändert von mathez (22.04.2015 um 10:51 Uhr)

  8. #8
    Registriert seit
    28.08.2014
    Beiträge
    21
    Danke
    0
    Erhielt 8 Danke für 8 Beiträge

    Standard

    Zitat Zitat von mathez Beitrag anzeigen
    Es gibt aber sicherlich sauberer Lösungen?!
    Die saubere Lösung ist der bereits erwähnte Ringpuffer

  9. #9
    Registriert seit
    15.03.2015
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Besteht denn die Möglichkeit einen Ansatz zu bekommen oder eine Seite auf der ich es nachschlagen kann? Ich verstehe im oben genannten Beispiel leider nicht ganz auf welche Weise dort der Wert verschoben wird. Was erreiche ich mit "MOD"? Wenn ich es programmiere zählt das Programm ganz normal einen entsprechenden Index hoch .. ich habe sicherlich nur einen blöden Dreher drin bzw. ein Verständnisproblem.

    Danke und Gruß

    Mathes

  10. #10
    Registriert seit
    16.03.2014
    Beiträge
    359
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi mathez,
    ich hatte mich auch mal an dem Memcopy versucht mit Arrays etc.
    Einfügen / Ändernd von Arrayindexen

    Ist allerdings in ST...
    Viel Erfolg
    Shrimps

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. schieberegister für INT
    Von ladychaos im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.04.2011, 08:00
  3. Schieberegister mit Array und Variablem Index
    Von bluebird277 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 30.03.2011, 12:05
  4. Problem ARRAY/Schieberegister
    Von Barni im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 27.08.2009, 12:31
  5. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12

Stichworte

Lesezeichen

Berechtigungen

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