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

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 46

Thema: Probleme mit Zykluszeit

  1. #11
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von zotos Beitrag anzeigen
    Ich habe mal einfach eine FOR-Schleife die von 0..1023 läuft auf 8 SPS Zyklen verteilt.
    n=10:
    2^10-1 = 1023

    Aber n=20:
    2^20-1 = 1048575

    Tausend mal Tausend gibt auch 'ne Million.
    Haut das denn zeitlich immer noch hin?
    Was ist, wenn noch eins dazukommt (n=21)...

    Perfektionist hat vollkommen Recht, ohne einen anderen
    Algorithmus kommt man bei ausreichend großem n nicht zurande.
    Eine vetretbare Lösung wäre zB, nicht nach einer optimalen
    Lösung zu suchen, sondern einen Toleranzbereich festzulegen,
    und die erste Lösung zu nehmen, die da drin liegt.

    BTW:
    Steve81 hätte sein Programm der Einfachheit halber auch mit
    n=3 testen können.
    Zitieren Zitieren es wird nichts nützen  

  2. Folgender Benutzer sagt Danke zu argv_user für den nützlichen Beitrag:

    zotos (08.12.2007)

  3. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Vielleicht ist der Vorschlag von Perfektionist nicht so schlecht, die übergebenen 20 Variablen zunächst nach Größe zu sortieren (Größte nach vorn/oben) und entsprechend der Vorgabe-Variablen zu überprüfen, ob überhaupt alle in Frage kommen (ist einer oder mehrere der Werte von vornherein größer, dann muß er nicht mehr mit berücksichtigt werden). Entsprechend würde ich mit der Differenz von dem gerade gewählten Wert zur Vorgabe verfahren. Auch da werden dann warscheinlich gar nicht mehr alle Variablen in Frage kommen.

    Das hat als Algorythmus aber schon Anforderungs-Charakter ...

  4. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    zotos (08.12.2007)

  5. #13
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von argv_user Beitrag anzeigen
    n=10:
    2^10-1 = 1023

    Aber n=20:
    2^20-1 = 1048575

    Tausend mal Tausend gibt auch 'ne Million.
    Haut das denn zeitlich immer noch hin?
    Was ist, wenn noch eins dazukommt (n=21)...

    Perfektionist hat vollkommen Recht, ohne einen anderen
    Algorithmus kommt man bei ausreichend großem n nicht zurande.
    ...
    Ihr habt ja recht ich habe ja eben schon geschrieben das ich die 2^20 - 1 überlesen habe.

    Also wenn man im Internet nach den Rucksack Problem und dessen Optimierung sucht landet man schnell bei rekursiven Aufrufen. Das beist sich eben leider mit so ziemlich jeder SPS Systemarchitektur die ich kenne.

    Also was bleibt einem übrig? Die vom werten Kollegen argv_user angesprochene Toleranz Grenze die als Abbruch Bedingung in Frage kommt plus einer Abschaltung.
    Je nach Anwendung ist es ja auch vorgegeben das nicht mehr als X werte gleichzeitig dazu gehören können. Also wenn es um drei Schnitzel geht die zusammen z.B. möglichst 500g wiegen sollen ist die Anzahl der Möglichkeiten geringer.

    Und auch wenn ich vorhin das mit der über eine Million Schleifen Durchläufen nicht beachtet habe bin ich immer noch der Meinung das es nützlich wäre die Berechnung auf mehrere SPS-Zyklen zu verteilen. Da ja ca. 1 Sekunde zur Verfügung steht sollte man nicht mit gewallt an die 15-20ms Grenze gehen.
    If you open your Mind too much, your Brain will fall out.

  6. #14
    Avatar von Steve81
    Steve81 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.06.2007
    Ort
    In der Pfalz
    Beiträge
    503
    Danke
    72
    Erhielt 77 Danke für 65 Beiträge

    Standard

    Hier ist jetzt der funktionierende Code der über mehrere Zyklen durchgearbeitet wird. Der Code von zotos hat bis auf das rot markierte gepasst.
    Vielen Dank nochmal für die Unterstützung.


    Code:
     //---------------------------------------Bausteinbezeichnung-------------------------------------------------------------
    FUNCTION_BLOCK FB11
    TITLE = 'Gewichtberechnung'
    VERSION : '2.0'
    AUTHOR : 'C&S'
    //---------------------------------------Variablendeklaration------------------------------------------------------------
    VAR_INPUT
        Anzahl_p_P_min, Anzahl_p_P_max : INT ;
        Sollgewicht, Max_Diff_max_min, min_Gewicht_p_St, max_Gewicht_p_St, max_Plus_Abw_Soll, G1, G2, G3, G4, G5, G6, G7, G8, G9, G10 : REAL ;
    END_VAR
    VAR_OUTPUT
         SPEICHER  :INT;  
         BITSUMOUT : INT;
         ISTIDEAL  : REAL;
         BUSY      : BOOL; (* ZoToS: der Algorithmus läuft *)
    END_VAR    
    VAR_IN_OUT
            ENABLE : BOOL ;
    END_VAR
    VAR    
        X, I, J, S, T, U, ADR, HBits : INT ;
        IST, MAXIMUM, MINIMUM, SUMME : REAL ;
        HO : DWORD ;
        GEWICHTE : ARRAY [1..10] OF REAL ;
        Gewichtesort : ARRAY [1..10] OF REAL ;
        wordi : WORD ;
        wordj : WORD ;
        wordk : WORD ;
        DBNRW : WORD ;
        IasDINT : DINT ;
        forCount :INT; (* ZoToS: zum splitten der Forschleife *)
    END_VAR
    //---------------------------------------Anweisungsteil------------------------------------------------------------------
    BEGIN
    IF ENABLE AND NOT BUSY THEN  (* ZoToS: ENABLE ohne BUSY -> Initialisierung *)
            GEWICHTE[1] := G1 ;
            GEWICHTE[2] := G2 ;
            GEWICHTE[3] := G3 ;
            GEWICHTE[4] := G4 ;
            GEWICHTE[5] := G5 ;
            GEWICHTE[6] := G6 ;
            GEWICHTE[7] := G7 ;
            GEWICHTE[8] := G8 ;
            GEWICHTE[9] := G9 ;
            GEWICHTE[10] := G10 ;
            DBNRW := INT_TO_WORD(3) ;
            ISTIDEAL := 0 ; 
            SPEICHER  :=0;  
            BITSUMOUT :=0;
            I := 1;       
            BUSY := TRUE;  (* ZoToS: Jezt läuft der Algorithmus *)
            //forCount := 1; (* ZoToS: die schleife soll von vorne Beginnen *)
    ELSE (* ZoToS *)
      IF ENABLE AND BUSY AND I < 1023 THEN  (* ZoToS: Also es läuft und ist noch unter den 1023 Elementen *)
        
        forCount := I; (* ZoToS: forCount festlegen  *)
        
        FOR I := forCount TO forCount + 127 DO (* ZoToS *)
            HBits := BITSUM (IN :=  DINT_TO_DWORD(INT_TO_DINT(I)));               
     
            IF (HBits >= Anzahl_p_P_min) AND (HBits <= Anzahl_p_P_max) THEN
     
            IST := 0;
            J := 1;
            S := 1;
            T := 10;    
                FOR X := 1 TO 10 DO                
                    wordi := INT_TO_WORD(I);
                    wordj := INT_TO_WORD(J);
                    wordk := wordi AND wordj;                                                                                      
                    IF wordk<>0 THEN                    
                        //IST := IST + GEWICHTE [X] ;
                        Gewichtesort [S] := GEWICHTE [X] ;
                        S := S + 1 ;
                    ELSE
                        Gewichtesort [T] := 0 ;
                        T := T - 1 ;                
                    END_IF ;                            
                    J := J * 2 ;
                END_FOR ;
     
                ADR := 0 ;
                FOR U := 1 TO 10 DO                                
                    WORD_TO_BLOCK_DB(DBNRW) .DD[ADR] := REAL_TO_DWORD(Gewichtesort[u]) ;
                    ADR := ADR + 4;
                END_FOR ;
     
            FC63 (DBNR:=3, MNR:=0, ANZ:=HBits, MAXIMUM:=MAXIMUM, MINIMUM:=MINIMUM, SUMME:=IST);
     
                IF (MAXIMUM <= max_Gewicht_p_St) AND (MINIMUM >= min_Gewicht_p_St) AND ((MAXIMUM - MINIMUM) <= Max_Diff_max_min) AND (IST <= (Sollgewicht + max_Plus_Abw_Soll)) AND (IST >= Sollgewicht) THEN
     
                    IF IST = Sollgewicht THEN
                        ISTIDEAL := IST ;
                        SPEICHER := I ;
                        BITSUMOUT := HBits ;            
                        I := 1024 ;
     
                    ELSIF (IST > ISTIDEAL) AND (Sollgewicht > ISTIDEAL) THEN
                        ISTIDEAL := IST ;
                        SPEICHER := I ;
                        BITSUMOUT := HBits ;
     
                    ELSIF (Sollgewicht < ISTIDEAL) AND (IST < ISTIDEAL) AND (Sollgewicht < IST) THEN
                        ISTIDEAL := IST ;
                        SPEICHER := I ;
                        BITSUMOUT := HBits ;
     
                    END_IF ;
                END_IF ;
            END_IF ;
        END_FOR ;
      ELSE 
        BUSY := FALSE; (* ZoToS *) 
        ENABLE := 0 ; 
      END_IF; (* ZoToS *)
    hier stand ENABLE:=0;     
    END_IF;
    //--------------------------------------Bausteinende---------------------------------------------------------------------
    END_FUNCTION_BLOCK
    Also jetzt noch mal die genauere beschreibung:

    Im Moment habe ich 10 Einzelwerte, aber es soll später mal mit 20 gehen.
    Ebenfalls sollen nur bestimmte Kombinationen möglich sein z.B. nur aus 3 Werten oder aus 2-4 Werten.
    Ebenfalls möchte ich den Autraggeber davon überzeugen, nicht das Absolut bete Ergebnis abzuwarten sonder eine gewisse Toleranz vorzugeben wann die Kombination nahe genug bei Soll ist.
    Natürlich soll auch alles möglichst flexibel sein.

    Die meisten Kombinationen berechne ich ja auch garnicht (siehe BITSUM im CODE)

  7. #15
    Registriert seit
    06.10.2003
    Beiträge
    3.414
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Hallo Steve,

    hier nur ein Hinweis von mir. Ich selber kenne das Buch nicht!
    http://www.amazon.de/Knapsack-Proble.../dp/3540402861

    Interessante und anspruchsvolle Sache. Leider habe ich aufgrund eigener Projekte nicht die notwendige Zeit, mich damit zu beschäftigen.


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford
    Zitieren Zitieren Buchtipp  

  8. #16
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von Steve81 Beitrag anzeigen
    ...
    Ebenfalls sollen nur bestimmte Kombinationen möglich sein z.B. nur aus 3 Werten oder aus 2-4 Werten.
    ...
    Die meisten Kombinationen berechne ich ja auch garnicht (siehe BITSUM im CODE)
    Die Aufgabe gefällt mir.

    Wenn man nur die Kombinationen aus wenigen werten Berücksichtigt kommt man ja wieder auf humane Werte.

    Im Bereich 2^10 (also 0..1023) Kommt man wenn man nach den Kombinationen aus 2,3 und 4 Einzelwerten sucht, gerade mal auf 375 zu überprüfende Kombinationen.

    Code:
    Bereich
    0..1023
    Bits     Kombinationen
        2 ->  45
        3 -> 120
        4 -> 210
    2,3,4 -> 375
    Im Bereich 2^20 (also 0..1048575) Kommt man wenn man nach den Kombinationen aus 2,3 und 4 Einzelwerten sucht, schon auf 6175 zu überprüfende Kombinationen. Was aber innerhalb einer Sekunde ja wohl zu schaffen ist.
    Code:
        
    Bereich    
    0..1048575
    Bits     Kombinationen
        2 ->  190
        3 -> 1140
        4 -> 4845
    2,3,4 -> 6175
    If you open your Mind too much, your Brain will fall out.

  9. #17
    Registriert seit
    06.10.2003
    Beiträge
    3.414
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Ich glaube, es ist vielleicht besser, nicht alle Kombinationen zu berechnen.


    möglicher Ansatz:
    1. Die ersten (oder beliebige) der Werte aufaddieren, bis der Sollwert über- oder unterschritten ist (kleinste absolute Abweichnug verwenden).
    2. SCHLEIFE:
    3. Anschließend die Differenzen jedes verwendeten Wertes zu den verblieben Werten ermitteln.
    4. Sollwertabweichung mit den soeben berechneten Differenzen vergleichen und Austausch mit dem Wert, mit dessen Differenz eine beste Sollwertanpassung erreicht wird.
    5. Solange ein Austausch stattgefunden hat, Schleife wiederholen
    6. Hat kein Austausch stattgefunden, wurde das Optimum erreicht.
    Sicherlich nicht einfach zu programmieren, vielleicht aber möglich.


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  10. #18
    Avatar von Steve81
    Steve81 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.06.2007
    Ort
    In der Pfalz
    Beiträge
    503
    Danke
    72
    Erhielt 77 Danke für 65 Beiträge

    Standard

    Hallo,

    also ich mache es in meinem Programm bereits so, dass ich nur bei den zulässiges Kombinationen was die Einzelwertmenge betrifft weiterrechne.
    Anzahl_p_P_min und Anzahl_p_P_max sind die min und max Stückzahl pro Packung. (z.B. 3 oder 2-4 Schnitzel pro 500g Pack)
    Code:
    FOR I := forCount TO forCount + 127 DO 
            HBits := BITSUM (IN :=  DINT_TO_DWORD(INT_TO_DINT(I)));               
     
            IF (HBits >= Anzahl_p_P_min) AND (HBits <= Anzahl_p_P_max) THEN
    dann übergebe ich die Werte an den FC63 der mir den minimalen den maximalen und die Summe der Einzelwerte zurück liefert.
    Code:
    IST := 0;
            J := 1;
            S := 1;
            T := 10;    
                FOR X := 1 TO 10 DO                
                    wordi := INT_TO_WORD(I);
                    wordj := INT_TO_WORD(J);
                    wordk := wordi AND wordj;                                                                                      
                    IF wordk<>0 THEN                    
                        
                        Gewichtesort [S] := GEWICHTE [X] ;
                        S := S + 1 ;
                    ELSE
                        Gewichtesort [T] := 0 ;
                        T := T - 1 ;                
                    END_IF ;                            
                    J := J * 2 ;
                END_FOR ;
     
                ADR := 0 ;
                FOR U := 1 TO 10 DO                                
                    WORD_TO_BLOCK_DB(DBNRW) .DD[ADR] := REAL_TO_DWORD(Gewichtesort[u]) ;
                    ADR := ADR + 4;
                END_FOR ;
     
            FC63 (DBNR:=3, MNR:=0, ANZ:=HBits, MAXIMUM:=MAXIMUM, MINIMUM:=MINIMUM, SUMME:=IST);
    dann prüfe ich ob die zurückgelieferten Werte in der Toleranz sind
    Code:
    IF (MAXIMUM <= max_Gewicht_p_St) AND (MINIMUM >= min_Gewicht_p_St) AND ((MAXIMUM - MINIMUM) <= Max_Diff_max_min) AND (IST <= (Sollgewicht + max_Plus_Abw_Soll)) AND (IST >= Sollgewicht) THEN
    und erst wenn das alles zutrifft, prüfe ich ob die jetztige Kombination die nähste an meinem Sollwert ist. Habe ich genau den sollwert, setze ich I auf 1024 damit die äusere FOR-Schleife bgebrochen wird.
    Code:
    IF IST = Sollgewicht THEN
                        ISTIDEAL := IST ;
                        SPEICHER := I ;
                        BITSUMME := HBits ;            
                        I := 1024 ;
     
                    ELSIF (IST > ISTIDEAL) AND (Sollgewicht > ISTIDEAL) THEN
                        ISTIDEAL := IST ;
                        SPEICHER := I ;
                        BITSUMME := HBits ;
     
                    ELSIF (Sollgewicht < ISTIDEAL) AND (IST < ISTIDEAL) AND (Sollgewicht < IST) THEN
                        ISTIDEAL := IST ;
                        SPEICHER := I ;
                        BITSUMME := HBits ;
     
                    END_IF ;

    Ich häng jetzt noch das Projekt an, falls jemand lust hat zu testen und freu mich über jede (konstruktive) Kritik und Vorschläge zur Verbesserung.

    die SCL-Quelle "Gewichtberechnung FB11" arbeitet den Baustein in einem Zyklus ab, die Quelle "test" in mehreren Zyklen.
    Beide Quellen erstellen den FB 11.

    Die Toleranzvorgaben stehen in DB101 bis DB109. Die die für das jeweilige Produkt genutzt wertden, werden in DB100 geladen (mit FC303).
    Angehängte Dateien Angehängte Dateien

  11. #19
    Avatar von Steve81
    Steve81 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.06.2007
    Ort
    In der Pfalz
    Beiträge
    503
    Danke
    72
    Erhielt 77 Danke für 65 Beiträge

    Standard

    Zitat Zitat von zotos Beitrag anzeigen
    Die Aufgabe gefällt mir.

    Wenn man nur die Kombinationen aus wenigen werten Berücksichtigt kommt man ja wieder auf humane Werte.

    Im Bereich 2^10 (also 0..1023) Kommt man wenn man nach den Kombinationen aus 2,3 und 4 Einzelwerten sucht, gerade mal auf 375 zu überprüfende Kombinationen.

    Code:
    Bereich
    0..1023
    Bits     Kombinationen
        2 ->  45
        3 -> 120
        4 -> 210
    2,3,4 -> 375
    Im Bereich 2^20 (also 0..1048575) Kommt man wenn man nach den Kombinationen aus 2,3 und 4 Einzelwerten sucht, schon auf 6175 zu überprüfende Kombinationen. Was aber innerhalb einer Sekunde ja wohl zu schaffen ist.
    Code:
        
    Bereich    
    0..1048575
    Bits     Kombinationen
        2 ->  190
        3 -> 1140
        4 -> 4845
    2,3,4 -> 6175
    Hallo Zotos,

    mit welcher Gleichung kommst du auf die Kombinationsmöglichkeiten?
    Entweder es ist nicht so einfach zu errechnen oder ich steh aufm Schlauch!

  12. #20
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das ist wie bei den Lottozahlen nur statt 6 aus 49 sind es eben 3 aus 20:

    Code:
          20!
    X =--------
       17! * 3!
    bzw. 2 aus 20 oder eben 4 aus 20.
    If you open your Mind too much, your Brain will fall out.

  13. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    Steve81 (09.12.2007)

Ähnliche Themen

  1. Zykluszeit
    Von Maurice im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 17.09.2011, 15:19
  2. Zykluszeit S7-200
    Von pinolino im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 14.01.2009, 07:27
  3. Zusammenhang Zykluszeit Profibus Zykluszeit SPS
    Von Peltzerserbe im Forum Feldbusse
    Antworten: 1
    Letzter Beitrag: 28.04.2008, 22:09
  4. S7-317 2-DP Zykluszeit
    Von gustave im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.06.2007, 10:19
  5. Zykluszeit bei OB`s
    Von slaesh im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.10.2005, 18:00

Lesezeichen

Berechtigungen

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