Auf den Begriff Array in einer SPS wirst du mit Sicherheit früher oder später stoßen und in dieser SPS Lektion zeige ich dir, wie Arrays funktionieren und wie sie in einem SPS Programm verwendet werden können.
Was ist ein Array?
Ein Array oder auf deutsch Feld bzw. Ansammlung ist nur eine Folge von Werten eines bestimmten Datentyps.
Stell dir beispielsweise eine einzige Schublade als Variable vom Datentyp INT vor.
Ein Array vom Datentyp INT wäre dann ein Schränkchen mit mehreren dieser Schubladen.
Wichtig zu wissen ist, dass in einem INT Array auch nur INT Werte hinein passen.
Aber was soll das denn jetzt bedeuten?
Damit du das gut nachvollziehen kannst, wechsel ich direkt in das TIA Portal, erstelle einen globalen Datenbaustein und wir programmieren gemeinsam ein kleines Beispiel.
In diesen Datenbaustein soll zu jeder vollen Stunde die aktuelle Außentemperatur gespeichert werden.
Für die meisten von uns hat der Tag 24 Stunden und deshalb legen wir 24 Variablen vom Datentyp Real an, um die Temperaturen zu speichern.
Ein Array in einem Datenbaustein anlegen
Daran wäre an sich überhaupt nichts auszusetzen, aber es geht auch noch viel einfacher, indem wir ein Array des Datentyps Real anlegen.
Das machen wir, indem wir auf Datentyp klicken, ein Array auswählen und den Datentypen definieren, welcher in diesem Fall ein Real sein soll.
Klappen wir diesen Datentypen nun auf, dann sehen wir, dass bereits 2 Variablen in diesem Array sind.
Wir benötigen aber 24 Stunden, weshalb ich das Array von 0 bis 23 anlege.
In anderen Beispielen könntest du auch den Anfangswert von 0 auf beispielsweise 10 sowie auch den Endwert ändern.
Array Elemente beschreiben und verwenden
Soweit haben wir das Array dann auch schon fertig und als Nächstes erstelle ich die Variablen „aktuelle Temperatur“, „Uhrzeit“ und „Freigabe Daten schreiben“, welche ich mit einem einfachen Zufallsgenerator bzw. einem Timer verschalte, um die Uhrzeit alle 2 Sekunden zu erhöhen.
Da das aber ein anderes Thema ist, sehen wir uns das auch ein anderes Mal an und kümmern uns lieber wieder um unsere Aufgabe bzw. unsere Arrays.
Dafür erstelle ich einen FB „Temperatur speichern“ und darin kopieren wir die aktuelle Temperatur mit einer MOVE BOX um, wenn die Uhrzeit passt und die „Freigabe Daten schreiben“ gegeben ist.
Sprich, wenn es 0 Uhr ist, dann wird in das Array Element 0 geschrieben und um 1 ins Array Element 1 usw.
Array Index beschreiben
Es gibt aber auch noch einen einfacheren Weg, um die einzelnen Array Elemente anzusprechen, und zwar kann die Zahl des Array Elements auch durch einen ganzzahligen Datentypen, wie zum Beispiel einen Integer, ausgetauscht werden.
Und am besten würde es passen, wenn unsere Uhrzeit ein Integer wäre, und somit tauschen wir den statischen Array Index 0 gegen einen Variablen Array Index aus und schon haben wir die Aufgabe gelöst.
Ist die Uhrzeit beispielsweise 10, dann wird die aktuelle Temperatur auch in den Array Index 10 geschrieben. Um 5 in den Array Index 5 usw.
Arrays über die Bausteinschnittstelle übergeben
Was wäre, wenn wir diesen Baustein noch öfter aufrufen wollen?
So wie jetzt, wäre er ja immer an diesen einen Datenbaustein bzw. an eine Datenbausteinstruktur gebunden.
Wenn wir uns an die Lektionen über die Funktionen (FC) und die Funktionsbausteine (FB) zurückerinnern, dann können wir doch Variablen über die Bausteinschnittstelle übergeben und das geht auch mit einer Array Struktur.
Dazu schreiben wir die exakt gleiche Struktur in die Bausteinschnittstelle und ziehen die Struktur vom Datenbaustein dann an diese ran.
Ob du die Input, die Output oder die InOut Schnittstelle benutzt, kommt auf deine Aufgabenstellung an.
Arrays löschen / initialisieren
Jetzt sollen die gespeicherten Daten gelöscht werden, wenn das Signal „Freigabe Daten schreiben“ von 1 auf 0 wechselt.
Wie könnte das gemacht werden?
Eine Möglichkeit wäre, jedes Array Element einzeln mit 0 zu beschreiben.
Ich persönlich nutze dafür aber lieber die temporären Variablen bzw. lege dort die gleiche Array Struktur nochmal an.
Dieses Array der temporären Variablen wird nun genommen, auf die bestehende Array Struktur umkopiert und schon sind diese Daten initialisiert.
Ganz wichtig zu wissen ist aber, dass das Umkopieren so nur mit einem optimierten Baustein der 1200er und 1500er Steuerung funktioniert, weil hier die temporären Variablen vom System selbst immer initialisiert werden.
Bei älteren Steuerungen oder nicht optimierten Bausteinen müsstest du dann den Umweg über die statischen Variablen oder über andere Datenbaustein Variablen gehen, wobei du aufpassen musst, dass diese dann nur lesend verwendet werden und immer den Wert 0 haben.
Array Struktur anlegen
Bis jetzt wissen wir, dass ein Array eine Ansammlung von Werten des gleichen Datentyps ist und nur dieser eine Datentyp dort reinpasst, aber es gibt auch einen kleinen Umweg, wie du verschiedene Datentypen in ein Array bekommst, und zwar mit einem "Array of Struct".
Es ist sogar möglich, ein weiteres Array in dieser Array Struktur einzufügen oder dieses mit weiteren Strukturen noch tiefer zu verschachteln.
Wichtig zu wissen ist, dass sich in den folgenden Arrays immer wieder die Struktur des ersten Arrays wiederholt.
Sprich, wenn in der ersten Struktur zuerst eine REAL Zahl vorkommt, dann wird das auch bei den folgenden Strukturen so sein.
Array DB
Wenn du dir ganz sicher bist, dass in einem Datenbaustein auf jeden Fall nur ein klassisches Array mit einem einzigen Datentypen bzw. ein Array von einem UDT Anwenderdatentyp vorkommen soll, dann kannst du auch auf einen Array Datenbaustein zurückgreifen.
Anlegen kannst du einen derartigen Baustein unter „neuen Baustein anlegen“ und dann „Array DB“.
Hier legst du fest, welchen Datentyp und welche Array Länge der Datenbaustein haben soll.
Sei hier aber vorsichtig was du auswählst, denn du kannst später zwar die Länge des Arrays unter den Bausteineigenschaften noch verändern, aber nicht mehr den Datentyp.
Da ich bei einem solchen Vorgehen aber nur Nachteile und keine Vorteile erkenne, habe ich bis dato darauf verzichtet, einen Array DB zu verwenden.
Mehrdimensionale Arrays
Auf was ich aber nicht verzichten kann, sind mehrdimensionale Arrays.
Bis jetzt haben wir nur mit sogenannten eindimensionalen Arrays gearbeitet, welche wir uns wie Schubladen in einem Schrank vorgestellt haben.
Es gibt aber auch zweidimensionale Arrays.
Von der Schreibweise in der SPS sieht das dann so aus, dass du die benötigten Array Felder mit einem Komma getrennt nochmal hinschreibst.
Somit hast du quasi ein Array in der X- und ein Array in der Y-Achse.
Besser vorstellen kannst du dir das sicher, wenn ich einen Schrank einblende, wobei die X-Achse das erste Array darstellt und die Y-Achse das zweite.
Daraus ergibt sich, dass wir links unten das Feld X1 Y1 haben, also "Regal".Regalplatz[1,1].
Rechts daneben sind wir in der X-Achse immer noch auf 1, aber in der Y-Achse auf 2, was "Regal".Regalplatz[1,2] ergibt.
In der zweiten Reihe ganz links sind wir auf Platz 2 der Y-Achse, aber wieder auf Platz 1 der X-Achse, also "Regal".Regalplatz[2,1].
Rechts daneben ist logischerweise der Platz 2,2 und dieses Prinzip führt sich dann bis zum Array Ende fort.
3 dimensionales Array
Wenn du mir bis jetzt folgen konntest, dann hast du es schon fast geschafft.
Denn nun sehen wir uns noch ganz kurz ein 3 dimensionales Array an.
Von der Schreibweise an sich ändert sich nur, dass esnnoch eine Feldangabe mehr gibt und du quasi auch noch die Tiefe eines Objekts, wie einen Würfel, verarbeiten kannst.
Es wäre sogar möglich, dass du das Array bis zu 6 dimensional anlegen kannst, aber ehrlich gesagt habe ich bis jetzt maximal 3 gebraucht und mir fehlt da auch ein wenig die Phantasie, wo ein 6 dimensionales Array benötigt werden könnte.
6 Comments
vielen dank für Erklärung.
sollte man sich trotzdem damit befassen,wenn man in SPS Grundlagen nicht gut genug ist?
Hallo Amayry,
vieles das man am Anfang noch nicht zu 100 % verstanden hat, wird einem erst klarer wenn man eigentlich schon viel weiter ist.
So war es zumindest bei mir selbst.
Daher ist meine Antwort ein klares Ja.
mit freundlichen Grüßen
Mir fehlt schon die Phantasie wo man 2 bzw. 3 Dimensionales Array angewenden könnte. Das Thema ist mir seit Langem bekannt, aber bis jetzt keine Idee, wo man es einsetzt. Möglicherweise könnte man somit die Matrizenrechnung durchzuführen. Das Endziel ist aber nicht klar.
Gruß, Maria
Hallo Maria,
Ein 2 dimensionales Array setze ich tatsächlich öfters ein, wenn ich zum Beispiel ein Regal programmiere (be- und entladen) oder mit einem selbst gebauten Handling, Bauteile aus einem Tray oder der gleichen entnehme.
Die 3te Dimension kommt bei mir dann dazu, wenn das Regal zum Beispiel auch noch mehrere Fächer in der Tiefe hat.
Aber das ist auch schon das Maximum. Eine 4te, 5te oder gar 6te Dimension habe ich noch nicht im Einsatz gesehen.
mit freundlichen Grüßen
Rene
Hallo Rene,
mir gefällt sehr gut wie du das Anlegen der Strukturen sowie Dimensionierung von Arrays erklärt hast. Ich konnte es mühelos nachvollziehen . Gratuliere du bist ein guter Pädagoge 🙂
Mit freundlichen Grüßen
Alfred
Hallo Alfred,
vielen lieben Dank für deinen netten Kommentar.
Es freut mich sehr, wenn ich dir weiterhelfen konnte.
mit freundlichen Grüßen
Rene