Step 7 Maximale Lebenssdauer eines Bit innerhalb eines 24h Zyklus messen und anzeigen lassen

Tyler

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

wie im Titel bereits beschrieben möchte ich die maximale Lebensdauer eines "1" Signals möglichst mit geringem Programmaufwand in Erfahrung bringen.

Beschreibung :
Eine Altsandklappe belegt einen ini. sofern Sand über ein Band läuft,
bei unterschiedlichen Sandsorten belegt der Ini mal länger und mal kürzer.
Der Messzyklus sollte knapp 24h laufen, der "höchst gemessene Wert" somit immer gespeichert bleiben.

Von der Idee her bin ich soweit, über einen Vorwärts Zähler ein Takt mit dem Signal zu verunden und den selbigen als UN dem Zähler einen Reset auf null zu geben, nur würde er ja dann das Ergebnis gleich mit platt machen. Daher würde ich eine Palette an Vergleichern dahinter setzen mit Unterschiedlichen Zählerständen um somit die Häufigkeit an Ergebnissen etwas einzuschränken.

Nur, gibt es vllt noch eine weit aus bessere Lösung?

Bin für Rat dankbar.

Grüße
 
Es gibt eine Routine die nennt sich Bubblesort. Da findest du hier im Forum gute Beispiele. Dies scheint mir perfekt für deine Anwendung zu sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Weitaus bessere" Standard-Lösung: ;)
Solange das Signal 1 ist die Zeit zählen (#OB1_PREV_CYCLE aufsummieren oder 100ms-Takt oder Taktmerker oder OB35)
Wenn Signal fallende Flanke dann Zählerstand mit bisherigem MaxWert vergleichen. Wenn größer, dann Zählerstand als neuen Maxwert übernehmen.

Harald
 
Das klingt nach der perfekten Lösung, bin allerdings eher in S5 oder Roth/Iropa am programmieren, mit S7 fehlt mir der Umgang die richtigen Bausteine zu finden.
Könntest du mir das noch einmal bitte genauer formulieren?

Liebe Grüße
und vielen dank schon mal im voraus.

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.
Du benötigst keine weiteren Bausteine, sondern musst
nur addieren lassen und vergleichen.


Der OB1 enthält in seiner Variablendeklaration die
letzte Zykluszeit.
Die summierst du auf, solange dein Sensor belegt
ist und speicherst die Summe.
Durch einen Vergleich mit der vorherigen gespeicherten
Summe entscheidest du, ob der aktuell aufsummierte
Wert grösser oder kleiner ist.

Wenn grösser, dann den vorherigen Wert überschreiben.
Wenn kleiner, den vorherigen Wert behalten.

Bei Tageswechsel (Uhrzeit und Tages-Code sind auch
im OB1 enthalten) fängst du wieder von neuem an.


Ebenso geht es mit einem der Taktmerker, die du in
den CPU-Eigenschaften festlegen kannst.

Wenn dein Sensor belegt ist und dein gewählter
Taktmerker =1 wird, mit einer Flanke dein Zählergebnis
erhöhen.
Anschliessend wieder der Vergleich und Ergebnis speichern
wie oben beschrieben.


Mit dem OB35 löst du eine zyklische Bearbeitung in festen
Zeitintervallen aus.
Auch hier kannst du bei jedem Aufruf aufaddieren solange
dein Sensor belegt ist.
Alles weitere wie oben beschrieben.


Such dir eine Variante aus und poste dein Ergebnis. Es wird dir
dann auch sicher geholfen ! :)
 
Maximale Dauer eines Signals ermitteln

Oooch, für die paar Programmzeilen braucht man doch keinen Baustein...
Nach der tollen Beschreibung von SoftMachine habe ich mal ein paar Varianten programmiert.
(Das nächste mal wird aber nicht mehr vorgesagt. ;) )


Zunächst im OB1: OB1_PREV_CYCLE als DINT global verfügbar machen
Code:
      L     #OB1_PREV_CYCLE             //Cycle time of previous OB1 scan (milliseconds)
      T     "diOB1_PREV_CYCLE"
      NOP   0                           //(damit das als MOVE in FUP/KOP darstellbar ist)

Die nachfolgenden Beispiele im OB1 oder in einem vom OB1 aufgerufenen FC oder FB programmieren.

