Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 5 von 5

Thema: Hilfe - scl

  1. #1
    Registriert seit
    15.02.2006
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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!!!
    "...man kann seinen ruf nicht auf dingen aufbauen, die man(n) vor hat zu tun..."
    Zitieren Zitieren Hilfe - scl  

  2. #2
    Registriert seit
    22.09.2006
    Ort
    Bodenseeraum
    Beiträge
    1.022
    Danke
    61
    Erhielt 136 Danke für 122 Beiträge

    Beitrag

    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
    ______________________________________
    relax, take it easy
    Zitieren Zitieren Scl  

  3. #3
    engineering-01 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.02.2006
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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...
    "...man kann seinen ruf nicht auf dingen aufbauen, die man(n) vor hat zu tun..."

  4. #4
    Registriert seit
    10.05.2005
    Beiträge
    1.996
    Danke
    219
    Erhielt 232 Danke für 204 Beiträge

    Standard

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

  5. #5
    engineering-01 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.02.2006
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!
    "...man kann seinen ruf nicht auf dingen aufbauen, die man(n) vor hat zu tun..."

Ähnliche Themen

  1. Hilfe Hilfe - HMI Fehler
    Von vietha11 im Forum HMI
    Antworten: 7
    Letzter Beitrag: 04.05.2011, 07:53
  2. Antworten: 90
    Letzter Beitrag: 21.03.2010, 12:35
  3. Moeller 719 Hilfe Hilfe
    Von kacperowski im Forum Sonstige Steuerungen
    Antworten: 0
    Letzter Beitrag: 11.05.2009, 19:57
  4. Hilfe Hilfe FM353
    Von Holle6 im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 06.10.2005, 19:03
  5. Antworten: 15
    Letzter Beitrag: 01.03.2005, 22:25

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •