# Datentyp ARRAY und STRUCT



## Quoellfrisch (29 Dezember 2010)

Hallo zusammen!


Ich mache zur Zeit einen Fernlehrgang Step 7.

Zur Zeit habe ich ein Kapitel das sich mit Bausteinparametern beschäftigt.

Ich komme aber nicht mit den Begriffen ARRAY und STRUCT klar oder besser gesagt wie man sie programmiert oder ein praktisches Beispiel wie sie verwendet werden denn das ist leider nicht gut erklärt und nicht mit einem Programmierbeispiel veranschaulicht.

Im Internet finde ich leider auch nix passendes...

Ich würde mich freuen wenn einer von Euch mir mehr darüber bei bringen kann.

Ich bedanke mich schon mal im vorraus!!!

LG Pierre


----------



## PN/DP (30 Dezember 2010)

*ARRAY und STRUCT*

Kurz gesagt:

Ein *ARRAY* (Feld) ist eine Zusammenfassung von gleichartigen Daten.
Alle Elemente eines Arrays sind vom gleichen Datentyp.
-> Ein Array verknüpft eine Gruppe eines Datentyps zu einer Einheit.
Auf die Elemente eines Arrays wird mit einem Index in eckigen Klammern zugegriffen: *Array_Instanzname[3]*
http://de.wikipedia.org/wiki/Feld_(Datentyp)

Ein *STRUCT* (Verbund) ist eine Zusammenfassung von verschiedenartigen Daten.
Die Elemente eines Struct können von verschiedenen Datentypen sein.
-> Ein Struct verknüpft verschiedene Datentypen zu einer Einheit.
Auf die Elemente eines Struct wird über den Name der Teilvariable zugegriffen: *Struct_Instanzname.Membername*
http://de.wikipedia.org/wiki/Verbund_(Datentyp)

Arrays und Structs können geschachtelt werden: sie können weitere Arrays und Structs enthalten, auch gemischt.

Falls Du kein Step7 zur Verfügung hast, hier das Step7-Handbuch mit der Beschreibung der Step7-Datentypen:
Programmieren mit STEP 7 V5.4 (siehe Anhang A.3)
Programmieren mit STEP 7 V5.5 (siehe Anhang 27.3)
siehe auch das Kapitel 13.7.1 Beispiele für Variablendeklarationen in AWL-Quellen

Harald


----------



## Quoellfrisch (30 Dezember 2010)

*ARRAY und STRUCT*

Hallo Harald!

Vielen Dank für Deine schnelle Hilfe!!!

Ich habe mir alle Beiträge angesehen aber immer noch nicht den richtigen Durchblick...

Mir fehlt irgendwie die praktische Seite dafür also ein Beispiel wo man diese Datentypen anwendet und wie sie im Programm integriert werden.

LG Pierre


----------



## Dr.M (30 Dezember 2010)

Damit legst du dir z.B. Speicherbereiche in einem DB an.

Angenommen du hast mehrere Motoren. Alle haben die gleichen Daten wie Vsoll (INT), Vist (INT) und Übertemperatur (BOOL). Dann kannst du das natürlich alles einzeln in den DB tippen der das verwalten soll.
Dauert aber und ist schlecht erweiterbar weil sich dann die Adressierung verschiebt.
Also baust du dir erst mal ein STRUCT aus diesen drei Variablen und könntest diese schon mal kopieren.

Jetzt willst du aber noch mehr Zeit und Arbeit sparen (weil wir das Erste nicht haben und auf das Zweite keinen Bock haben) 

Also legst du ein ARRAY of STRUCT an. Und zwar mit der eben erstellten Struktur. Dann steht im DB: ARRAY[0..4] OF STRUCT.

Nun hast du also 5 Felder angelegt mit den Namen Motor[0] bis Motor[4], die alle die Variablen Vsoll, Vist und Übertemperatur enthalten. 
Vorteil ist die Übersichtlichkeit und vor allem das leichte Erweitern.

Kommt ein Motor hinzu, machst du aus der 4 ne 5 und fertig. Kommt zu jedem Motor noch das Signal "Motor dreht" hinzu, musst du das nur einmal an deiner STRUCT eintragen und hast es für jeden Motor.

Bei 50 Motoren und 20 Parameter pro Motor kann das schon ne Menge Arbeit sparen und für gute Übersicht sorgen.

Am Besten legst du dir einfach mal nen DB an und erstellt da drin mal ARRAYs und STRUCTs und ARRAYs of STRUCT usw und schaust dir das mal in der Datensicht an. Dann isses ganz schnell klar was da abgeht.


----------



## jabba (30 Dezember 2010)

Ich hab das von DR.M mal in Bilder gepackt, vieleicht wird es dann besser ersichtlich.

Der Struct bietet aber zusätzlich zum sparen von Tipparbeit die Möglichkeit die Daten eines Struct's direkt symbolisch zu kopieren. Das ist wesenltlich übersichtlicher bei z.B. einem Blockmove

p#db1.dbx 0.0 byte 6 (Wäre im DB der Motor 1)
Schöner zu lesen
"DB_Antriebe".Motor[1]


----------



## Quoellfrisch (30 Dezember 2010)

*ARRAY und STRUCT*

Hallo!

Vielen herzlichen Dank für Deine Antwort.

Ich glaube ich muss mal erklären auf welchen Stand ich bin.

Also ich mach grad den Fernkurs von MHJ ich habe dazu die Software WinSPS-S7

Zur Zeit bin ich bei dem Kapitel Bausteinparameter dabei habe ich gut verstanden warum man Funktionen programmiert.

Nun bin ich beim Kapitel mit den Datentypen ARRAY und STRUCT angekommen was sehr kurz abgehandelt wird ohne jegliche praktische Beispiele.

Was ich verstanden habe ist das man ähnlich wie zuvor beim programmieren der Funktionen die Datentypen in den Bausteinkopf schreibt und dann mit Hilfe eines Aufrufs mit Aktualparametern aktualisiert.

Nun weil diesmal keine Beispiele da sind komme ich nicht darauf oder begreife ich nicht wie man mit einen Aufruf oder einer AWL darauf zugreift oder wie man das ganze programmiert...

Ich hoffe Ihr könnt mir weiterhelfen???


----------



## Quoellfrisch (30 Dezember 2010)

Vielen lieben Dank für Deine Mühe!!!

Kann man ARRAYS nur in Datenbausteine programmieren???

Oder auch in Funktionen oder Funktionsbausteine???

Wie werden sie in AWL aufgerufen???

Vielen Dank im voraus!!!


----------



## jabba (30 Dezember 2010)

Ich glaube Du siehst das zu kompliziert.

Im Grunde sind Struct und Array nur Platzhalter die einen Zugriff auf Variablen vereinfachen. So wurde es auch schon vorher beschrieben.

Man kann alles was man mit einen Struct oder Array macht auch ohne diese Funktionen hinbekommen. Es wird durch den Einsatz von Struct und / oder Array's nur um einiges einfacher.

Ich kenne das Buch bzw den Lehrgang nicht daher weiss ich nicht in welchem Zusammenhang diese Sachen vorkommen.

Man kann diese Sachen z.B. auch bei der Deklaration z.B. in FB's verwenden, was aber die gleiche Funktion hat wie bei mir mit dem DB beschrieben.


----------



## jabba (30 Dezember 2010)

In AWL kann man auf den Struct zugreiffen, wie z.B. von mir beim kopieren Blockmove angeführt oder auf ein einzelnes Element


```
L 500
t "DB_Antriebe".Motor[1].Output.V_soll

u "DB_Antriebe".Motor[1].Input.Stoerung
S "Störung"
```


----------



## Quoellfrisch (30 Dezember 2010)

*Array struct*

Ich habe konkret die Aufgabe einen AWL-Befehl zu programmieren, mit dem man lesend auf einen Eingangsparameter mit dem Datentyp ARRAY zugreifen kann.Das ARRAY hat den Bereich[1..10] und die Felder sind vom Datentyp WORD.
Der Parameter hat die Bezeichnung "INArray" und der Zugriff soll auf das Feldelement 3 erfolgen.

Also mein Vorschlag wäre im Bausteinkopf eintragen Name:INArray unter Deklaration "in" dann Typ ARRAY[1..10] OF WORD

Und dann in der AWL im Netzwerk1 des Bausteins:

L #INArray[3]
T MW 10


Oder was meinst Du???


----------



## jabba (30 Dezember 2010)

Ja das geht so.

Du solltes die aber angewöhnen die Codes in Code-Tag's zu setzen dann kann man das besser lesen oben rechts den Button "#"

Wenn Du einen FB mit In Array[1..10] of Word machst. must du aber auch ein Array beim Aufruf übergeben !


----------



## Quoellfrisch (30 Dezember 2010)

*Array struct*

Hallo!!!

Ich bins nochmal...

Was meinst Du damit das ich das ARRAY beim Aufruf des FB`s übergeben muss???

Wie ruft man eigentlich so einen FB überhaupt auf???

Call FC 10
INArray=ARRAY-Variable

Bekomme da immer eine Fehlermeldung...
Es wurde kein gültiger Operant angegeben???

Danke schonmal im vorraus.

Lg Pierre


----------



## jabba (30 Dezember 2010)

Wenn du InArray bei In deklariert hast, must du den baustein erst speichern
Beim aufrufen z.B. im OB1 mit

```
Call FC1
inArray:=
```

Must du bei InArray ein Array angeben

Im Anhang mal ein Beispiel mit FC und FB, wobei das hier jetzt kein Unterschied ist, bis auf den Instanz-DB


----------



## Quoellfrisch (30 Dezember 2010)

Vielen Dank für Deine Mühe!!!

Wünsche Dir nen schönen Abend!!!

LG Pierre


----------



## heli100 (5 Dezember 2015)

Hallo;

stehe auch hier an; im FC1 die struct definiert und dann beim Aufruf
CALL FC        1
         input:=Struct-Variable
         output:=Struct-Variable

muss bei input die Struct-Variable eingegeben werden. Wie heißt diese aber?

Im FC1 steht:
input    STRUCT             
Betrieb    BOOL            
Stoerung    BOOL            
Ueberstrom    BOOL            
V_ist    INT             
    END_STRUCT            
output    STRUCT            
Ein    BOOL            
Reset    BOOL            
V_Soll    INT            
    END_STRUCT            

Danke für eine Antwort!


----------



## Ralle (5 Dezember 2015)

Du legst in eunem DB eine Strict an, die genauso definiert ist, wie die Struct in deinem FC-Input. Nennen kannst du die beliebig, z.Bsp. Motor_1 im DB.
Dann legst du am input an "Mein_DB".Motor_1.

Um keinen Fehler beim definieren der Structs zu machen nutze ich lieber UDT. Du legst eine UDT an mit:

Betrieb BOOL  
Stoerung BOOL  
Ueberstrom BOOL  
V_ist INT

und diese UDT in den FC-Input und in den DB. Dann sind es garantiert die gleichen Strukturen, ohne Schreibfehler etc.

input: Meine_UDT


----------



## heli100 (6 Dezember 2015)

Hallo Ralle;
danke für die Antwort.
Frage: ich habe die struct in einem FC definiert. Was gebe ich beim Aufruf des FC von OB1 aus, unter "Struct-Variable" ein? Da komme ich nicht weiter.
Danke


----------



## Ralle (6 Dezember 2015)

Wie ich schrieb, du mußt in einem DB ebenfalls eine *exakt* gleichartige Struct definieren. Diese kannst du dann dort angeben. Deswegen nutze ich dafür gleich UDT, gebe die im FC und im DB an und kann mich da im DB bei der Definition nicht vertun.


----------



## FelixSch (6 Dezember 2015)

Hallo,

im Buch "SPS-Programmierung mit SCL im TIA-Portal" erschienen beim Vogel Buchverlag findest du anschauliche Programmbeispiele zu Array und Stuct. Für mich war das Buch sehr hilfreich

l.g.

Felix


----------

