Warteschleife

Beidendorfer

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
MOIN MOIN

ICH benötige eine Warteschleife, damit meine SPS die Daten verarbeiten kann.

Nun habe ich hier im Forum gelesen das man ein Array nimmt und mit zwei Pointern irgend etwas hin und herschiebt!

Steht jetzt etwas auf dem schlauch wie der genaue Ablauf sein soll? Was passiert wann?
 
Warteschleife?

Hallo,

was soll denn deine SPS machen? Man muss nicht keine Schelifen programmieren wenn etwas länger dauert.. Das Programm kommt von ganz alleine wieder dahin ;-) Das wäre sogar tödlich für die Zykluszeitüberwachung. Du kannst aber Programmteile die auf die ausgewerteten Daten warten für die Zeit sperren.

André
 
ICH befinde mich in einer großen Schleife, die zur Initialisierung Werte setzen soll, diese Schleife ist aber so schnell, das nur der Letzte werd gesetzt wird :(
habe es auch schon mit dem Timer versucht, aber da probleme mit der Zykluszeitüberwachung bekommen!

 
... vielleicht beschreibst du doch mal etwas genauer, was du haben willst ()bzw. du nicht haben willst). Ich kann mit deiner Anfrage im Augenblick auch nicht viel anfangen ...

Gruß
LL
 
Schleife

wenn es sich um die Kommunikation mit einem Fremdgerät handelt musst du mit einem Handshake arbeiten. Da prüfst du in jedem Zyklus ob du 1 hochzählen kannst, ansonsten warte bis das Fremdgerät bereit ist.

Ansonsten wende dich bei Schleifen vertrauensvoll an waldy

André
 
Code:
ANF:  L     #Zaehler                    // Vergleiche die TAGE und den Zähler
      L     "MW548"                     // Um das Ende des Durchlaufs zu finden
      ==I   
      SPB   YES1
      L     0
      L     #Zaehler                    // Lädt den Zaehler und vergleicht ihn mit der 0
      ==I   
      SPB   YES3                        // Wenn es nicht der erste Durchlauf ist d.h. Zaehler > 0 werden die Nocken aktiviert on morgens bis Abends 
      L     #Zaehler
      T     #Nocken_NR
      L     12
      T     #EIN_STUNDE
      T     #EIN_MINUTE
      T     #AUS_STUNDE
      T     #AUS_MINUTE
      L     #DAY_AKTUELL
      T     #EIN_TAG
      T     #AUS_TAG
      R     #deaktiviert
      R     #taeglich
      S     "M603.7"
 
      L     #Zaehler
      L     1
      +I    
      T     #Zaehler
      SPA ANF
YES3: NOP 0
YES1: NOP 0
Mein Program springt aus der Schleife wenn mein Zähler 0 ist oder er gleich dem Wert von MW538 ist!

in der anderen Zeit soll er die Schleife durchlaufen die Werte Belegen und den Zähler erhöhen und danach aus der Schleife gehen

Der Merker M603.7 aktiviert das Schreiben der Variablen in ein DB
Leider wird nur der letze Datensatz beschrieben d.h. der letzte Zählerstand bevor er aus der Schleife geht
 
Zuletzt bearbeitet:
Code:
      S     "M603.7"
 
      L     #Zaehler
      L     1
      +I    
      T     #Zaehler
      SPA ANF
YES3: NOP 0
YES1: NOP 0
Mein Program springt aus der Schleife wenn mein Zähler 0 ist oder er gleich dem Wert von MW538 ist!

in der anderen Zeit soll er die Schleife durchlaufen die Werte Belegen und den Zähler erhöhen und danach aus der Schleife gehen

Der Merker M603.7 aktiviert das Schreiben der Variablen in ein DB
Leider wird nur der letze Datensatz beschrieben d.h. der letzte Zählerstand bevor er aus der Schleife geht

logisch, der Merker M603.7 kann ja auch nicht ausgewertet werden, solange dein Programm in der Schleife umhernudelt...:rolleyes:
 
Zuletzt bearbeitet:
ICH schreibe Werte in Variablen
Code:
 L     0
      L     #Zaehler                    // Lädt den Zaehler und vergleicht ihn mit der 0
      ==I   
      SPB   YES3                        // Wenn es nicht der erste Durchlauf ist d.h. Zaehler > 0 werden die Nocken aktiviert on morgens bis Abends 
      L     #Zaehler
      T     #Nocken_NR
      L     12
      T     #EIN_STUNDE
      T     #EIN_MINUTE
      T     #AUS_STUNDE
      T     #AUS_MINUTE
      L     #DAY_AKTUELL
      T     #EIN_TAG
      T     #AUS_TAG
      R     #deaktiviert
      R     #taeglich
      S     "M603.7"
Danach soll der M603.7 gesetzt werden, um die VAriablen in den DB zu schreiben.

Nach den Zähler um 1 erhöhen die Nocken_NR erhöhen und das ganze von vorne!

Sollte doch gehen! sehe den fehler nicht!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sollte doch gehen!

nö!

sehe den fehler nicht!

kannst du auch nicht, hast es ja nicht programmiert ... an welcher stelle schreibst du in den DB? ... dir ist klar, dass du erst deine schleife durchläufst und dann irgendwann nachher die daten in deinen db schreibst?

vielleicht sollteste dir mal das mit den pointern und so angucken, sicher hilfreich bei dieser aufgabe :rolleyes:
 
Schleife

so wie dus es vorhast darfst du nicht mit Rücksprung arbeiten, sondern machst je Zyklus einen Durchlauf. Willst du dass alles in einem Zyklus passiert musst du das Schreiben in die Schleife mit einbauen.

André
 
