Stillstände in DB schreiben

roadrunner

Level-1
Beiträge
58
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte Anlagenstillstände aufzeichnen und in einen DB schreiben.
Im DB sollen dann in weiterer Folge Stillstände von einem definierten Zeitraum (Schicht, oder Tag) gespeichert werden, um 1-2 Tage zurückverfolgen zu können.

Nun mein Problem dabei
Wie bekomme ich die Daten hintereinender in einen Datenbaustein?

Hier mein Code um 1 Stillstand mit einer Mindeststillstands- und Mindestlaufzeit zu erfassen.
Über 2 Zeitstempel um daraus die Stillstandszeit zu berechnen.

Code:
      UN    #IN_Laufsignal
      =     #IN_zeit1
 
      CALL  #Zeit1
       IN:=#IN_zeit1
       PT:=T#5S
       Q :=#Q_zeit1
       ET:=
 
      U     #Q_zeit1
      FP    #flanke_1
      S     #stillstand
      SPBN  hop1
 
      CALL  "READ_CLK"
       RET_VAL:=#SFC1_retval_1
       CDT    :="DB_Stillst".Stillstand[1].datumzeit_stop
 
hop1: U     #IN_Laufsignal
      U     #stillstand
      =     #IN_zeit2
 
      CALL  #Zeit2
       IN:=#IN_zeit2
       PT:=T#5S
       Q :=#Q_zeit2
       ET:=
 
      U     #Q_zeit2
      FP    #flanke_2
      R     #stillstand
      BEB
 
      CALL  "READ_CLK"
       RET_VAL:=#SFC1_retval_2
       CDT    :="DB_Stillst".Stillstand[1].datumzeit_start
 
      CALL  "SB_DT_DT"
       DT1    :="DB_Stillst".Stillstand[1].datumzeit_start
       DT2    :="DB_Stillst".Stillstand[1].datumzeit_stop
       RET_VAL:="DB_Stillst".Stillstand[1].datumzeit_differenz

CPU 315-2 DP

roadrunner
 
Zuletzt bearbeitet:
Naja, wenns für einen klappt ist es die halbe Miete.
Wenn die Maschine wieder anläuft kopierst du zB

[9] -> [10]
[8] -> [9]
.
.
.
[0] -> [1]

der letzte fliegt dann immer raus.

Ob das mit einem SFC20 - BLKMOV - Befehl auch geht entzieht sich meiner Kenntnis, habe mal gelesen Quelle und Ziel Bereich dürfen sich nicht überlappen.

lG
Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An umkopieren mit SFC20 hatte ich auch gedacht, aber das ist nicht die "schönste" Lösung für sagen wir mal 40 Stillstandsaufzeichnungen oder?

Ich würde umkopieren. 40 Aufzeichnungen sind ja wohl im grünen Bereich,
und es kann immer auf eine feste Adresse geschrieben werden.
 
Ja klar, aber wie adressiere ich das?
Zugriffsbreite DT 8 Byte?

An umkopieren mit SFC20 hatte ich auch gedacht, aber das ist nicht die "schönste" Lösung für sagen wir mal 40 Stillstandsaufzeichnungen oder?

Kannst auch eine Schleife programmieren:
Kannst ja Doppelwertweise von hinten weg kopieren.

Dass der Inhalt unterschiedliche Typen (Word, Real, etc) hat ist egal.
Wenn das "Fach" [1] zB 20 Bytes hat und du 40 Aufzeichnungen willst.
Ist der DB 800 Bytes lang.

Also Schleife von 776 bis 0 in vierer-Schritten.

