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

Seite 5 von 8 ErsteErste ... 34567 ... LetzteLetzte
Ergebnis 41 bis 50 von 77

Thema: Auswahlkriterium Betriebsstunden

  1. #41
    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 rs-plc-aa
    Aber ganz ehrlich ... Das mit den Schleifen hätte ich allein nicht hinbekommen.
    Schleifen sind auch etwas ungewöhnlich und etwas gefährlich in SPS-Programmen: Wenn du die Anzahl der Elemente erhöhst, nimmt die Anzahl der Durchläufe der äußeren Schleife mit n zu, bei jedem Durchlauf der äußeren Schleife werden erst n, dann immer ein Durchlauf weniger der inneren Schleife ausgeführt. Insgesamt gibt es also n*(n-1)/2 oder (n*n-n)/2 Durchläufe. Für sehr große Zahlen spielt nur noch n*n eine Rolle: Bei 1 Million Einträgen in das Telefonbuch einer Metropole ist n*n 1Billion. Ein besserer Sortieralgorithmus wie Quicksort schafft das mit n*log2(n), also ca 100000*20 = 20 Millionen Durchläufen!
    Irgendwo, vielleicht bei 50, vielleicht bei 500 Elementen geht die CPU in Stop wegen Zykluszeitüberschreitung.
    Abhilfe für längere Listen, wenn nicht oft neu sortiert werden muß: Pro Zyklus nur einen Durchlauf der Schleife ausführen.

  2. #42
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Hallo,

    so ganz auf anhieb komme ich irgendwie doch nicht weiter...

    Ich dachte mir, daß ich für die Auswertungs- und Anforderungsfunktionen einen separaten FB erstelle.

    Dieser stellt bis jetzt fest, wieviele BM´s momentan gefordert sind.

    Die geschieht zyklisch, undzwar wird die Variable zuerst mit 0 überschrieben, und dann wieder neu ermittelt wieviele es diesmal sind (kann man bei den wenigen wohl so machen...).

    Wenn diese Variable nun 0 ist liegt keine Anforderung vor.

    Wenn sie aber einen Zyklus vorher >0 war ist mal anzunehmen daß irgendwas läuft was jetzt nicht mehr laufen soll.

    Also das Spiel umgekehrt...

    Jetzt kommt aber hinzu daß das BM mit den meisten Stunden nicht unbedingt laufen muss (wenn z.B. nur eines kurze Zeit lief kann es ja sein, daß es immer noch das mit den wenigsten Stunden ist - oder daß welche nicht betriebsbereit waren etc. ....)


    Wäre es da nicht besser zur Abwahl eine andere Vorgehensweise einzuschlagen ?

    Z.B. man nimmt Bytes die in der Einschaltfolge mit der ermittelten BM-Nummer versorgt werden, und dann in umgekehrter Reihenfolge wieder ausgeschaltet werden.

    Laut meiner Denkweise komme ich aber dann (und auch schon für die Anforderung) auf eine ganze menge Vergleichsoperationen auf == Gleichheit.

    Weil ich ja so immer noch nicht konkret weiß welches BM sich hinter DB10.DBB0 verbirgt.

    Beispiel:

    DB10.DBB0 = 5 muß ja erst mal so lange verglichen werden bis das mit dem BM#5 übereinstimmt - oder nicht ?


    Vielleicht mache ich mir jetzt ein wenig unnötig in die Hose - aber es war doch mal die Rede von einem Zeiger der gleich auf das jeweilige BM verweisen würde.


    Das erschlägt dann zwar auch nicht das prüfen auf betriebsbereitschaft bzw. bei der Abwahl ob das betreffende überhaupt läuft - aber würde die Sache nicht noch mehr aufblasen.


    Daß hier natürlich mit allen Eventualitäten berücksichtigt nicht mit 20 Zeilen auszukommen ist, ist ja schon klar, aber mich würde das mit dem Pointer auch generell interessieren - und weil´s halt gerade hier passen würde...
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

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

    Standard

    Zitat Zitat von Zottel
    Ich würde die Betiebsbereitschaft nachher testen.
    Das ist jetzt kein getesteter Code, nur das Prinzip:

    Du brauchst z.B. 2 Betriebsmittel.
    Diese Information kopierts du in irgendeine Variable. Ich sag´ mal MB88.
    Du zählst MB89 hoch, da du auf jeden fall als nächste BM das mit nächstwenigeren Stunden einzuschalten versuchst.
    Das nächste ist auch nicht getestet, aber eine konkrete Umsetzung:
    Annahme : E1.0, E2.3, E3.4, E3.5, E4.1, E4.2, E6.3, E6.5, E6.6 fordern BMs an.
    mit Absicht ungeordnet und mehr als du BMS hast...

    Code:
    L 0
    UN E1.0
    SPB =NB1
    INC 1
    NB1:UN E2.3
    SPB =NB2
    INC 1
    NB2:UN E3.4
    SPB =NB3
    INC 1
    NB3:UN E3.5
    SPB =NB4
    INC 1
    NB4:UN E4.1
    SPB =NB5
    INC 1
    NB5:UN E4.2
    SPB =NB6
    INC 1
    NB6:UN E6.3
    SPB =NB7
    INC 1
    NB7:UN E6.5
    SPB =NB8
    INC 1
    NB8:UN E6.6
    SPB =NB9
    INC 1
    T MB88
    Du gehtst die Liste in DB10 durch, beginnend mit 0. Wo du bist, merkst du dir z.B. in MB89.
    Du liest aus DB10.DBB[0], daß das BM mit den wenigsten Stunden die Nummer 4 hat.
    L 0
    T MB89
    L 0
    L MB88
    SPZ NE // Wenn keine BMs mehr gebraucht werden, nix tun
    call fc17 // fc17 schaltet das nächste Betriebsmiitel ein
    nummer: MB89
    Anzahl: MB88
    L MB89
    INC 1
    T MB89 //nächste IndexNummer
    L 0
    L MB88
    SPZ NE
    call fc17 // fc17 schaltet das nächste Betriebsmiitel ein
    nummer: MB89
    Anzahl: MB88
    ...
    L MB89
    INC 1
    T MB89 //nächste IndexNummer
    L 0
    L MB89
    SPZ NE
    call fc17 // fc17 schaltet das nächste Betriebsmiitel ein
    nummer: MB89
    Anzahl: MB88
    NE: NOP0
    [/code]
    Öfter als 7 mal brauchst du das nicht machen, mehr BMs hast du ja nich...
    Der FC17 macht die Vergleiche und das Folgende:
    Du zählst MB89 hoch, da du auf jeden fall als nächste BM das mit nächstwenigeren Stunden einzuschalten versuchst.
    Nun prüfst du die Betriebsbereitschaft von Nummer 4.
    JA: Ist es bereit so schaltest du es ein und verringert MB88 um 1. Es ist nun 2-1=1. Du mußt noch 1 BM einschalten.
    NEIN: Ist es NICHT bereit so schaltest du es nicht ein und läßt MB88 wie es ist. Es ist immer noch 2. Du mußt also noch 2 BM einschalten.
    Code:
    fc17 
    in Nummer byte
    inout Anzahl byte
    A DB10
    L #Nummer
    L 8 // 8-bit-Einträge
    *I
    T LD0	// Temp index	
    L DBB[LD0]
    SPL  //Sprungverteiler, genaue Syntax aus Hilfe, es wird zu einer Marke 
    // abhängig von der BM-Nummer gesprungen:
    BM0,BM1;BM2,BM3,BM4,BM5,BM6
    
    BM0:UN E14.0 // betriebsbereit BM0
    BEB	// Ende, kann BM nicht einschalten
    SET	//VKE 1
    S A12.0	//einschalten
    SPA END1	// Ende mit reduzierter Anzahl
    
    BM1:UN E14.6 // betriebsbereit BM1
    BEB	// Ende, kann BM nicht einschalten
    S A22.1	//BM1 einschalten
    SPA END1	// Ende mit reduzierter Anzahl
    
    ...
    
    BM6:UN E15.6 // betriebsbereit BM6
    BEB	// Ende, kann BM nicht einschalten
    S  A34.6	//BM6 einschalten
    SPA END1	// Ende mit reduzierter Anzahl
    BEA			// fertig und Anzahl nicht verringern
    
    END1:
    L #Anzahl 
    DEC 1
    T #Anzahl
    BE
    Das Einschalten habe ich auf beliebige Ausgänge gelegt. Es gibt nur ein Einschalten durch den Setz-Befehl. Wie macht man nun die nicht gebrauchten BMs aus? Einfach vor dem Einschalten alle ausschalten!
    Code:
    SET
    R A 12.0
    R A 22.1
    ...
    R A34.6
    Das muß vor dem Einschalten erfolgen. Da die geänderten Zustände der Ausgänge erst am Ende des Zyklus übertragen werden, besteht keine Gefahr, daß die Schütze "rappeln".

  4. #44
    Registriert seit
    02.10.2004
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Siemensgeplagte,

    wenn ich mir das so durchlese, weiss ich wieder, warum ich von AWL immer Knoten im Hirn kriege . Hier bubblesort in ST:
    • PROGRAM bubblesort
      VAR CONSTANT
      [list:f88fb9d6a0]SORTMAX:INT:=6;
    END_VAR
    VAR
    • i: INT;
      zw: INT;
      ok: BOOL;
      sort: ARRAY[0..SORTMAX] OF WORD;
    END_VAR
    WHILE NOT ok DO
    • ok:=TRUE;
      FOR i:= 0 TO SORTMAX-1 DO
      [list:f88fb9d6a0] IF (sort [i] > sort [i + 1]) THEN
      [list:f88fb9d6a0]zw:= sort [i]; sort [i]:= sort [i + 1];
      sort [i + 1]:= zw;
      ok:=FALSE;
    END_IF[/list:u:f88fb9d6a0]END_FOR[/list:u:f88fb9d6a0]END_WHILE[/list:u:f88fb9d6a0]
    Und das Schönste daran ist: Wenn ich jetzt mal 50 statt 7 Werte sortieren will, muß ich genau einen Wert (SORTMAX) ändern. Ich liebe ST :P

    Gruß
    Andi
    Zitieren Zitieren bubblesort in st  

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

    Standard

    Ok, in ST sieht das wie in einer vernünftigen Programmiersprache aus. Eigentlich sieht es nach PASCAL aus... Habe aber kein ST-Werkzeug für S7 zur Verfügung und ich schätze, rs-plc-aa auch nicht... Eigentlich schade, daß Siemens beim Preis von Step7 ST nicht gleich mitliefert.
    Was mich noch interessieren würde, ist wie der mit ST generierte Baustein in AWL aussieht. Poste doch bitte.
    Bei meinem Vorschlag sortierst du 50 Einträge, indem du beim FC16 den Längen-Parameter auf 49 setzt. Natürlich müssen die DBs dann auch so lang sein.

  6. #46
    Registriert seit
    11.07.2004
    Beiträge
    1.597
    Danke
    10
    Erhielt 213 Danke für 183 Beiträge

    Standard

    Hallo rs-plc-aa, wenn ich Dich mal was Offtopic fragen darf, wo wohnst Du?

  7. #47
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Zitat Zitat von Oberchefe
    Hallo rs-plc-aa, wenn ich Dich mal was Offtopic fragen darf, wo wohnst Du?
    >> Zu hause - und du ? <<


    Hast du den Verdacht daß du mich kennst ?
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  8. #48
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Hallo,

    zunächst mal will ich mich entschuldigen daß ich den Thread so kurz vor dem Ende veröden ließ...

    Mir war es leider nicht möglich nur einen Handschlag daran weiter zu machen.


    Einen riesen Dank will ich an Zottel aussprechen, der geduldig die Sache bis dahin mitgemacht hat.

    ============================================
    @ Oberchefe:

    Ich hoffe du bist nicht sauer wegen meiner "Gegenfrage" auf deine Frage...

    Ich war irgendwie perplex, und konnte mir nicht richtig vorstellen was mein Wohnort jetzt damit zu tun haben soll...

    ============================================



    Ich schrieb ja zu Anfangs daß ich diesen Baustein erst "demnächst" brauche...

    Dieses "demnächst" wird wohl dieses Jahr eh nix mehr weswegen jetzt die ganze Zeit andere Dinge einfach Vorrang hatten...


    Ich will aber den Thread auf jeden Fall wiederbeleben wenn es soweit ist.



    Bis dahin...
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  9. #49
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Hallo,

    nun habe ich die Arbeit an dieser Aufgabe wieder aufgenommen...



    Ich bin - glaube ich - auch schon ziemlich weit gekommen mit den bisher geposteten Ideeen (--> besonderer Dank an Zottel ! ) ...


    Mein momentaner Stand sieht ungefähr so aus:


    Die Sortierung selbst funktioniert ja bereits.

    Im Index DB stehen nun in absteigender Reihenfolge die BM´s

    Die Auswertung ist quasi fertig - die Funktion die Einschaltet eigentlich auch ?? .


    Hier wird ja eine Sprungleiste verwendet (was ja eigentlich eine super sache ist wenn man es mal kapiert hat...) - und genau hiermit habe ich noch ein Problem.


    in dem Beispielcode von Zottel (FC 17) steht am Anfang folgendes:


    Code:
          AUF   DB 10
          L     #Nummer
          L     8                           // 8-bit-Einträge 
          *I    
          T     LD    12                    // Temp index    
          L     DBB &#91;LD 12&#93;
    
          SPL ...

    Was ich dabei noch nicht verstanden habe ist warum #Nummer mit 8 multipliziert wird.


    Ziel des Ganzen ist ja aus meiner Sicht daß anhand von der übergebenen Variable #Nummer die Sprungleiste angewiesen wird z.B. DBB 0 aus dem IndexDB zu selektieren.


    Was ich dabei wieder gar nicht verstehe ist wie der Bezug von dem Byte im IndexDB zum realen BM hergestellt wird.


    Wenn z.B. im IndexDB das BM 4 an erster Stelle steht ( DBB 0 ) und die Sprungleiste holt sich das DBB 0 aus dem Index DB --> woher soll sie nun wissen daß es das BM 4 ist für das der Ausgang geschaltet werden soll ???



    Das ist eigentlich auch gerade meine einzige "Sorge" an dem ganzen...


    Besten Dank schon mal für mein "Aha Erlebnis" auf das ich noch warte ...
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  10. #50
    Registriert seit
    16.12.2004
    Ort
    Schleswig-Holstein
    Beiträge
    400
    Danke
    21
    Erhielt 23 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das muss x8 multipliziert weil Pointers haben den Format Byte.Bit. D.h. wenn du Dein Offset eingibst wenn Du nichts weiteres machst, hast ein Offset in Bits. Es wurde vielleicht klarer aussehen wenn man stat

    L Offset
    L 8
    *D
    T LD0

    einfach

    L Offset
    SLD 3 //shift Double Word Left 3 Bits
    T LD0

    aber im Prinzip ist es dasselbe, aber wenn Du den Fall Offset = 1 nimmst und Dich vorstellt wie der AKKU1 vorher und nachher aussieht, vielleicht verstehst Du es besser.

Ähnliche Themen

  1. Display für S7-300 (Betriebsstunden etc.)
    Von superkato im Forum HMI
    Antworten: 8
    Letzter Beitrag: 25.11.2010, 17:18
  2. Betriebsstunden Umschaltung zweier Pumpen
    Von rene im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 06.09.2007, 14:52
  3. betriebsstunden speichern
    Von Merlin115 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 18.11.2006, 10:42
  4. Maschienenstart nach Betriebsstunden
    Von mst im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 07.11.2005, 20:37
  5. Betriebsstunden erfassen und auswerten
    Von Anonymous im Forum Programmierstrategien
    Antworten: 14
    Letzter Beitrag: 11.08.2005, 08:35

Lesezeichen

Berechtigungen

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