# Problem: 25 mal IF THEN ELSE soll als Schleife ablaufen (Codesys)



## Rekling (12 April 2012)

Hallo zusammen,
ich habe ein Problem und zwar möchte ich ein Hochregallager mit 25 Fächern bestücken. Nun habe ich es so gelöst in dem ich 25 mal IF THEN ELSE auf geschrieben habe…geht aber schlecht Programmiert. Nun würde ich gerne das in eine Schleife Packen, bin aber nur ein Anfänger in der  Codesys Programmierung (Jeder fängt mal klein an  )
Programm ausschnitt:
IF            (Fach_25_Platz = FALSE) AND (Rot_Ein_Pflanke.Q )THEN
                Fach_25 := TRUE;
                Auto_Start := TRUE;
                Fach_25_Platz := TRUE;
                Fach_25_ROT := TRUE;
ELSE
IF            (Fach_24_Platz = FALSE) AND (Rot_Ein_Pflanke.Q )THEN
                Fach_24 := TRUE;
                Auto_Start := TRUE;
                Fach_24_Platz := TRUE;
                Fach_24_ROT := TRUE;
ELSE
IF            (Fach_23_Platz = FALSE) AND (Rot_Ein_Pflanke.Q ) THEN
                Fach_23 := TRUE;
                Auto_Start := TRUE;
                Fach_23_Platz := TRUE;
                Fach_23_ROT := TRUE;
ELSE

… das Ganze geht nun bis auf 0 runter!

Über ein lösungsverschlag freue ich mich


----------



## Lars Weiß (12 April 2012)

Switch Case ?


----------



## Thomas_v2.1 (12 April 2012)

Am besten wäre es natürlich wenn die Fächer-Daten vorher schon in einer Array-Struktur angelegt sind.
Wenn das aus irgendeinem Grunde nicht mehr zu ändern ist, kann man sich behelfen indem man die unstrukturierten Daten für die Schleifenbearbeitung in die entsprechende Struktur bringt, dann bearbeitet und die Daten wieder zurückschreibt.

In deinem Fall einen Datentyp (meinetwegen "t_Fach") anlegen der die Informationen (Fach, Platz, Rot) beinhaltet, und von diesem ein Array anlegen.


```
FACH : ARRAY[1..25] OF t_Fach;
```

Dann die Array Daten beschreiben

```
FACH[25].Platz := Fach_25_Platz;
FACH[24].Platz := Fach_24_Platz;
.
.
```
Dann Schleifenbearbeitung.

```
FOR i := 25 to 1 by -1 do
  IF (FACH[i].Platz...
```
Und dann wieder zurückschreiben

```
Fach_25_Platz := FACH[25].Platz;
Fach_25_Rot := FACH[25].Rot;
Fach_24_Platz := FACH[24].Platz;
Fach_24_Rot := FACH[24].Rot;
.
.
```


----------



## Rekling (12 April 2012)

Super, danke für die schnellen antworten!!!

werde es sofort ausprobieren.


----------



## Rekling (12 April 2012)

hallo Thomas_V2.1

ich hätte noch ne frage und zwar:

Was für ein Datentyp muss ich für FACH und t_Fach wählen?

"FACH : ARRAY[1..25] OF t_Fach;"

...i ist klar muss Int sein.
Sind die andren beiden Boolisch??

noch ne frage: kann ich das eintragen ins Array in einem eigenem PRG schrieben und anschließend mehrfach verwenden??






Danke und Gruß Rekling


----------



## Thomas_v2.1 (12 April 2012)

Rekling schrieb:


> Was für ein Datentyp muss ich für FACH und t_Fach wählen?


"FACH" ist der Variablenname den ich einfach mal so frei vergeben habe. "t_FACH" ist der Datentyp der Variable, den Namen habe ich mir auch ausgedacht. Aufgrund deines Codeschnipsels bin ich einfach davon ausgegangen dass dein Fach mehrere boolsche Variablen beinhaltet. Solche Dinge fasst man beim Programmieren am besten in einen eigenen Datentyp zusammen.

Um die Datentypen anzulegen gibt es in der Codesys Umgebung neben dem Reiter "Bausteine" einen eigenen Namens "Datentypen". Dort kannst du einen neuen Typ hinzufügen der dem Aufbau deines Fachs entspricht.
Was man aus deinen Daten entnehmen kann z.B. so:

```
TYPE t_Fach :
STRUCT
	Platz : BOOL;
	Rot : BOOL;
END_STRUCT
END_TYPE
```
Ein Arrayeintrag FACH[n] beinhaltet dann diese beiden Variablen. Beim Eintippen der Variable z.B. FACH[1]. bietet dir der Editor in einer Liste auch die entsprechenden Strukturmitglieder zur Auswahl an. Wenn dein Fach-Eintrag mehr Variablen benötigt, erweiterst du den TYPE und alle Array-Einträge erhalten ebenfalls zusätzlich diese Variable.



