Zuweisung verschiedener Werte aus DB an Merker

Harry_RE

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen

meine Hard- Software:

S7-Simatic Manager V5.4, WinCC flexible 2007 V1.2.0.0_1.55.01
S7 314C-2DP

Ich habe eine Ablaufkette in Fub programiert mit der es mir möglich ist Hochfreqenz- Motoren einlaufen zu lassen (Fettverteilung inerhalb der Lager beim ersten Lauf). Dafür sind insgesamt 20 Zyklen mit unterschiedlichen Drehzahlen, Zyklusszeiten, Ei- Ausschaltintervalle des Antriebs nötig. Hierfür verwende ich einen selbst geschriebenen kleinen Zyklus- Baustein.

In diesem Baustein sind drei Zähler verbaut die einen Zyklus abhandeln. Allerdings benötige ich insgesamt 20 Zyklen. Dazu habe ich die Fc_zyklusbaustein mehrfach in einem weiterem FC, 20 mal aufgerufen und über einen Vergleicher aktiviert. Der Zählwert entspricht dem Zyklusschritt der 20 vorhandenen.

Die oben genannten Werte habe ich inerhalb eines DB mit Sructure hinterlegt. Diese Werte musste ich mit meiner Variante passend zum Zyklusschritt einzeln jeden der 20 Zyklusbausteinen zuweisen.

Eine andere Variante von mir war das weiterreichen der DB Werte an mehrere Move Befehle die anhand des Zyklusschritt aktiviert wurden. Am Ausgang der Move Befehle befand sich die Variable die es dem Zyklusbaustein zuspielte. Mit dieser Variante war nur noch ein Zyklusbaustein nötig der passend zum Zykluss die passenden Werte bekommen hat. Allerdings waren somit durch drei s5time Zeiten und eine Dint Variable 80 Move Befehle notwendig.

Ich würde gern die Werte von dem Datenbaustein vier Verschieden Variablen zuweisen. Die widerum sich z.b durch den Zählschritt der einzelnen Zyklen den nächsten Wert aus dem DB holen (1.Schritt- Zykluss Zeit 1, 2.Schritt- Zyklusszeit 2). Leider habe ich keine Ahnung welche Funtion dafür nötig ist.
Wenn möglich wäre eine Lösung in Fub für mich von Vorteil weil ich mit AWL nicht so gut umgehen kann.

Würde mich sehr über eine Lösung freuen

MFG Harry_RE
 

Anhänge

  • SPS.jpg
    SPS.jpg
    24,7 KB · Aufrufe: 45
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab die Frage nicht ganz verstanden...

Willst du die aktuelle Zykluszeit wissen?

Variante 1:
du nimmst einen OB32 oder sowas, der mit einer konstanten Zykluszeit arbeitet

Variante 2:
Der OB1 liefert dir die aktuelle Zykluszeit in seinen internen Variablen, geh mal im Bausteincontainer auf den OB1 und drück F1

Variante 3:
Du kannst dir die Zykluszeit selbst berechnen. Es gibt irgend eine FUnktion GetSystemTicks oder sowas, die dir die aktuelle Systemzeit liefert. letzen Wert vom aktuellen subtrahieren und aktuellen Wert speichern
 
Danke für die schnelle Antwort Chefmech,

Es geht mir aber nicht um die Zykluszeit der S7 sondern um mehrere maschinelle Zyklen die die S7 steuern soll.
Um dies efektiv zu realisieren benötige ich eine Möglichkeit Zeiten,DINT- Werte aus einem Datenbaustein nacheinander auszulesen. Diese Ausgelese Zeit z.B. einer Variable zu zuweisen die ich dann im weiterem Prozess verwende. Anschließend wenn der erste Zykluss der Maschine erfolgreich war soll der zweite Wert der Variable zugewiesen werden ...
z.B.
(im_Datenbaustein)
Zeit_1 /St5time/ s5t#2m
Zeit_2 /St5time/ s5t#3m
Zeit_3 /St5time/ s5t#4m
Zeit_4 /St5time/ s5t#5m
 
Hallo,
das ist dann ein Fall für "indirekte Adressierung" der Quell-Variablen und entsprechende Zugriffe über Pointer. Gib den o.g. Stichpunkt mal in der Step7-Hilfe ein - oder in der Forums-Suche ...
Allerdings - mit FUP wirst du da nicht weit kommen ... ;)

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist doch eine klassische Schrittkette,

in Pseudo-Code etwa so:
Code:
case nMyCase

0:
    //init
    dMyTime = Zeit0
    nMyCase = 1
1:
    //do something...

    //Case wechsel
    if fTimerAbgelaufen
        dMyTime = Zeit1    
        nMyCase = 2
    end_if
2:
    //do something...

    //Case wechsel
    if fTimerAbgelaufen
        dMyTime = Zeit2    
        nMyCase = 3
    end_if
3:
    //do something...

    //Case wechsel
    ....

end_case

Timer(In = not fTimerAbgelaufen
        ,Time = dMyTime)

fTimerAbgelaufen = Timer.Q
 
Zurück
Oben