in ARRAY suchen:Problem nichts gefunden

rheumakay

Level-2
Beiträge
914
Reaktionspunkte
125
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich suche in einem ARRAY nach einem gleichem Wert (Programm_HFB), das klappt auch, ich setze zusätzlich die Variable Gefunden auf TRUE.
Ich möchte aber auch abfragen (BOOL), wenn nichts gefunden wurde.Wie stelle ich das an?

Was ich bislang geschrieben habe:
(*Flanke*)
su_Trockner_pofl(CLK:=suche_Trockner);
(*Suche nach gleichem Programm*)
IF su_Trockner_pofl.Q AND NOT gefunden THEN
FOR x:= Lager_Suchen_Anfang TO Lager_Suchen_Ende DO
IF Soll_Anlagen[x].Programm = Programm_HFB THEN
gefundener_Trockner :=x;
Gefunden:= TRUE;
END_IF
END_FOR
END_IF
IF Reset THEN
Gefunden:=FALSE;
END_IF
IF (x=Lager_Suchen_Ende+1) AND NOT Gefunden THEN
keine_Uebereinstimmung:=TRUE;
END_IF

IF Reset THEN
keine_Uebereinstimmung:=FALSE;
END_IF

Ich hatte gedacht,wenn ich x mit SuchenEnde vergleiche, dass die Var keine_Uebereinstimmung an geht..funzt aber nicht.
Hat jemand noch ne Idee?
 
wenn ich zusätzlich mit <> abfrage :


IF su_Trockner_pofl.Q AND NOT gefunden AND NOT keine_Uebereinstimmung THEN
FOR x:= Lager_Suchen_Anfang TO Lager_Suchen_Ende DO
IF Soll_Anlagen[x].Programm <> Programm_HFB THEN

keine_Uebereinstimmung:= TRUE;
END_IF
END_FOR
END_IF

funktioniert es ..
vielleicht geht es auch kürzer??
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich das richtig verstehe setzt du "gefunden" auf true wenn in einem der Trockner das entsprechende Programm läuft. Und jetzt willst du eine zusätzliche Variable die dir anzeigt das in keinem der Trocker das Programm aktiv ist?

Eigentlich sollte dir "gefunden = false" nach dem kompletten Durchlauf der Schleife ja genau diese Information geben, oder? Wenn Soll_Anlagen[x].Programm = Programm_HFB nie erfüllt wird, wird gefunden nicht true .....

Was allerdings auffällt bei deinem Ablauf (ich weiss nicht ob das gewollt ist): Deine Suche zeigt dir immer den Index des letzten Trockners an bei dem die Suchbedingung zutrifft (Wenn auf 1 5 und 7 das Programm läuft, ist der gefundene Trockner die Nr. 7. Von 1 und 5 weiss dein weiterer Ablauf nichts)
Das gleiche gilt für dein 2ten Post. Da ist es so, das "keine_Uebereinstimmung = true" gesetzt wird sobald das Programm bei irgend einem Trockner nicht überein stimmt. Wenn also auf 9 von 10 Trockners das Programm läuft und auf einem nicht, meldet dir die Variable trotzdem keine Uebereinstimmung.
 
Zuletzt bearbeitet:
Ich verstehe schon deine Frage nicht. So wie du das haben willst, erfüllt doch "Gefunden" deine Bedingungen. Wenn "Gefunden" False ist, dann hast du keine Übereinstimmungen gehabt. Wo ist das Problem?
Dein zweites Code-Beispiel, ist auch etwas eigenartig, denn du hast doch bei einer Suche immer mindestens 1 Mal "keine_Uebereinstimmung". Das führt doch in deinem Code dazu, dass am Ende immer "keine_Uebereinstimmung" True ist.