:confused: ... was ist denn der Sinn der Übung ?
Nach meiner bisherigen Erfahrung ist es so, dass man viel besser (und effizienter) helfen kann, wenn man verstanden hat, worum es geht ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sinn und Zweck des ganzen soll sein

Eine Schaltuhr zu bauen, die man an irgendeinem Tag einschalten kann und und Tage, Wochen , Monate später zu einer Bestimmten Zeit wieder ausschalten kann.
Dazu habe ich das Program von Hartmut Lux Wochenschaltzeituhr

http://www.sps-forum.de/showthread.php?t=9600&page=2

Jetzt wollte ich die TAGE in einer Schleife Ein/Ausschalten

Sollte so funktionieren!

http://www.sps-forum.de/attachment.php?attachmentid=5408&stc=1&d=1219997668

Code:
      UN    "M603.6"
      SPB   END6
      L     0
      T     #Zaehler                    // Zähler und Nocken Nr mit 0 Initialisieren 
      T     #Nocken_NR
      L     "MW548"                     // im OP ausgewählte Tagesanzahl
      T     #TAGE                       // Nach Tage kopieren
      L     "MW532"                     // im OP ausgewählter Wochentag
      T     #EIN_TAG                    // Nach EIN_TAG kopieren  
      L     #TAGE                       // Addition der des Starttages mit der Laufzeit
      L     #EIN_TAG
      +I    
      T     #TAGE
      T     #DAY_AKTUELL                // Werte werden auch nach DAY.. gespeichert um bei der späteren division die TAGE nicht zu verändern
ANF2: L     #Zaehler                    // Vergleiche die TAGE und den Zähler
      L     "MW548"                     // Um das Ende des Durchlaufs zu finden
      ==I   
      SPB   YES1
      L     7                           // Vergleiche die TAGE mit der Wochentagsanzahl
      L     #TAGE
      <=I   
      SPBN  YES2                        // Wenn nicht kleiner gleich, springe zu Yes2
      L     #DAY_AKTUELL                // Lade die addition der Starttage und der Laufzeit
      L     7                           // Teile Sie durch 7 um Sie in jeder Woche einschalten zu können.
      /I    
      SRD   16                          // Das Ergebnis um 16 stellen nach rechts Schieben, um den Rest der Division zu bekommen
      T     #DAY_AKTUELL
      L     0                           //Vergleiche das Divisionsergebnis in DAY_AKTUELL mit den 0
      L     #DAY_AKTUELL
      ==D   
      SPBN  YES2                        // Wenn es 0 ist, setzte 7, da die Siemenswoche von 1..7 geht
      L     7
      T     #DAY_AKTUELL
YES2: L     0
      L     #Zaehler                    // Lädt den Zaehler und vergleicht ihn mit der 0
      ==I   
      SPB   YES3                        // Wenn es nicht der erste Durchlauf ist d.h. Zaehler > 0 werden die Nocken aktiviert on morgens bis Abends 
      L     #Zaehler
      T     #Nocken_NR
      L     12
      T     #EIN_STUNDE
      T     #EIN_MINUTE
      T     #AUS_STUNDE
      T     #AUS_MINUTE
      L     #DAY_AKTUELL
      T     #EIN_TAG
      T     #AUS_TAG
      R     #deaktiviert
      R     #taeglich
      S     "M603.7"
      S     M    101.1

YES3: NOP   0
      L     #Zaehler
      L     1
      +I    
      T     #Zaehler
      T     "MW704"
YES1: NOP   0
END6: NOP   0

@sps-concept:
Hast Recht, laufe in meiner Schleife und setzte Meine Werte erst beim nächsten Zyklus!
Leider setzte ich meine Werde am Anfang vor mit 0
damit ist meine Schleife Kaputt.
 

Anhänge

  • Fluss.jpg
    Fluss.jpg
    52,1 KB · Aufrufe: 22
Warum liest du nicht einfach die aktuelle Datum und Uhrzeit aus und vergleichst diese mit einer parametrierter-Schaltzeit?
Eine quasi endlos-Schleife darfst du auf keinen Fall programmieren, da wird deine CPU über kurz oder lang die Krätsche machen und die anderen Anweisungen kommen nicht mehr zum Zug.
Was ist das überhaupt ein FC oder ein FB?
 
... wäre es dann nicht sinnvoller ein bestimmtes Datum zum Ein- bzw. Ausschalten zu verwenden ?
Aber davon ab ... was soll denn konkret passieren ?
EIN : Morgen (in einem Tag) um 8:37 Uhr
AUS: in 77 Tagen um 11:55 Uhr
etwa so ?

Wenn ja, dann würde ich mir beim Einschalten den DATE laden (der beinhaltet nämlich Tage) und abspeichern und das Ausschalten bei wenn DATE = DATE(gespeichert) + 76 und der richtigen Uhrzeit ...

Gruß
LL

Nachsatz:
Kiestumpe war schneller - sagt im Grunde das selbe ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
DANKE LL

Liegst da schon ganz Richig, werde meine Schaltuhr noch mal überdenken,

Will ja auch die möglichkeit haben diese in 5 Tagen einzuschalten ;) müsste aber auch machbar sein!

Schön wäre das ganze ja als Kalenderforum in WINCC Flex. zu starten, aber glaube das wäre zu viel!
 
... ohne das jetzt weiter zu hinterfragen ... aber das mit dem Kalender geht sicher auch. In dem Fall istb es m.E. mehr eine Frage, wieviel Mühe du dir damit machen willst. Persönlich würde ich hier eine direkte Datums-Eingabe realisieren. Das Andere geht sicherlich mit etwas Anschubhilfe durch die SPS ...
 
Zurück
Oben