A) Eine Variante in FUP/KOP (*) wie in Beitrag #3 vorgeschlagen:
Code:
      U     E      0.0
      =     L     22.0
      U     L     22.0
      SPBNB _001
      L     "diAktZeitms"
      L     "diOB1_PREV_CYCLE"
      +D    
      T     "diAktZeitms"
_001: NOP   0
      U     L     22.0
      FN    M     10.0
      =     L     22.1
      U     L     22.1
      U(    
      L     "diAktZeitms"
      L     "diMaxZeitms"
      >D    
      )     
      SPBNB _002
      L     "diAktZeitms"
      T     "diMaxZeitms"
_002: NOP   0
      U     L     22.1
      SPBNB _003
      L     0
      T     "diAktZeitms"
_003: NOP   0

B) Eine Variante in FUP/KOP (*) mit mitlaufender Übernahme eines neuen MaxWertes:
Code:
      U     E      0.0
      =     L     22.0
      U(    
      U     L     22.0
      SPBNB _004
      L     "diAktZeitms"
      L     "diOB1_PREV_CYCLE"
      +D    
      T     "diAktZeitms"
      UN    OV
      SAVE  
      CLR   
_004: U     BIE
      )     
      U(    
      L     "diAktZeitms"
      L     "diMaxZeitms"
      >D    
      )     
      SPBNB _005
      L     "diAktZeitms"
      T     "diMaxZeitms"
_005: NOP   0
      U     L     22.0
      NOT   
      SPBNB _006
      L     0
      T     "diAktZeitms"
_006: NOP   0

C) Eine reine AWL-Variante: (die gefällt mir am besten :cool: )
Code:
      U     E      0.0                  //Initiator belegt?
      SPB   CNT                         //ja, springe zu zählen
//nein, Initiator nicht belegt: Zeitzähler löschen
      L     0
      T     "diAktZeitms"
      SPA   CNTE                        //nichts weiter zu tun

//Initiator belegt: MessZeit zählen
CNT:  L     "diAktZeitms"
      L     "diOB1_PREV_CYCLE"
      +D    
      T     "diAktZeitms"
//aktuelle MessZeit > bisheriger MaxWert ?
      L     "diMaxZeitms"
      >D    
      SPBN  CNTE                        //nein, nichts tun
//ja, aktueller Zeitwert als neuer Maxwert übernehmen
      TAK                               //"diAktZeitms" in AKKU1 holen
      T     "diMaxZeitms"               //und als neuer MaxWert übernehmen

CNTE: SET

D) Und in SCL:
Code:
    IF NOT xSignal THEN
        diAktZeitms := 0 ;
    ELSE
        diAktZeitms := diAktZeitms + diOB1_PREV_CYCLE ;
        IF diAktZeitms > diMaxZeitms THEN
            diMaxZeitms := diAktZeitms ;
        END_IF;
    END_IF;

Symbole der Variablen:
Code:
diOB1_PREV_CYCLE  MD12  DINT  Dauer letzter OB1-Zyklus in ms
diAktZeitms       MD16  DINT  Dauer der laufenden Messung in ms
diMaxZeitms       MD20  DINT  bisheriger MaxZeitWert in ms

Die Varianten zählen in ms, der DINT-Zähler "diAktZeitms" reicht für eine Messdauer > 24 Tage
Zum Starten einer neuen Messreihe einfach 0 in "diMaxZeitms" schreiben.

Zum übernehmen der FUP/KOP-Varianten die Ansicht im Editor auf AWL stellen, den Code von hier kopieren und in ein leeres Netzwerk einfügen. Dann die Ansicht auf FUP oder KOP umstellen. Voilà!

Harald
 

Anhänge

  • KOP_A.gif
    KOP_A.gif
    7,1 KB · Aufrufe: 29
  • KOP_B.gif
    KOP_B.gif
    6,1 KB · Aufrufe: 25
Also echt Klasse Leute :)
Ich fahr gleich auf arbeit und werd dann berichten für welche der Varianten ich mich entschieden habe.

Bin leider nur gemeiner kleiner Elektriker der niemals einen S7 Kurs bekommen hat, tipps und Kniffe kenne ich nur aus Erfahrung oder eben Büchern.

Also vielen Dank mal bis dahin,
Tyler
 
Zuletzt bearbeitet:
Solange man damit täglich auf einem gewissen Niveau arbeitet, bleibt sicher mehr hängen ;-)

Also Variante c arbeitet einwandfrei ! Ihr seid Klasse, dankeschön.
 
Zurück
Oben