Das Einfachste wäre, nur so lange zu suchen, bis eine Übereinstimmung gefunden wurde. Dann kann man die Schleife verlassen (Anweisung Exit). Vor Start der Schleife setzt man "Gefunden" auf False und "keine_Übereinstimmung" auf True, dann Schleife durchlaufen, bei einem Treffer "Gefunden" auf True und "keine_uerbereinstimmung" auf False, raus aus der Schleife mit Exit.

PS: Codetags und Einrückungen machen das Lesen deines Codes etwas einfacher. ;-)
 
sorry,das ich mich erst jetzt melde..das Geschäft blüht;)
im Anhang ist ein Screenshot des Suchablaufs(es folgen später im Program noch weitere Suchfunktionen).
Den Codeschnipsel von heute morgen befindet sich in der Ausgangsaktion des Schrittes"Suchen"
Um zu entscheiden welcher Alternativzweig weiter abgearbeitet wird, habe ich die VAR Gefunden und keineUebereinstimmung angelegt.
Mache ich das nur mit NOT gefunden, rauscht er mir durch den Schritt ohne überhaupt gesucht zu haben.
 

Anhänge

  • suchablauf.pdf
    38,2 KB · Aufrufe: 11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
nach meiner Meinung fehlt in deinem Script nur das Initialisieren vor der Schleife :
Code:
gefundener_Trockner := -1 ;
Gefunden:= false ;
woher soll das Ding sonst unterscheiden können ...?

Gruß
larry
 
Hallo an alle,
hab´s jetzt mal umgeschrieben..siehe Anhang.
So funktioniert es !

Nur so wie Masteroh schon geschrieben hatte , wenn mehrere gefunden werden, wird der der zuletzt gefunden wurde übernommen.
Das hätte ich eigentlich gerne umgekehrt 1=oberste Prio 5=niedrigste Prio
Hab´s mit austauschen von Suchanfang/ende versucht -hat aber nicht geklappt.
Habt ihr noch einen Rat?
 

Anhänge

  • neuerablauf.pdf
    36,1 KB · Aufrufe: 10
  • anweisung.pdf
    38,9 KB · Aufrufe: 7
Code:
FOR x:= Lager_Suchen_Anfang TO  Lager_Suchen_Ende DO
   IF Soll_Anlagen[x].Programm = Programm_HFB  THEN
     gefundener_Trockner :=x;
     Gefunden:= TRUE;
     keine_Uebereinstimmung:= FALSE;
     [B]exit;[/B]     (* <==== bricht die Abarbeitung der For-Schleife ab*)
    END_IF
END_FOR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,habe doch noch ein Problem mit ARRAY&suchen :
Infos zur Anlage:
1 Beschickung befördert Material zu mehreren Maschinen.
Im Array Soll_Anlagen[x].Programm wird verglichen, ob die Beschickung den gleichen Wert hat (HFB_Programm)
Sind mehrere Programme gleich, so soll an den befördert werden, der die kleinste Restlaufzeit hat (Soll_Anlagen[x].Restlaufzeit).
Das x steht für 1 bis 5 Maschinen (ist als Soll_Anlagen[1..5] OF Daten deklariert.
Mir fehlt im Moment noch der Ansatz..kann mir jemand auf die Sprünge helfen?
 
Am Anfang setzt du eine Hilfsvariable "Min_Restlaufzeit" auf den max. möglichen Wert, eine Hilfsvariable "Programmnummer" auf -1.
Dann mußt du natürlich wieder die gesamte Liste nach dem Programm durchsuchen. Immer wenn du eins findest, das gleich ist, vergleichst du in den Wert "Soll_Anlagen[x].Restlaufzeit" mit "Min_Restlaufzeit". Ist "Min_Restlaufzeit" größer, dann trägst du "Soll_Anlagen[x].Restlaufzeit" in "Min_Restlaufzeit" ein und die dazugehörige (gerade gefundene) Programmnummer in "Programmnummer". Wenn du durch bist mit der gesamten Liste, steht in Programmnummer eine -1 (nichts gefunden) oder die Programmnummer, bei der die Restlaufzeit am geringsten war.
 
Zurück
Oben