Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 5 von 5

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

  1. #1
    Registriert seit
    27.11.2013
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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.
    Zitieren Zitieren Erstellen einer Variable zum aktuellen Zeitpunkt und weitere im Abstand von x Minuten  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    SPSneuling2013 (17.03.2014)

  4. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.184
    Danke
    923
    Erhielt 3.290 Danke für 2.659 Beiträge

    Standard

    Zitat Zitat von SPSneuling2013 Beitrag anzeigen
    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.

    Zitat Zitat von SPSneuling2013 Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    SPSneuling2013 (17.03.2014)

  6. #4
    SPSneuling2013 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    27.11.2013
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  7. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.184
    Danke
    923
    Erhielt 3.290 Danke für 2.659 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Step 7 CFC Plan erstellen und weitere FB´s in OB35 aufrufen
    Von carki im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 26.02.2014, 08:38
  2. Antworten: 4
    Letzter Beitrag: 16.06.2010, 17:06
  3. Antworten: 23
    Letzter Beitrag: 22.10.2009, 18:13
  4. Zeitpunkt Werte von MPI-Bus-Übernahme
    Von andi im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 08.03.2009, 12:23
  5. Antworten: 8
    Letzter Beitrag: 15.08.2005, 13:03

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •