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

Rekling

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :ROFLMAO: )
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

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

Dann die Array Daten beschreiben
Code:
FACH[25].Platz := Fach_25_Platz;
FACH[24].Platz := Fach_24_Platz;
.
.
Dann Schleifenbearbeitung.
Code:
FOR i := 25 to 1 by -1 do
  IF (FACH[i].Platz...
Und dann wieder zurückschreiben
Code:
Fach_25_Platz := FACH[25].Platz;
Fach_25_Rot := FACH[25].Rot;
Fach_24_Platz := FACH[24].Platz;
Fach_24_Rot := FACH[24].Rot;
.
.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
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.

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...

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.
 
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
 
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?
Code:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zurück
Oben