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

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 68

Thema: Todes-Schleife...

  1. #41
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Hawkster Beitrag anzeigen
    Is genauson Befehl wie "INC", "DEC" usw. Befehle wos gibt aber man einfach nicht benutzt
    Nur dass die Befehle nicht zum Spaß drin sind.
    Zeitvergleich (CPU 317):

    L 1 // 0,05 µs
    +I // 0,2 µs

    INC 1 // 0,1 µs

    Bei deiner 100er Schleife sind das 25 µs zu 10 µs.

    Ansonsten schau ich auch nicht so auf die Ausführungszeit, aber bei Schleifen ist das schon sinnvoll.

  2. #42
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Zitat Zitat von Zottel Beitrag anzeigen
    Code:
          L     0
          T     #LK_Temp.Zaehler
     
    LP01: NOP   0
    //==> Aktion Start
     
     
    //==> Aktion Ende
     
          L     #LK_Temp.Zaehler
          L     1
          +I    
          T     #LK_Temp.Zaehler
     
          U(    
          L     100
          L     #LK_Temp.Zaehler
          <=I   
          )     
          SPB   LE01
          SPA   LP01
     
    LE01: NOP   0
    //FERTIG :D
    In diesem Fall führt ein beim Eintritt in die Schleife gelöschtes VKE dazu, daß der Sprung zu LE01 nie ausgeführt wird.
    @Zottel: Mit Verlaub, aber das ist Blödsinn.

    @Hawkster: Kannst du mal noch die "Aktion" posten?
    "arbeite klug, nicht hart" - deutsches Sprichwort

  3. #43
    Registriert seit
    08.12.2006
    Ort
    Kleinwallstadt
    Beiträge
    90
    Danke
    4
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ich kanns jetzt net testen, aber für dich mach ich morgen mal das U( ) raus. Das erklärt dennoch nicht, warums bei mir geht wenn ichs anschau, und bei anderen net...

    Und dies ist nicht der Fehler weil das MW (mit dem wirs schon getestet haben) nie über die 100 kommt Und das er die Zusätzlich benötigten 65535 Zyklen durchführt, von denen Zufällig die Restlichen 32668 Zyklen (bei 32768 kommt ja Überschlag) das VKE 0 ist, um nicht rauszuspringen, ist unwahrscheinlich

    Also ist das Prob wo anders
    Das Softwarebusiness ist Binär, du bist eine 1 oder eine 0 - Lebendig oder Tod...

  4. #44
    Registriert seit
    08.12.2006
    Ort
    Kleinwallstadt
    Beiträge
    90
    Danke
    4
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ok... nun mal der Komplette Code (welcher Derzeit nicht drin ist).
    Also ich nehm mal das komplette NW

    Code:
          NOP   0
    //#############################################################
    //### Konfigurationen beschreiben
    //#############################################################        
          L     100
          T     #LK_Temp.CNF_Schleifen_Anzahl
    
          L     23                          //0-23 (array)
          T     #LK_Temp.CNF_Leistungsklasse_Max
    
    //#############################################################
    //### Ablöschen der aktuellen Werte der Leistungsklassen
    //#############################################################        
          L     0
          T     "DB_DH_Speicher_1".Leistungsklasse[1]
          T     "DB_DH_Speicher_1".Leistungsklasse[2]
          T     "DB_DH_Speicher_1".Leistungsklasse[3]
          T     "DB_DH_Speicher_1".Leistungsklasse[4]
          T     "DB_DH_Speicher_1".Leistungsklasse[5]
          T     "DB_DH_Speicher_1".Leistungsklasse[6]
          T     "DB_DH_Speicher_1".Leistungsklasse[7]
          T     "DB_DH_Speicher_1".Leistungsklasse[8]
          T     "DB_DH_Speicher_1".Leistungsklasse[9]
          T     "DB_DH_Speicher_1".Leistungsklasse[10]
          T     "DB_DH_Speicher_1".Leistungsklasse[11]
          T     "DB_DH_Speicher_1".Leistungsklasse[12]
          T     "DB_DH_Speicher_1".Leistungsklasse[13]
          T     "DB_DH_Speicher_1".Leistungsklasse[14]
          T     "DB_DH_Speicher_1".Leistungsklasse[15]
          T     "DB_DH_Speicher_1".Leistungsklasse[16]
          T     "DB_DH_Speicher_1".Leistungsklasse[17]
          T     "DB_DH_Speicher_1".Leistungsklasse[18]
          T     "DB_DH_Speicher_1".Leistungsklasse[19]
          T     "DB_DH_Speicher_1".Leistungsklasse[20]
          T     "DB_DH_Speicher_1".Leistungsklasse[21]
          T     "DB_DH_Speicher_1".Leistungsklasse[22]
          T     "DB_DH_Speicher_1".Leistungsklasse[23]
          T     "DB_DH_Speicher_1".Leistungsklasse[24]
          T     "DB_DH_Speicher_1".Leistungsklasse[25]
    
    //#############################################################
    //### Schleife 
    //#############################################################        
          L     0
          T     #LK_Temp.Zaehler
          T     #LK_Temp.PTR_SRC_Leistungsklasse
          T     #LK_Temp.PTR_DEST_Leistungsklasse
          T     #LK_Temp.Leistungsklasse
    
    
    LP01: NOP   0
    //#############################################################
    //### Aktion Start
    //#############################################################        
    //==> Pointer der Leistungsklassen-Quelle
          L     #LK_Temp.Zaehler
          L     50                          //<== Sprungweite
          *I    
          L     140                         //<== Start-Wert
          +I    
          L     P#1.0
          *D    
          T     #LK_Temp.PTR_SRC_Leistungsklasse
    
    //==> Kopieren der Leistungsklasse in Temp-Var
          AUF   "DB_DH_Speicher_1"
          L     DBW [#LK_Temp.PTR_SRC_Leistungsklasse]
          T     #LK_Temp.Leistungsklasse
    
    //==> Leistungsklasse im Toleranz-Bereich
          U(    
          L     0
          L     #LK_Temp.Leistungsklasse
          <=I   
          )     
          U(    
          L     #LK_Temp.Leistungsklasse
          L     #LK_Temp.CNF_Leistungsklasse_Max
          <=I   
          )     
          SPB   LVAL                        //Leistungsklasse Gültig (Valid)
          SPA   LINV                        //Leistungsklasse UnGültig (InValid)
    
    LVAL: NOP   0
    //==> Pointer der Leistungsklassen-Ziel
          L     #LK_Temp.Leistungsklasse
          L     2                           //<== Sprungweite
          *I    
          L     0                           //<== Start-Wert
          +I    
          L     P#1.0
          *D    
          T     #LK_Temp.PTR_DEST_Leistungsklasse
    
    //==> Entsprechende Leistungsklasse um eins erhöhen
          AUF   "DB_DH_Speicher_1"
          L     DBW [#LK_Temp.PTR_DEST_Leistungsklasse]
          L     1
          +I    
          T     DBW [#LK_Temp.PTR_DEST_Leistungsklasse]
    
          SPA   LEND
    
    LINV: NOP   0
    //==> Unbekannte Leistungsklasse um eins erhöhen
          L     "DB_DH_Speicher_1".Leistungsklasse[25]
          L     1
          +I    
          T     "DB_DH_Speicher_1".Leistungsklasse[25]
    
          SPA   LEND
    
    LEND: NOP   0
    
    //#############################################################
    //### Aktion Ende
    //#############################################################        
          L     #LK_Temp.Zaehler
          L     1
          +I    
          T     #LK_Temp.Zaehler
    
          U(    
          L     #LK_Temp.CNF_Schleifen_Anzahl
          L     #LK_Temp.Zaehler
          <=I   
          )     
          SPB   LE01
          SPA   LP01
    
    LE01: NOP   0
    Können wir uns nun einmal von dem VKE0-Prob lösen und zum Thema zurückkehren.
    Und ja, der Code funktioniert... solange ich ihn anschau
    Das Softwarebusiness ist Binär, du bist eine 1 oder eine 0 - Lebendig oder Tod...

  5. #45
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Zitat Zitat von Hawkster Beitrag anzeigen
    Ich kanns jetzt net testen, aber für dich mach ich morgen mal das U( ) raus.

    ... danach kannste den "Danke-Button" klicken
    "arbeite klug, nicht hart" - deutsches Sprichwort

  6. #46
    Registriert seit
    18.02.2009
    Ort
    Köln
    Beiträge
    196
    Danke
    54
    Erhielt 15 Danke für 5 Beiträge

    Standard

    Na ich hoffe mal auf eine genauso spannende Fehlersuche/Disskusion wie heute!
    Es macht echt Spaß in diesem Forum mitzulesen.Alle sind respektvoll und man kann was lernen.

    Gruß Rene

  7. #47
    Registriert seit
    15.10.2007
    Ort
    St.Pölten
    Beiträge
    875
    Danke
    98
    Erhielt 200 Danke für 188 Beiträge

    Standard

    Alle sind respektvoll
    Träum weiter.Hier gibt welche die wissen nicht mal,dass es dieses Wort überhaupt gibt.
    ist jetzt nicht auf dieses thema bezogen.
    Gute nacht
    Beginne jeden Tag mit einem lächeln,es kann dir nämlich während des Tages sehr schnell vergehen.

  8. #48
    Registriert seit
    08.12.2006
    Ort
    Kleinwallstadt
    Beiträge
    90
    Danke
    4
    Erhielt 2 Danke für 2 Beiträge

    Standard

    ok... jetzt bin ich neugierig

    2 Fälle:
    Code:
    U M0.0  //VKE0
    U(
    L 100
    L #Zaehler
    >=I
    )
    SPB Anfang
    SPA ENDE
    Code:
    U M0.0  //VKE0
    L 100
    L #Zaehler
    >=I
    SPB Anfang
    SPA ENDE
    In meinen Augen geht beides in die Hose. Du jedoch behauptest der 2. Fall wird klappen...

    Ok, Höre grade im unteren Fall wird nur der Vergleicher beim Absprung berücksichtigt.... das muss ich gleich ma Testen morgen Wenn Ja, Sorry all, dann habt ihr recht. Dennoch isses net das Prob
    Geändert von Hawkster (31.03.2009 um 23:14 Uhr) Grund: Teilweise Einsicht :)
    Das Softwarebusiness ist Binär, du bist eine 1 oder eine 0 - Lebendig oder Tod...

  9. #49
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    genau so ist das...
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg VKE.JPG (15,2 KB, 38x aufgerufen)
    Geändert von SPSKILLER (31.03.2009 um 23:24 Uhr) Grund: JPG
    "arbeite klug, nicht hart" - deutsches Sprichwort

  10. #50
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von SPSKILLER Beitrag anzeigen
    @Zottel: Mit Verlaub, aber das ist Blödsinn.
    So, das mußte ich jetzt überprüfen, inwieweite es Blödsinn ist...Ergebnis: Es ist TEILWEISE Blödsinn.
    Ich habe also beide Schleifen auf einer 315 getestet.
    Die Durchläufe mußte ich auf 50 reduzieren, mit 100 bekam ich Zykluszeit-Überschreitungen.
    Das wesentliche, was ich Hawkster mitteilen wollte, war eigentlich:
    Seine Schleife hat einen bedingten Aussprung und danach einen unbedingten Rücksprung.
    Wegen dem U( wird sein bedingter Aussprung ausgeführt, wenn das unmittelbar vor dem Vergleich vorliegende VKE 1 ist UND der Schleifenzähler >= 100.
    Ist das VKE davor 0, so wird der Aussprung nie ausgeführt.
    Meine geänderte Schleife würde stattdessen in dem Fall die Schleife einmal und den Rücksprung nie ausführen. Das wäre immerhin einfacher zu beobachten.
    Meine Schleife, M76.0 bestimmt das VKE beim Eintritt:
    Code:
          U     M     76.0
    
          L     0
          T     #TEMP0
    
    M001: NOP   0
          L     #TEMP0
          L     1
          +I    
          T     #TEMP0
    
          U(    
          L     50
          L     #TEMP0
          >I    // 
    //      <=I   
          )     
          SPB   M001  //
    //      SPB   M002
    //      SPA   M001
    M002: NOP   0
    
          L     #TEMP0
          T     MW    84
    Diese Schleife wiederholt nur, wenn M76.0 =1, dann steht 50 im MW84, sonst 1.
    Mein Satz über seine Version "In diesem Fall führt ein beim Eintritt in die Schleife gelöschtes VKE dazu, daß der Sprung zu LE01 nie ausgeführt wird."
    ist Blödsinn. Der Grund ist aber subtil. Zitat aus der Hilfe zu SPB:

    "Wenn VKE = 0, wird der Sprung nicht ausgeführt. Das VKE wird auf "1" gesetzt, und der Programmablauf wird mit der folgenden Anweisung fortgesetzt."
    Wenn also Hawksters Schleife den 1. Durchlauf absolviert, stößt sie in jedem Fall auf eine unerfüllte Bedingung. SPB springt nicht, setzt aber das VKE auf 1.
    Der nächste und alle weiteren Durchläufe verknüpft diese 1 mit dem Ergebnis des Vergleichs, so daß der Abbruch und die Schleife funktionieren.

    Resultat:
    1. Ich habe dazugelernt. SPB beeinflußt das VKE.
    2. Das hat wahrscheinlich keinen praktischen Wert für Hawkster, weil sich in dem "Aktionsteil" andere Operationen befinden, die das VKE beeinflußen.
    3. Ich habe nochmal dazugelernt. Ich hatte Bedenken bei CLR. Funktioniert aber, weil: CLR setzt nicht nur VKE auf 0 (was ALLEINE für Hawkster fatal wäre), sondern auch /ER auf 0, so daß das U( nicht keine Erstabfrage ist, also zur Erstabfrage wird und damit de facto das VKE aus dem Vergleich GELADEN und nicht VERKNÜPFT wird.
    4. Eine möglichst einfache Programmierung ist immer vorzuziehen.
    Hier sind überflüssig:
    - U( für die "Schönheit"
    - der bedingte Aussprung gefolgt vom unbedingten Rücksprung. Ein bedingter Rücksprung reicht.

    Etwas anderes wäre es, wenn Hawkster im "Aktionsteil" eine Zusatzbedingung auswertet. Allerdings wäre dann typischerweise ein "ODER" für den Abbruch oder ein "UND" für die Fortsetzung zu erwarten:
    Zutreffenden Datensatz gefunden ODER alle Datesätze durchsucht, dann abbrechen.
    Zutreffenden Datensatz NICHT gefunden UND nocht nicht alle Datesätze durchsucht, dann nächster Schleifendurchlauf.
    @Hawkster:
    Ich halte nicht viel von Schleifen in einem SPS-Programm. Insbesondere, wenn die Anzahl der Durchläufe variabel ist, bergen sie die Gefahr, daß ein programm plötzlich nicht mehr die "Echtzeitanforderungen" erfüllt. Halte mich für arrogant, aber zu 95% gehe ich davon aus, das du die nicht brauchst.

    Ich habe deinen Code nur "quergelesen". Aber wenn die Mehrzahl der Daten nicht in jedem Zyklus neu sind, ist es häufig vorteilhaft, zu überlegen, in welcher Weise die neuen Daten dem alten Ergebnis hinzugefügt werden können.

    Ein Beispiel:

    Vor Jahren habe ich hier mal den Bubblesort-Algorithmus in S7-AWL gepostet, weil jemand eine Tabelle für Pumpenlaufzeiten sortieren wollte. Er schaltet eine Pumpe aus, addiert die absolvierte Laufzeit zur Gesamtlaufzeit dieser Pumpe und sortiert, um beim nächsten Mal diejenige Pumpe einzuschalten, die am wenigsten gelaufen hat.
    Für seine 5 oder 7 Pumpen ist es belanglos, aber für 100 Pumpen sind es 4950 Durchläufe der inneren Schleife (nimmt mit n^2-n/2 zu).
    Der effizientere Weg ist dann:
    - Den neuen Platz mittels "binary search" ermitteln.
    - Alle alten Vorgänger in eine neue Tabelle kopieren
    - Alle neuen Vorgänger kopieren
    - Datensatz dahinter einfügen
    - alle Nachfolger dahinter kopieren.
    Geändert von Zottel (01.04.2009 um 02:22 Uhr)

Ähnliche Themen

  1. While Schleife in ST
    Von Snooky im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 30.11.2010, 21:50
  2. for-Schleife
    Von fai004 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 26.04.2009, 19:14
  3. FOR Schleife
    Von dietere im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 19.01.2008, 02:36
  4. For Schleife in VB 6
    Von godi im Forum Hochsprachen - OPC
    Antworten: 8
    Letzter Beitrag: 14.06.2007, 10:03
  5. AWL Schleife
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 31.07.2003, 07:05

Lesezeichen

Berechtigungen

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