Rekling schrieb:


> Sind die andren beiden Boolisch??


Das musst du am besten wissen, ich bin einfach davon ausgegangen da du true vergleichst und zuweist.
Wahrscheinlich hab ich schon wieder viel zu viel Code gepostet...



Rekling schrieb:


> noch ne frage: kann ich das eintragen ins Array in einem eigenem PRG schrieben und anschließend mehrfach verwenden??


Das kannst du theoretisch machen. Am schönsten wäre es aber wenn du die Daten gleich irgendwo NUR als Array anlegst, und dann dieses Array an verschiedene Funktionen die damit arbeiten sollen als Parameter der Funktionen übergibst.
Das erspart dir diese umkopiererei, und falls mal ein Fach dazukommen sollte brauchst du weniger Programm zu ändern.


----------



## Rekling (12 April 2012)

hy, danke... habe das ganze verstanden!
also "t_FACH" ist ja der Datentyp  für "FACH"

"FACH : ARRAY[1..25] OF t_Fach;"

..."t_Fach" habe ich in Datentypen angelget, mit seinen drei bedingungen

nun möchte ja Codesys eine Deklaration von mir haben. Also sage ich ihm Name: "FACH" = Typ: "t_Fach(STRUCT)  ...."OK"

anschließend möchte er auch eine Deklaration für "t_Fach" haben und das versteh ich nicht??

Danke Gruß Rekling


----------



## Thomas_v2.1 (12 April 2012)

Wenn du den Datentyp "t_Fach" angelegt hast sollte Codesys eigentlich nichts zu meckern haben.

Die komplette Deklaration im VAR-Bereich sähe so aus, hast du das so in der Art?

```
VAR
	FACH : ARRAY[1..25] OF t_Fach;
END_VAR
```

t_Fach ist einfach ein von dir definierter Variablentyp. Wie die Typen INT oder REAL, nur dass du den Aufbau von t_Fach selber definiert hast.


----------



## Rekling (12 April 2012)

...war mein fehler, da ich aus der FB.net welt komme habe ich es über das Programm geschrieben und nicht in den:


VAR

END_VAR
somit ist es ja klar das es nicht funktioniert!

Danke noch mal und nen Schönen Tag 
Gruß Rekling


----------



## Rekling (12 April 2012)

hallo, 
habe jetzt ein neues Problem worauf ich nach viel versuchen verschiedener Arten nicht drauf komme!

Code:
FOR i := 25 TO 1 BY -1 DO
      IF  (FACH_.Platz = FALSE) AND (Rot_Ein_Pflanke.Q ) THEN

        FACH.Rot := TRUE;
        Auto_Start := TRUE;
        FACH.Platz := TRUE;
        FACH.Pos := TRUE;
        EXIT;
    END_IF;
END_FOR;


... Im ersten durchlauf, setz er mir das "Fach[25].Platz" auf true und die restlichen auf false ...ist richtig so!
nun sollte auch "Fach[25].Rot" auf true und die restlichen auf false gesetz werden. 
Aber der setz mit alle außer den 24 auf true????

Idee??

Danke um Antwort_


----------



## Rekling (12 April 2012)

...fehler gefunden


----------



## Thomas_v2.1 (12 April 2012)

Wenn eine Variable auf false gesetzt werden soll, musst du das auch programmieren. Bei dir wird aber immer nur auf true gesetzt.
Außerdem wird bei dir beim ersten Schleifendurchlauf in dem die If-Bedingung wahr ist, die Schleife mit dem EXIT abgebrochen. D.h. wenn die bei Index 25 gültig ist werden die restlichen 24-1 Indizes nicht bearbeitet.


----------



## Rekling (12 April 2012)

Hallo, 
Weiter geht es mim Programm und neuer Fehler entstanden und es geht einfach nicht???? ...hab alles versucht!!!

nach dem einlagern möchte ich nun auslagern!


Ist die kleine zahl (Fach1.Rot) belegt, dann soll dieses entleert werden! 
und bei mit entleert er einfach alles, als ob das "EXIT;" nicht funktioniert????

Code:
FOR i := 1 TO 25 BY 1 DO
      IF  (FACH_.Rot = TRUE) AND  (Rot_Aus_Pflanke.Q) THEN

        FACH.Pos := TRUE;
        Auto_Start := TRUE;
        FACH.Platz := FALSE;
        FACH.Rot := FALSE;
        EXIT;

    END_IF;
END_FOR;


hat eine ne Idee??? 
ich komme einfach nicht weiter!!!!

Danke_


----------



## Thomas_v2.1 (13 April 2012)

Man kann dir evtl. weiterhelfen wenn du beschreibst was das Programm überhaupt machen soll. Aus dem Schleifenabschnitt wird man nicht wirklich schlau.


----------

