Zeitschaltuhr PiXtend

Abulowski

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

ich bin gerade dabei einen PiXtend, also einen Raspberry Pi mit integrierter SPS zu programmieren. Bisher hat alles super geklappt, jedoch komme ich jetzt bei der Programmierung einer Zeitschaltuhr nicht weiter.

Die Systemzeit kann ich auslesen und anzeigen lassen. Jedoch möchte die Systemzeit über die Visu einstellen können. Außerdem möchte ich die Zeitschaltuhr einstellen können. Die Zeitschaltuhr soll unabhängig vom Wochentag immer zur selben Uhrzeit an und ausschalten.

Ich habe die OSCAT Packages installiert, komme aber mit den Funktionsbausteinen Timer 1 und Timer 2 nicht weiter.
1641067693590.png

Wie kann ich DTI konfigurieren und einstellen?

Würde mich über Tips mega freuen. LG :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort @wollvieh ! :)

Ich steige da komplett nicht durch. Welchen Datentyp haben denn die Variablen?
Gibt es vielleicht ein Beispiel mit FUP und der dazugehörigen Variablenliste?

Das Beispiel von Codesys checke ich auch nicht. Welche Variable ist denn der TRUE und FALSE - Ausgang der dann je nach Uhrzeit schaltet??

Ich habe im Studium mal ne Waschstraße von Fischertechnik mit FUP programmiert. Das ist aber schon lange her... I am sorry!
 
Ja super! Hab es jetzt halbwegs hinbekommen. Versuche mich jetzt weiter. Vielen Dank!
 

Anhänge

  • 1641137557373.png
    1641137557373.png
    27,9 KB · Aufrufe: 37
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, mit der Hand am Arm.

Code:
PROGRAM SystemTime
VAR
    iState                    : INT;
    CurrentDateAndTime        : DATE_AND_TIME;
    GetCurrentDateAndTime    : DTU.GetDateAndTime;
    SetCurrentTimeZoneInformation: DTU.SetTimeZoneInformation;
    uiYear                    : UINT;
    uiMonth                    : UINT;
    uiDay                    : UINT;
    uiHour                    : UINT;
    uiMinute                : UINT;
    uiSecond                : UINT;
    uimillSecond            : UINT;
    SetCurrentDateAndTime    : DTU.SetDateAndTime;
    secpulsFB : R_TRIG;
     secpuls   : BOOL;
     olds      : UINT;
     news      : UINT;
     change    : BOOL;
     scount    : DINT;
END_VAR


// This example visualises an analog clock. Timezone informatione are used to get the correct local time.
//


CASE iState OF
    0:  iState:= 1;
          // Set the current timezone. The times to set the clock
          
        SetCurrentTimeZoneInformation(
            xExecute:= TRUE,
            tziInfo:= DTU.GlobalConstants.gc_tziTimeZoneCET);
        IF SetCurrentTimeZoneInformation.xDone THEN
            SetCurrentTimeZoneInformation(xExecute:= FALSE);
            iState:= 1;
        END_IF
        IF SetCurrentTimeZoneInformation.xError THEN
            SetCurrentTimeZoneInformation(xExecute:= FALSE);
            iState:= 32767;
        END_IF
        
    1:  // Fetch the current date and time.
        GetCurrentDateAndTime(
            xExecute:= TRUE);
        IF GetCurrentDateAndTime.xDone THEN
            CurrentDateAndTime:= GetCurrentDateAndTime.dtDateAndTime;
            GetCurrentDateAndTime(xExecute:= FALSE);
            iState:= 2;
        END_IF
        IF GetCurrentDateAndTime.xError THEN
            GetCurrentDateAndTime(xExecute:= FALSE);
            iState:= 32767;
        END_IF
        
    2: // Split the date and time in its parts.   
        IF DTU.DTSplit(
            CurrentDateAndTime,
            ADR(uiYear),
            ADR(uiMonth),
            ADR(uiDay),
            ADR(uiHour),
            ADR(uiMinute),
            ADR(uiSecond)) = DTU.ERROR.NO_ERROR
        THEN
            iState:= 1;
        ELSE
            iState:= 32767;
        END_IF
        
    32767:  (*error*)    ;
            iState:= 1;
END_CASE

Year   := UINT_TO_STRING ( uiYear    );
Month := '';
CASE UINT_TO_INT (uiMonth) OF
 0..9 : Month := CONCAT ( Month , '0' );
        Month := CONCAT ( Month , UINT_TO_STRING ( uiMonth )) ;
