TIA Erstellen einer Variable zum aktuellen Zeitpunkt und weitere im Abstand von x Minuten

SPSneuling2013

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

Vorweg, ich bin wirklich ein absoluter Neuling in Sachen SPS-Programmierung. D.h. ich wäre für ausführliche oder gut kommentierte Hilfen sehr dankbar.

Ich benötige Hilfe bei meiner Programmierung. Ich möchte, dass sobald der Eingang "Signal" eingeschaltet ist (DI), die aktuelle Uhrzeit abgefragt und dann in 2 weiteren Variablen die aktuelle Uhrzeit+2 und aktuelle Uhrzeit+5 Minuten abgelegt wird. Diese Uhrzeiten werden dann mit der aktuellen Uhrzeit verglichen und entsprechend die Ausgänge (DO) geschaltet.

Bisher war meine Idee aus der aktuellen Uhrzeit die Minuten zu extrahieren, diese zu erhöhen und dann die Minutenwerte mit der aktuellen Uhrzeit zu vergleichen. Ich bin mir allerdings schon nicht sicher, ob die Minutenwerte sich mit jedem Zyklus erhöhen, d.h. es wird scheinbar immer nur Schritt 1 ausgeführt.

Das ist mein bisheriger Programmcode:



IF "Signal"=1 THEN
#Minute:=#DateTime.MINUTE;
"Aktp2":=#Minute+2;
"Aktp5":=#Minute+5;​
END_IF;

IF #Minute<"Aktp2" THEN
"DO 2":=1;
"DO 1":=0;​
END_IF;

IF (#Minute>"Aktp2")AND(#Minute<"Aktp5") THEN
"DO 2":=0;
"DO 1":=1;​
END_IF;

Mir ist bewusst, dass sich bei IF-Bedingungen einigen die Haare sträuben werden, aber für meine ersten Versuche würde ich gerne dabei bleiben. Entscheidend sind die Zuweisungen der Werte. Die Werte für die aktuelle Uhrzeit kommen aus dem DB "DateTime" und sind vom Datentyp DTL

Ich besitze eine S7-1500 und programmiere in TIA V12 mit SCL.
 
Hallo,
für dein ganzes Thema ist eine Flanken-Auswertung m.E. die Lösung.
Am Beispiel von "Signal" :
Code:
if (Signal=1) and not Flanke_Signal then
...
end_if ;
Flanke_Signal := (Signal = 1) ;
... die Flankenmerker müssen natürlich statisch sein ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir ist bewusst, dass sich bei IF-Bedingungen einigen die Haare sträuben werden, aber für meine ersten Versuche würde ich gerne dabei bleiben.
Auch wenn Du keine Kritik hören willst, so muß ich trotzdem anmerken, daß Deine Idee und die Umsetzung nicht funktioniert.

Du weißt, daß Dein simples Addieren der Minuten nur jede Stunde von xx:00 Uhr bis xx:54 Uhr funktioniert?
Was machst Du wenn es einen Übertrag in die nächste Stunde oder in den nächsten Tag gibt?
Soll sich Dein Signalspiel jede Stunde wiederholen?
Besser Du benutzt T_ADD und vergleichst den kompletten DTL.

Dein AND(#Minute<"Aktp5") ist zwecklos, weil Deine Fallunterscheidung mit den IF nicht vollständig ist - typischer Fehler, wenn man die Arbeitsweise der SPS nicht versteht und ereignisorientiert denkt und programmiert. Außerdem gibt es eine Auswertungslücke bei #Minute="Aktp2".
Als Anfänger solltest Du besser in FUP oder KOP programmieren, da macht man erheblich weniger logische und syntaktische Fehler als bei der Programmierung in SCL.

Entscheidend sind die Zuweisungen der Werte.
Wenn schon SCL, dann besser so:
Code:
#Minute := #DateTime.MINUTE ;

IF "Signal" AND NOT #Flanke_Signal THEN
  "Aktp0" := #Minute ;
  "Aktp2" := #Minute + 2 ;
  "Aktp5" := #Minute + 5 ;
END_IF ;
#Flanke_Signal := "Signal" ;

"DO 2" := (#Minute >= "Aktp0") AND (#Minute < "Aktp2") ;
"DO 1" := (#Minute >= "Aktp2") AND (#Minute < "Aktp5") ;
Leerzeichen im Programmcode erhöhen die Lesbarkeit ganz ungemein.

Tip:
Wenn Du nur einmalig 2 Ausgabesignale nach der Flanke am DI erzeugen willst, dann ist es viel einfacher, einfach 2 Timer zu benutzen als den ganzen Aufwand mit der Uhrzeitverarbeitung zu betreiben.

Harald
 
Hallo zusammen,

vielen Dank für die schnelle Rückmeldung. Die Idee mit dem Timer ist sehr gut. Wäre ich wirklich nicht drauf gekommen. Vielen Dank auch für den Hinweis mit FUP und KOP, werde ich mir zu Herzen nehmen :)

Schönen Abend euch noch.
 
Mit Timern könnte die Lösung Deiner Aufgabe in FUP so einfach aussehen
Code:
                              #TOF2
      +--------+            +-------+
      | P_TRIG |            |  TOF  |
      |        |            |       |
"DI"--|        |--+---------|       |           "DO2"
      +--------+  |         |       |          +-----+
        "FPM1"    |   T#2M--|       |----------|  =  |
                  |         +-------+          +-----+
                  |
                  |           #TOF1
                  |         +-------+
                  |         |  TOF  |
                  |         |       |
                  +---------|       |          +-----+
                            |       |          |     |
                      T#5M--|       |----------|  &  |           "DO1"
                            +-------+          |     |          +-----+
                                      #TOF2.Q--o     |----------|  =  |
                                               |     |          +-----+
                                               +-----+

Harald
 
Zurück
Oben