Zählerstand (Zeiten) in DB speichern

StefanK_R

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin neu hier in diesem Forum und habe ein kleines Problem und komm einfach auf keinen grünen Zweig.
Vorab: Ich bin NICHT gerade ein Profiprogrammierer, hab aber gewisse Grundkenntnisse in Step7 (V5.5).

Ablauf:
Es handelt sich um ein Projekt, in dem ich Zeiten (Zählwerte eines Taktgebers) erfassen muss. Es gibt drei Varianten dieser Anlage, die jedoch immer das selbe machen. Die Anlage fährt von Position A (Sensor B0) nach Position B (Sensor B180) und wieder zurück nach Position A (Sensor B0). Dieser Ablauf entspricht einem Zyklus. Auf jeder Endlage soll die Anlage 2sec. verweilen. Bevor die Zeiten jedoch erfasst werden, muss die Anlage zuerst einmal 100 Zyklen warmlaufen. Von den 30 darauffolgenden Zyklen brauch ich dann die Zeit, wenn die Anlage von Pos.A (B0) nach Pos.B (B180) fährt.

Programmierung:
Ich hab diesen Ablauf in einem FB als Ablaufkette programmiert. Das Warmlaufen und die anschließende Zeitenermittlung hab ich mit zwei Rückwärtszählern realisiert: Der Warmlaufzähler (Z1) zählt von 100 rückwärts bis auf 0. Er setzt einen Merker (Warmlaufmerker), der als Startbedingung für das verfahren von Pos A nach Pos B nötig wird. Ist der Zähler dann auf 0 setzt der Flankenwechsel von Q den Zählwert des Messzählers (Z2). Der wiederum setzt einen zweiten Merker, der ebenfalls als Weiterfahrbedingung von Pos A nach Pos B nötig ist (Oderverknüpfung "Warmlaufmerker oder Messmerker"). Sind Beider Merker (Warmlaufmerker und Messmerker) auf 0, bleibt die Anlage stehen und die Messung ist beendet.
Alles eben Genannte sowie den Taktgenerator zur Zeitenermittlung hab ich in FUP programmiert. Bei der Zeitenermittlung hab ich mich in AWL versucht:

