Hilfe - scl

engineering-01

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo zusammen, benötige dringend unterstützung hinsichtlich folgender problematik:

habe 3 datenbausteine(DB1/DB2/DB3) mit jeweils der gleichen struktur - darin befindet sich zum einen ein bit "status" (0-frei/1-belegt) und ein wert (hier betriebsstunden)...

nun möchte ich, herausfinden, a- welche station ist frei und b-welche dieser freien stationen hat die wenigsten betriebsstunden...

als rückgabewert möchte ich die jeweilige stationsnummer, also 1, 2, 3...

habe es bereits mit 2 schleifen (scl) versucht, jedoch verdiller ich mich da ständig irgendwo...;-(

hoffe es hat jemand rat, danke...alex!!!
 
Scl

Hi,
ich würde sagen:
-zuerst Betriebsstunden sortieren, um min zu finden(z.B. mit Bubble Sort, ist in der SCL Hilfe beschrieben)
-dann schauen nach dem Bit(frei oder nicht frei)

und fertig.

Gruss: Vladi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine schnelle antwort, werd mir das mit deinem vorschlag noch einmal anschauen und ausprobieren... bin bis jetzt genau anders herum an die sacher herangegangen, was vielleicht auch mein verhängnis ist... d.h. ich schaue nach einer freien station, merke mir die betriebsstunden und vergleiche diese dann mit der nächsten freien station...



hier mal ein auszug aus meiner quelle, habe noch einen kleinen fehler darin, wenn alle betriebsstunden gleich sind...

Code:
VAR_INPUT
    iAuftragsziel           :INT;   //t5 oder t6 prozess
    iAnz_T5_Prozesse        :INT;   //wieviele stationen/öfen sind vorhanden bzw betriebsbereit (t5)
    iAnz_T6_Prozesse        :INT;   //wieviele stationen/öfen sind vorhanden bzw betriebsbereit (t6)
  END_VAR

VAR_OUTPUT
    iAuftragsposition       :INT;   //welcher station/ofen ist von den vorgegebenen frei...
  END_VAR

VAR
    Lauf                    :INT;   //hilfsvariable - schleifenende
  END_VAR

VAR_TEMP
    i                       :INT;   //laufvariable
    result                  :INT;   //resultat - alte iAuftragsposition
    tmpIndAdresseDB_1       :INT;   //enthält die adresse des 1. zu vergleichenden stations-/ofen DB's
    tmpIndAdresseDB_2       :INT;   //enthält die adresse des 2. zu vergleichenden stations-/ofen DB's
    tmpBS_1                 :DWORD; //anzahl betriebsstunden db(1)
    tmpBS_2                 :DWORD; //anzahl betriebsstunden db(1)
  END_VAR

LABEL
    
 END_LABEL

BEGIN   //eventuell die aufgabe, entnahme und pufferstationen mit einfügen und lauf auf 1 setzen bzw von außen beschalten...

//fallunterscheidung, zuordnen der einzelnen prozesse zu der zugehörigen anzahl an ststionen

  CASE iAuftragsziel OF             //anzahl der vorhandenen öfen je nach prozess in die laufvariablenbeschränkung schreiben..
    5 :                             //T5-Prozess
      Lauf:=iAnz_T5_Prozesse
      ;
    6 :                             //T6-Prozess
      Lauf:=iAnz_T5_Prozesse
      ;
  ELSE:
    Lauf:=0;                        //wenn keins der Prozesse, dann null
END_CASE;

i       :=0;                        //variablen vorbereiten - nullen
result  :=1;


FOR i:=1 TO Lauf BY 1 DO                                                        //schleife um die station/öfen einzeln abzulaufen
    tmpIndAdresseDB_1:=iAuftragsziel*10+1000+i;                                 //bausteinadresse vorbereiten - aktuelle schleifenposition
    tmpIndAdresseDB_2:=iAuftragsziel*10+1000+Result;                            //bausteinadresse vorbereiten - niedrigste betriebsstunden und frei
    IF WORD_TO_BLOCK_DB(INT_TO_WORD(tmpIndAdresseDB_1)).DX0.0 = FALSE THEN      //wenn station/ofen frei ist...
        tmpBS_1:=WORD_TO_BLOCK_DB(INT_TO_WORD(tmpIndAdresseDB_1)).DD48;         //temporäres speichern der betriebsstunden
        tmpBS_2:=WORD_TO_BLOCK_DB(INT_TO_WORD(tmpIndAdresseDB_2)).DD48;         //..
        IF DWORD_TO_INT(tmpBS_1) < DWORD_TO_INT(tmpBS_2) THEN                   //betriebsstundenvergleich
            result:=i;                                                          //wenn aktuelle anzahl der betriebsstunden kleiner ist, schreibe position
        ELSE
            result:=result;                                                     //ansonsten behalte alte position bei
        END_IF;
    ELSE
        result:=result;                                                         //wenn ststion/ofen nicht frei ist, behalte alte position bei
    END_IF;
END_FOR;

IF result=1 AND DB1051.DX0.0=TRUE THEN  //wenn result = 1, kann es sein, das entweder die erste station die mit den wenigsten betriebsstunden ist,
   iAuftragsposition:=0;                //oder alle stationen/öfen belet sind
ELSE
 iAuftragsposition:=result;
END_IF;

END_FUNCTION_BLOCK



...ob diese variante nun besser, oder schlechter ist, weis ich nun auch nicht wirklich...
 
Hi

Vieleich mal ne doofe Frage.


Benutzt du UDTs.

Ich denke, das Programm könnte dadurch vieleicht eine gewisse Lesbarkeit haben.


ZUSÄTZLICH verstehe ich deine Frage NICHT.

(Wieviele öfen hast du. ... Vorgenensweise ? )


CASE iAuftragsziel OF //anzahl der vorhandenen öfen je nach prozess in die laufvariablenbeschränkung schreiben..
5 : //T5-Prozess
Lauf:=iAnz_T5_Prozesse
;
6 : //T6-Prozess
Lauf:=iAnz_T5_Prozesse
;
ELSE:
Was sind "iAnz_T5_Prozesse".

Wo verwendest du den INPUT für "iAnz_T6_Prozesse"


Struckturform.
 
hallo gravieren,
1. ja, teilweise benutze ich udt's und ich denke auch, das das programm eine gewisse lesbarkeit hat, im zusammenhang betrachtet, nur ist dafür hier keine zeit bzw das gesamtprojekt zu umfangreich im vergleich zu dem eigentlich gepostetem problem...daher habe ich auch nur einen auszug geschickt, der auch nur mehr oder weniger aus dem bauch heraus runtergetippt wurde...kommentare und variablenbezeichnungen habe ich nun mittlerweile angepasst...entschuldige...

2.ja, du hast recht, den tippfehler habe ich leider erst zu spät gesehen, die variable iAnz_T6_Prozesse wird in fall 6 der case-anweisung verwendet...

3.iAnz_T5_Prozesse/iAnz_T6_Prozesse: darin steht die anzahl der jeweiligen stationen bzw öfen...habe das problem erst einmal auf eine station herunterbrechen wollen, also nur 1 prozess betrachten wollen...

-> zum besseren verständnis: habe hier verschiedene prozesse (t5/t6) mit jeweils einer anzahl von x öfen (im moment 3, aber mit der option auf mehr...)
für jeden einzelnen ofen habe ich einen db mit den informationen des einzelnen ofens z.b. status und betriebsstunden...

das ziel war und ist, einen algorithmus zu finden, der mit zum einen einen freien ofen sucht und zum anderen den ausgibt, der die wenigsten betriebsstunden hat, das alles jedoch erst einmal für nur einen prozess (z.b. t5)

...anhand dieser prozedur möchte ich jetzt mittels der case-anweisung die einzelnen anzahlen den prozessen zuordnen und so durch die eingabe des prozesses den jeweil berechneten ofen/station ausgegeben haben...

db's haben z.b folgendes format:

t5: DB1051/DB1052/DB1053 u.s.w
t6: DB1061/DB1062... u.s.w

...

danke...!!! und entschuldige, wenn ich mich ein bissel unklar ausgedrückt habe...Alex!
 
Zurück
Oben