ELSE
        Month :=  UINT_TO_STRING ( uiMonth );
END_CASE;
Day := '';
CASE UINT_TO_INT (uiDay) OF
 0..9 : Day := CONCAT ( Day , '0' );
        Day := CONCAT ( Day ,  UINT_TO_STRING ( uiDay ));
ELSE
        Day := UINT_TO_STRING ( uiDay ) ;
END_CASE;
Hour := '';
CASE UINT_TO_INT (uiHour) OF
 0..9 : Hour := CONCAT ( Hour , '0' );
        Hour := CONCAT ( Hour ,  UINT_TO_STRING ( uiHour ) );
ELSE
        Hour :=   UINT_TO_STRING ( uiHour ) ;
END_CASE;
Minute :='';
CASE UINT_TO_INT (uiMinute) OF
 0..9 : Minute := CONCAT ( Minute , '0' );
        Minute := CONCAT ( Minute ,  UINT_TO_STRING ( uiMinute ) );
ELSE
        Minute := UINT_TO_STRING ( uiMinute  );
END_CASE;
Second := '';
CASE UINT_TO_INT (uiSecond) OF
 0..9 : Second := CONCAT ( Second , '0' );
        Second := CONCAT ( Second ,  UINT_TO_STRING ( uiSecond ) );
ELSE
        Second := UINT_TO_STRING ( uiSecond ) ;
END_CASE;



(* für das File Object                                                            *)
(* ----------------------------------- Datestring  ------------------------------ *)
Date_ := '';
Date_ := CONCAT  (Date_, Year);
Date_ := CONCAT  (Date_, '_');
Date_ := CONCAT  (Date_, Month);
Date_ := CONCAT  (Date_, '_');
Date_ := CONCAT  (Date_, Day);
(* ----------------------------------- Timestring  ------------------------------ *)
Time_ := '';
Time_ := CONCAT  (Time_, ' ');
Time_ := CONCAT  (Time_, Hour);
Time_ := CONCAT  (Time_, ':');
Time_ := CONCAT  (Time_, Minute);
Time_ := CONCAT  (Time_, ':');
Time_ := CONCAT  (Time_, Second);







news := uiSecond;
IF ( olds <> news )
THEN
  olds   := news;
  change := TRUE;
ELSE
  change := FALSE;
END_IF

secpulsFB(CLK:= change , Q=> secpuls );

IF secpuls
THEN
 scount := scount + 1;
ELSE
 ;
END_IF
 
Moin, vielleicht hilft ja auch das:

ich habe mir aus den beiden UINT "lokal_Zeit_Stunde" und "lokal_Zeit_Minute" eine globale Variable:
Code:
lokal_Zeit_hhmm : INT ; (* Zeit von 0000 bis 2359 *)
gemacht.

Die beschreibe ich dann mit
Code:
lokal_Zeit_hhmm := 100 * UINT_TO_INT ( lokal_Zeit_Stunde ) + UINT_TO_INT ( lokal_Zeit_Minute ) ;

Jetzt kann ich an jeder beliebigen Stelle eine "Schaltuhr" in der Art einfügen:
Code:
SchaltUhrAusgang1 := ( lokal_Zeit_hhmm >= 0900 ) AND ( lokal_Zeit_hhmm < 1500 ) ;
Die Ein- und Auszeit 09:00 Uhr und 15:00 Uhr kann man natürlich auch veriabel ausführen und z.B. über die Visu eingeben.

Grüße Tom
 
Also ich hab mir jetzt eine Lösung (Strukturierter Text) aus einem anderen Forum kopert die super funktioniert. Sorry hat etwas länger gedauert...

1641495438200.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das zuvor beschriebene kleine Programm gibt mir die Variable dDate als TIME_AND_DAY typ aus und beschreibt die aktuelle Systemzeit, die sich fortlaufend aktualisiert.. Für den Oscat_Timer 1 oder 2 habe ich es ausprobiert. Nun habe ich das Problem das die Zeitschaltuhr zwar schaltet, jedoch nur einmal am Tag wie es scheint. wenn ich ein zweites mal die Zeitschaltuhr bspw. für 5 Sekunden etwas später aktivieren will, bleibt der Ausgabewert auf Q false. Was mache ich falsch ???

1641495706829.png
1641495754905.png
 
Zurück
Oben