Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Uhrzeit in Visu

Dennish23
2008-09-29
2023-08-17
  • Dennish23 - 2008-09-29

    Hallo Liebe Forumgemeinde

    Ich habe ein kleines Problem mit meiner Visu.

    Ich möchte gern die Uhrzeit in meinem MFD angezeigt bekommen und verweise mit meinem Buttoneigenschaften %s auf die String Variable Echtzeit.

    Nun Zeit mir der Button aber #DT 2008-09-27-19:58:23 an.

    Ich hätte es aber gern 27-09-2008 19:58

    Kann mir dabei jemand helfen. Wenn ich mit den Eigenschaften %t %d-%m-%Y dann nimmt er nur meine PC Zeit wenn ich Online verbunden mit dem Panel zeigt er es auf dem PC an aber im Panle zeigt er irgendwelche Hex Werte an. Vielleicht hat jemand ne Idee.

    MFG Dennis

     
  • Denkes - 2008-09-29

    Hallo Dennish23,

    auf die Schnelle gebe ich dir nachfolgend den Code, mit dem du die Systemzeit liest, sie umwandelst in einen String, diesen in seine Bestandteile zerlegst und ihn dir wieder zusammenbaust. Im Ergebnis entsteht die Anzeige:

    Montag, 29. Sept. 2008 21:57:05

    Falls du Teile davon nicht benötigst, diese im Code einfach weglassen oder etwas bearbeiten. In dein Projekt musst du die Bibliothek SysLibRtc.lib einbeziehen.

    (* Systemzeit lesen und Werte vereinzeln *)
    Echtzeit:=SysRtcGetTime(dummy);               (* Echtzeit lesen *)
    Echtzeit_String:=DT_TO_STRING(Echtzeit);         (* Echtzeit umwandeln in String *)
    Jahr:=STRING_TO_INT(MID(Echtzeit_String, 4, 4));
    Monat:=STRING_TO_INT(MID(Echtzeit_String, 2, 9));
    Tag:=STRING_TO_INT(MID(Echtzeit_String, 2, 12));
    Stunde:=STRING_TO_INT(MID(Echtzeit_String, 2, 15));
    Minute:=STRING_TO_INT(MID(Echtzeit_String, 2, 18));
    Sekunde:=STRING_TO_INT(MID(Echtzeit_String, 2, 21));
    (* Zusammenbauen der Zeitanzeige *)
    (* 1. Wochentagsname *)
    CASE Wochentag
    OF
       1:Zeit_aktuell := 'Sonntag, ';
       2:Zeit_aktuell := 'Montag, ';
       3:Zeit_aktuell := 'Dienstag, ';
       4:Zeit_aktuell := 'Mittwoch, ';
       5:Zeit_aktuell := 'Donnerstag, ';
       6:Zeit_aktuell := 'Freitag, ';
       7:Zeit_aktuell := 'Samstag, ';
    END_CASE;
    (* 2. Tagesnummer hinzufügen *)
       Zeit_aktuell := CONCAT (Zeit_aktuell,MID(Echtzeit_String, 2, 12));
    (* 3. Monatsnamen hinzufügen *)
       CASE Monat
       OF
       1:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Jan. ');
       2:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Feb. ');
       3:Zeit_aktuell := CONCAT (Zeit_aktuell,'. März ');
       4:Zeit_aktuell := CONCAT (Zeit_aktuell,'. April ');
       5:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Mai ');
       6:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Juni ');
       7:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Juli ');
       8:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Aug. ');
       9:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Sept. ');
       10:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Okt. ');
       11:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Nov. ');
       12:Zeit_aktuell := CONCAT (Zeit_aktuell,'. Dez. ');
    END_CASE;
    (* 4. Jahreszahl anhängen *)
       Zeit_aktuell := CONCAT (Zeit_aktuell,MID(Echtzeit_String, 4, 4));
    (* 5. Leerzeichen anhängen *)
       Zeit_aktuell := CONCAT (Zeit_aktuell,'  ');
    (* 6. Aktuellen Zeitwert anhängen *)
       Zeit_aktuell := CONCAT (Zeit_aktuell,MID(Echtzeit_String,8, 15));
    

    Viel Erfolg

    Norbert

    PS: Fahre morgen für 2 Wochen in Urlaub, falls es Fragen gibt.

     
  • Dennish23 - 2008-09-30

    Danke Denkes für deine Hilfe. Soweit hatte ich das ganze fast auch schon nur ist mir immer noch unverständlich wenn ich in der Visu ein Button habe wie ich dort die Uhrzeit in meinem Sinne reinbekomme.

    Ich muss ja in den Eigenschaften von dem Button in dem Dialogfeld Text nur ein %s eingeben und unter dem Dialogfenster Variablen die Textausgabe mit der entsprechenden Echtzeit deklarieren. Nur zeit er dann auf dem Button immer #DT 2008-09-30-15:02:05 an. Und genau das wollte ich ja nicht. Darum ja meine Frage wie die im Dialogfenster deklariert werden muss damit er mir auf dem Button 30-09-2008 15:02:05 anzeigt.

    MFG Dennis

     
  • Softwerker59 - 2008-10-01

    Hallo Dennish23,

    soweit ich Dich richtig verstanden habe, möchtest Du auf dem Button die Systemzeit des Gerätes formatiert anzeigen.

    Das geht sehr einfach und auch ohne eine Variable im Dialog "Textausgabe".

    Wenn Du im Konfigurationsdialog in der Kategorie "Text" den Formatstring: %t %d-%m-%Y %H:%M:%S eingibst, erscheint die Systemzeit. Unter "Variable->Textausgabe" wird keine (!!) Variable mehr benötigt.

    Gruß

    Klaus

     
  • Uwe - 2008-10-01

    Hallo Klaus,

    bei deiner Variante bekommst du nicht die Systemzeit des Gerätes sondern

    die Zeit des Systems auf dem die Visu angezeigt wird.

    Wenn du nun eine Soft-SPS hast und auf diesem Gerät (z.B. PC) auch die Visu anzeigst,

    dann passt es zufällig.

    Wenn du aber eine separate SPS hast, dann bekommst du auf deinem Visualisierungs-PC

    mit dem Formatstring nur die PC-Zeit angezeigt.

    Ich denke der Ansatz von Norbert ist schon nicht schlecht.

    Die Zeit in der SPS so in einen String formatieren wie man sie gerne hätte

    und dann diesen String in der Visu anzeigen.

    Also

    • Zeit auslesen.................................................. -> SysRtcGetTime

    • von DT in String wandeln................................. -> DT_TO_STRING

    • in Einzelkomponenten zerlegen........................ -> MID

    • ....

    • und dann die Einzelkomponenten zusammenbauen -> CONCAT

    • ....

    Nun muss nur noch das Ergebnis in der Visu angezeigt werden.

     
  • Softwerker59 - 2008-10-01

    Hallo Uwe,

    ich habe das schon verstanden, aber das MFD ist eine SPS mit STN oder TFT Display auf dem die Targetvisu läuft.

    Deshalb sollte das mit dem Formatstring eigentlich funktionieren, es sei denn, man hat zusätzlich eine Variable für die Textausgabe eingetragen.

    Das führt dann nämlich zu den merkwürdigsten Ausgaben.

    Gruß

    Klaus

     
  • Dennish23 - 2008-10-08

    Vielen Dank Softwerker. Funktioniert super. Danke nochmal für deine Hilfe.

     
  • Matze001 - 2008-10-10

    Habe den Code in der Simulation auch mal ausprobiert.

    Das die Zeit nicht korrekt ist ist klar,...

    Nur habe ich folgendes Problem: Die Werte werden vier bis fünfmal hintereinander geschrieben... also etwa so:

    011970 00:00:00011970 00:00:00011970 00:00:00011970 00:00:00011970 00:00:00

    Liegt es daran das ich die Simulation nutze? Habe leider grad keine 841 zum Testen da!

    MfG

    Marcel

     
  • Dennish23 - 2008-10-10

    Also ich habe es direkt auf meiner SPS ausprobiert und die zeit wird genau angezeigt. Habe Sie mit dem PLC überprüft. Du darfst keine Variable eintragen einfach nur %t damit weist du auf die Zeit hin und dann musst du sie dir zusammenbauen.

    z.Bsp %t %d.%m.%Y - %H:%M:%S

    Also wie gesagt funktioniert bei mir.

    MFG Dennis

     
  • Matze001 - 2008-10-10

    Ich bezog mich aber auf den Code von Denkes!

    Den kann man nicht einfach so eintragen sondern die Variable in "Textvariable" oder sehe ich das falsch?

    MfG

    Marcel

     
  • Dennish23 - 2008-10-10

    Dieser Code den ich geschrieben habe den musst du in dem Dialogfeld Text eintragen und ansonsten für das Textfeld keine andere Variable eintragen da du sonst irgendwelchen kram angezeigt bekommst da die SPS nicht genau weiß was sie nun machen soll.

    Wenn du eine Variable eintragen möchtest musst du sie dir wirklich zusammenbauen mit hilfe von dem Befehl Contact. Aber die andere Variante geht wesentlich einfacher.

    MFG Dennis

     
  • Matze001 - 2008-10-10

    Dann habe ich aber die Zeit von meinem PC, was ich vermeiden will.

    Ich brauche die Zeit der Systemuhr, und das so das man sie auch anschauen kann... und kein DT# bla bla

    MfG

    Marcel

     
  • Dennish23 - 2008-10-10

    Ja wenn du es nicht simulierst sondern dein Prog direkt auf der Anlage hast dann nimmt er die Systemzeit der Anlage. Da du jetzt ja simulierst nimmt er natürlich die Systemzeit deines Computers da du es ja darauf simulierst.

    MFg Dennis

     
  • Matze001 - 2008-10-10

    ... ich depp

    Ich habe nichts gesagt... bitte vielmals um Entschuldigung

    Danke für die schnelle Hilfe!

    MfG

    Marcel

     
  • Dennish23 - 2008-10-10

    Schon ok Marcel.

    MFG Dennis

     
  • Matze001 - 2008-10-11

    Passt nicht so direkt hier rein, will aber kein neues Thema dafür aufmachen.

    Ich will für jeden Tag im Jahr einen kleinen Button machen.

    Jeder Monat hat ja eine unterschiedliche Anzahl Tage.

    Gibt es eine Möglichkeit dies irgendwie von der Steuerung rauszukitzeln?

    Ich habe eine Wago 750-841

    Bisher bin ich bei dem Punkt das ich für jeden Monat eine Variable hinterlege welche der höchste Tag ist (bsp. Feb. 28) und dann immer mit GT (Greater Then) die nicht vorhandenen Tage abfange... gibt es eine elegantere Möglichkeit?

    MfG

    Marcel

     
  • Pitsch52 - 2008-10-11

    Hallo

    Nach Adam Rise, ergibt das 365 Buttons in Schaltjahren etc noch mehr.

    Wärst Du da nicht besser bedient, wenn Du das Ganze irgendwie in Form eines Kalenders Visualisieren würdest?

    Monatsweise, wo Du das Datum in Form einer Rollbox oder Kombobox auswählen könntest.

    Würde viel übersichtlicher.

    Mit freundlichen Grüssen! Pitsch

     
  • Matze001 - 2008-10-11

    so hab ich es auch gemacht... etwas umständlich habe ich es gelöst, aber bisher klappt es... muss nur noch die Logik dahinter programmieren...

    MfG

    Marcel

    P.S: Bild kann folgen wenn ihr wollt...

     
  • Matze001 - 2008-10-11

    Denkes hat geschrieben:

    (* 1. Wochentagsname *)
    CASE Wochentag
    OF
       1:Zeit_aktuell := 'Sonntag, ';
       2:Zeit_aktuell := 'Montag, ';
       3:Zeit_aktuell := 'Dienstag, ';
       4:Zeit_aktuell := 'Mittwoch, ';
       5:Zeit_aktuell := 'Donnerstag, ';
       6:Zeit_aktuell := 'Freitag, ';
       7:Zeit_aktuell := 'Samstag, ';
    END_CASE;
    

    Hallo,

    dieser Teil deines Codes wird nicht verarbeitet, du hast ja auch nirgends die Variable Wochentag gebildet. Würde mich freuen wenn du den fehlenden Programmteil nachliefern könntest!

    Oder habe ich etwas übersehen???

    MfG

    Marcel

     
  • Oberchefe - 2008-10-11

    Also meine Funktion Wochentag sieht so aus(Achtung: bei mir ist Sonntag =0):

    FUNCTION Wochentag: UINT         (*Wochentag, 0= Sonntag, 1=Montag, 2=Dienstag...6=Samstag*)
    VAR_INPUT
       Jahr:               UINT;   (*Jahr des zu ermittelnden Wochentags*)
       Monat:               UINT;   (*Monat des zu ermittelnden Wochentags*)
       Tag:               UINT;   (*Tag (Datum) des zu ermittelnden Wochentags*)
    END_VAR
    VAR
       JahrEiner:            UINT;
       JahrHunderter:      UINT;
    END_VAR
    
    (************************************************************************************************************)
    (*               Wochentag aus Datum ermitteln                                          *)
    (*   Nach Formel "Zellers Kongruenz" (Gregorianischer Kalender) Wikipedia,                     *)
    (************************************************************************************************************)
    (*                                                                                 *)
    (*       0 = Sonntag                                                                  *)
    (*      1 = Montag                                                                  *)
    (*       2 = Dienstag                                                                  *)
    (*       3 = Mittwoch                                                                  *)
    (*       4 = Donnerstag                                                               *)
    (*       5 = Freitag                                                                     *)
    (*       6 = Samstag                                                                  *)
    (*                                                                                 *)
    IF Monat < 3 THEN            (*   der Januar und Februar wird als Monat des Vorjahres gezählt   *)
       Monat:= Monat +12;         (*   dies vereinfacht die Schaltjahrproblematik                  *)
       Jahr:= Jahr -1;
    END_IF
    JahrHunderter:= Jahr / 100;
    JahrEiner:= Jahr - 100*JahrHunderter;
    Wochentag:= (70+Tag+((Monat+1)*26)/10 + JahrEiner+ JahrEiner/4 + JahrHunderter/4 - 2*JahrHunderter - 1) MOD 7;
    (* die Minus 1 kurz vor MOD 7 verschiebt die Wochentage, aus Sonntage = 1 wird Sonntag = 0         *)
    (* die Plus 70 am Anfang der Formel verhindert negative Werte nach Abzug von 2 mal Jahrhunderter   *)
    
     
  • Matze001 - 2008-10-11

    Danke für den Code!

    Ich habe noch einmal folgendes eingebracht:

    IF Wochentag = 0 THEN
    Wochentag:=7;
    END_IF
    

    Somit hat sich das Problem mit der 0 auch erledigt!

    MfG

    Marcel

     

Log in to post a comment.