[U "M2" // Schrittmerker (Schritt2) Schwenken 0 auf 180
FP M 5.3 // Positive Flanke Schritt 2
S M 5.4 // Hilfsmerker für Positive Flanke
U Z 2 // Bedingung für Messzähler muss da sein
UN Z 1 // Warmlaufmerker darf nicht da sein ( könnte man wahrscheinlich auf weglassen)
R #B180 // Rücksetzen des Hilfsmerkers bei erreichen von B180
SPB M000 // Sprungbefehl in die Zykluszeitermittlung

//
M000: L #Schritt // Statische Variable #Schritt (Anfangswert 0)
L 1 // Zahl "1" laden
+I // Zur Variable #Schritt addieren
T #Schritt // neuen Wert in #Schritt transferieren

L #Schritt // Zyklusvergleich
L 1 // 1. Zyklus
==I
SPB M001 // Springe nach Zeitenzuweisung 1. Zyklus


L #Schritt // Zyklusvergleich
L 2 // 2. Zyklus
==I
SPB M002 // Springe nach Zeitenzuweisung 2. Zyklus

// …………..wird bis Zyklus 30 wiederholt ………………………………

M001: U( // Zeitenzuweisung 1. Zyklus mit Zähler Z5
U "M2" // Bewegung von Pos A nach Pos B setzt den Zähler
UN #B0 // ... sobald B0 nicht mehr da ist
S M 20.0
U "M3" // Sobald Verweilzeit (2sec) beginnt und B180 da ist
R M 20.0 // Rücksetzten des Zählers
U M 20.0
)
U T 10 // Bei jedem Takt von T10 vorwärtszählen
ZV Z 5
BLD 101
NOP 0
NOP 0
NOP 0
NOP 0
LC Z 5 // Lade den Zählwert von Z5
T #Zeitspeicher // Transferiere den Zählwert in Temporäre Variable #Zeitspeicher
DTR // Umwandeln des Zählers von BCD in INT
RND
T #Zeit1 // Transferiere INT-Zahl in Out-Variable #Zeit 1
NOP 0
BEA
// …………wird ebenfalls bis Zyklus 30 wiederholt einzige Änderung anstatt #Zeit 1 => #Zeit2…]

Problem:
Die Werte kommen nicht als INT im DB an und laufen zudem ständig. Ich hab mir vorgestellt, dass wenn ich den DB im Beobachten-Modus anschaue, ich Schritt für Schritt die Werte reingeschrieben bekomme.
Es stehen bei jeder Zeit die gleichen Werte (Zeit 1 bis 30)

So, ich hoffe mein Problem langweilt euch nicht zu sehr, aber ich hab mir gedacht bei euch müsste mir jemand weiterhelfen können.

Danke mal im Voraus für eure Antworten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hoffe diesesmal klappt es mit dem
Code:
[CODE]  U     "M2"                        // Schrittmerker (Schritt2) Schwenken 0 auf 180
      FP    M      5.3                  // Positive Flanke Schritt 2
      S     M      5.4                  // Hilfsmerker für Positive Flanke
      U     Z      2                    // Bedingung für Messzähler muss da sein 
      UN    Z      1                    // Warmlaufmerker darf nicht da sein ( könnte mann wahrscheinlich auf weglassen)
      R     #B180                       // Rücksetzeten des Hilfsmerkers bei erreichen von B180
      SPB   M000                        // Sprungbefehl in die Zykluszeitermittlung
// 
M000: L     #Schritt                    // Statische Variable #Schritt (Anfangswert 0)
      L     1                           // Zahl "1" laden 
      +I                                // Zur Variable #Schritt addieren
      T     #Schritt                    // neuen Wert in #Schritt transverieren 
      L     #Schritt                    // Zyklusvergleich 
      L     1                           // 1. Zyklus
      ==I   
      SPB   M001                        // Springe nach Zeitenzuweisung 1. Zyklus 

      L     #Schritt                    // Zyklusvergleich 
      L     2                           // 2. Zyklus
      ==I   
      SPB   M002                        // Springe nach Zeitenzuweisung 2. Zyklus
      L     #Schritt                    // Zyklusvergleich 
      L     3                           // 3. Zyklus
      ==I   
      SPB   M003                        // Springe nach Zeitenzuweisung 3. Zyklus

//...bis Zyklus 30

M001: U(                                // Zeitenzuweisung 1. Zyklus mit Zähler Z5 
      U     "M2"                        // Bewegung von Pos A nach Pos B  setzt den Zähler
      UN    #B0                         // ... sobald B0 nicht mehr da ist 
      S     M     20.0
      U     "M3"                        // Sobald verweilzeit (2sec) beginnt und B180 da ist
      R     M     20.0                  // Rücksetzten des Zählers
      U     M     20.0
      )     
      U     T     10                    // Bei jedem Takt von T10 vorwärtszählen 
      ZV    Z      5
      BLD   101
      NOP   0
      NOP   0
      NOP   0
      NOP   0
      LC    Z      5                    // Lade den Zählwert von Z5
      T     #Zeitspeicher               // Transveriere den Zählwert in Temporäre Variable #Zeitspeicher // Umwandeln des Zählsers von BCD in INT 
      BTI   
      T     #Zeit1                      // Transveriere INT-Zahl in Out-Variable #Zeit 1 
      NOP   0
      BEA

Danke Borromeus für deine Antwort. Ich hab´s jetzt mal probiert. Leider steht jetzt im Instanz DB bei jeder INT-Variable #Zeit 1 bis 30 "999" drin.
 
Ich meine Ja. Bei M001 (siehe Code) bis M030 sag ich ihm die Startbedingung
Code:
 U(                                // Zeitenzuweisung 1. Zyklus mit Zähler Z5 
      U     "M2"                        // Bewegung von Pos A nach Pos B  setzt den Zähler
      UN    #B0                         // ... sobald B0 nicht mehr da ist 
      S     M     20.0
      U     "M3"
und Rücksetztbedingungen
Code:
 R     M     20.0                  // Rücksetzten des Zählers 
      U     M     20.0
      )
sowie die Vorwärtszählbedingung T10.
Code:
 U     T     10                    // Bei jedem Takt von T10 vorwärtszählen 
      ZV    Z      5
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider steht jetzt im Instanz DB bei jeder INT-Variable #Zeit 1 bis 30 "999" drin.
Kann ich mir gut vorstellen, du zählst ja auch pausenlos weiter:
Code:
M000: L     #Schritt                    // Statische Variable #Schritt (Anfangswert 0)
      L     1                           // Zahl "1" laden 
      +I                                // Zur Variable #Schritt addieren
      T     #Schritt                    // neuen Wert in #Schritt transverieren 
      L     #Schritt                    // Zyklusvergleich 
      L     1                           // 1. Zyklus
      ==I   
      SPB   M001
Das Zählen wird doch in jedem Zyklus ausgeführt.
 
Hallo Paule,
ich sag doch aber als Sprungbedingung zu M000, dass die Positive Flanke vom M2 sowie Z2 und nicht Z3 da sein darf.
 
Hallo Paule,
ich sag doch aber als Sprungbedingung zu M000, dass die Positive Flanke vom M2 sowie Z2 und nicht Z3 da sein darf.
Hallo Stefan,
ich behaupt jetzt mal das die Flanke an der Sprungmarke durch die Zuweisungen S / R keine Auswirkung mehr hat.
Aber selbst wenn es doch funktionieren sollte, du musst doch dann das "Zählen" überspringen, so in etwa:
Code:
      SPB   M000                        // Sprungbefehl in die Zykluszeitermittlung
// 
      L     #Schritt                    // Statische Variable #Schritt (Anfangswert 0)
      L     1                           // Zahl "1" laden 
      +I                                // Zur Variable #Schritt addieren
      T     #Schritt                    // neuen Wert in #Schritt transverieren 
[COLOR=#ff0000]M000[/COLOR]: L     #Schritt                    // Zyklusvergleich 
      L     1                           // 1. Zyklus
      ==I   
      SPB   M001
 
Zurück
Oben