L DBD [AR1, #P0.0]
T DBD [AR1, #P20.0]


lG
Karl
 
Verstehe Deinen Gedanken, Du musst nicht 40x kopieren, das geht ja in einem Arbeitsgang.....

Nur der BLKMOV kann das vielleicht nicht... müsste man probieren.

lG
Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würde von oben beginnend vollschreiben (stichwort: iIndex = startadresse) - der zeitstempel ist ja mit drinnen ...

das spart zykluszeit und hat genau den selben effekt...
 
Was soll sein wenn alle halben Stunde eine Schleife läuft?
Man spart sich damit das ind. addr. Reinschreiben der einzelnen Parameter.

ich bin an wenig zykluszeitschwankung interessiert ... die funktion mit dem umkopieren erhöht wesentlich mehr, als in einen anderen bereich zu schreiben ... echtzeitfähigkeit! - innerhalb einer spezifizierten zeit eine antwort erhalten, mit schwankungen eher nich so doll ...

außerdem kann man das grundgerüst, sofern man es herrauslöst, auch für andere aufgaben herzuziehen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja stimmt, es muss ja nicht unbedingt der neueste Eintrag oben stehen wie beim FIFO.

Also die erfassten DT Zeitstempel in eine Temp Var dann blockweise in 4 Bytes registerindirekt in den DB und einen Index im DB hochzählen?

Wie ist das mit der Verwendung von AR in FB's?

AR1 wird überschrieben wenn ich auf INOUT Parameter zusammengesetzten Typ's zugreife, hier nicht der Fall oder?
 
ich bin an wenig zykluszeitschwankung interessiert ...
Mit Verlaub, aber jetzt beim Programmieren zu schauen, dass ich keine Funktionen bedingt aufrufe um die Zykluszeit konstant zu halten, halte ich für sinnfreie und übertriebene Sorgsamkeit.

Wenn eine Software nur mit konstanter Zykluszeit gut läuft ist sie nicht industrietauglich. Es gibt immer Umstände, die zu Unregelmäßigkeiten im Zyklus führen, Baugruppenausfall, Rackausfall, etc. Da hat die CPU ja auch einiges zu tun.

Es mag ja Anwendungen geben wo das von Relevanz ist, ich kenne persönlich keine. Ob da ein Ausgang 3ms später klickt oder nicht wird i.A. keine Bedeutung haben.

Nichtsdestotrotz hat "Vierlagig" aber Recht, das man das gegenständliche Problem mit einem Zeiger der von 0 bis 40 (oder umgekehrt) und dann von 40 auf 0 springt perfekt lösen kann, die Sortierung muss man, wenn man das möchte eben woanders lösen.

lG
Karl
 
Mit Verlaub, aber jetzt beim Programmieren zu schauen, dass ich keine Funktionen bedingt aufrufe um die Zykluszeit konstant zu halten, halte ich für sinnfreie und übertriebene Sorgsamkeit.

vorbeugen ist besser, als sich auf die schuhe zu kotzen :rolleyes:

AR1 kannst du fast gefahrfrei verwenden
AR2 wird im FB bißchen tricky
auf jeden fall vorher speichern und am ende wieder herstellen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stillstände in WinCC Flex auflisten

Ich hab das jetzt so gemacht wie vierlagig vorgeschlagen hat.

Die Daten von oben beginnend mit indeirekter Adressierung in einen DB zu schreiben und über einen index hochzuzählen. Wenn der Maximalwert erreicht ist wird wieder oben begonnen.

Vielen Dank an alle die geholfen haben!!

Meine Lösung als Anhang unten.

Nun hätte ich da aber noch eine Frage:

Wie könnte man diese Stillstandszeitpunkte und die Stillstandsdauer aus dem DB in einem WinCC Flex Runtime anzeigen??
Eventuell um sie dann auch ausdrucken zu können.

Gruß
roadrunner
 

Anhänge

  • FB21.pdf
    19,5 KB · Aufrufe: 20
  • DB22.pdf
    29,1 KB · Aufrufe: 10
Nun hätte ich da aber noch eine Frage:

Wie könnte man diese Stillstandszeitpunkte und die Stillstandsdauer aus dem DB in einem WinCC Flex Runtime anzeigen??
Eventuell um sie dann auch ausdrucken zu können.

Gruß
roadrunner

Schau dir mal zu dem Thema die Multiplexvariablen in WinCCFlex und deren Handhabung an.
 
Zurück
Oben