# Sytemzeit ändern



## Itus (10 März 2010)

Hallo Zusammen

Ich hab einen CX1020 mit Windows CE 6.0 am laufen.
TargetVisu als Benutzeroberfläche, Windows Taskleiste ist ausgeblendet.

Nun möchte ich, dass der Anwender die Uhrzeit und das Datum selber verändern kann.
Über die Visu kann ich über Programme konfigurieren mit dem Befehl \windows\control.exe das ganze Control Panel aufrufen. Nun kann der Anwender die Uhrzeit über Date/Time verändern - er hat aber auch auf alles andere Zugriff wie die CX Configuration etc und das gefällt mir nicht.

Gibt es eine Möglichkeit direkt das Fensterchen für Datum und Uhrzeit aufzurufen? Kann ich den \windows\control.exe Befehl erweitern damit sich sofort das Date/Timer Fenster öffnet?

Oder gibt es etwas ähnliches wie bei XP die 'RunDLL32 shell32.dll, Control_RunDLL.......' ?

Danke und Gruss
Itus


----------



## cybertracepda (10 März 2010)

Hallo !
Es gibt in der TCUtilities.lib die Funktionen

NT_SetLocalTime und NT_SetTimeToRTCTime, damit kannst du über einen Zeitstring die Uhrzeit am CX setzen, den du in der VIsu eingibst.

Steht im Inofsystem näher beschrieben


----------



## Chräshe (11 März 2010)

Hallo cybertracepda,

Hier im Info-System steht noch viel mehr: 

*FUNCTION_BLOCK NT_SetTimeToRTCTime*
Diese Funktionalität ist in dem SPS-Laufzeitsystem unter *Windows CE* nicht verfügbar!

 Leider hab ich für Windows CE auch keine Lösung.  :sad:

 Gruß
 Chräshe


----------



## Fx64 (11 März 2010)

Wie wäre es über NT_StartProcess die CMD.exe mit Parameter "time" aufzurufen?


----------



## Christian_EWW (11 März 2010)

Hallo

Auslesen der Zeit aus dem Betriebssystem: NT_GetTime
Schreiben deer Zeit in das Betriebssystem: NT_SetLocalTime
Hab ich selbst in einem kleinen CP mit WinCE5 laufen, sieht etwa so aus:
PROGRAM P_Uhrzeit
VAR
    CLK_PRG1: CLK_PRG;
    NT_GetTime1: NT_GetTime;
    F_TRIG1: F_TRIG;
    RTC1: RTC;
    NT_SetLocalTime1: NT_SetLocalTime;
    R_TRIGedit: R_TRIG;
    bZeitEdit: BOOL;        (*öffnet/ schliesst das Fenster zum editieren der Uhrzeit in der Visu*)
    SYSTEMTIMEpuffer: TIMESTRUCT;        (*Buffer zum editieren der Uhrzeit in der Visu*)
    bZeitSave: BOOL;        (*Befehl zum Speichern der Uhrzeit*)
    F_TRIGedit: F_TRIG;
    sAktuelleUhrzeit: STRING(10);
    todAktuelleUhrzeit: TOD;
END_VAR
#################################################
(*Takt für Aktualisierung der Zeit*)
CLK_PRG1(PT:= t#30s, Q=> );

(*Auslesen und Umrechnen der aktuellen Systemzeit*)
NT_GetTime1(
    NETID:= '',
    START:= CLK_PRG1.Q OR F_TRIGedit.Q,
    TMOUT:= DEFAULT_ADS_TIMEOUT,
    BUSY=> ,
    ERR=> ,
    ERRID=> ,
    TIMESTR=> );
F_TRIG1(CLK:= NT_GetTime1.BUSY AND NOT NT_GetTime1.ERR, Q=> );
RTC1(EN:= F_TRIG1.Q, PDT:= SYSTEMTIME_TO_DT(NT_GetTime1.TIMESTR), Q=> , CDT=> );
todAktuelleUhrzeit:= DT_TO_TOD(RTC1.CDT);
sAktuelleUhrzeit:= DT_TO_STRF(RTC1.CDT, 0, '#M:#Q:#S', 2);

(*Schreiben der Uhrzeit ins Betriebssystem*)
R_TRIGedit(CLK:= bZeitEdit, Q=> );
IF R_TRIGedit.Q THEN
    SYSTEMTIMEpuffer:= NT_GetTime1.TIMESTR;
END_IF

NT_SetLocalTime1(START:= FALSE);
IF bZeitSave THEN
    NT_SetLocalTime1(
        NETID:= '',
        TIMESTR:= SYSTEMTIMEpuffer,
        START:= TRUE,
        TMOUT:= DEFAULT_ADS_TIMEOUT,
        BUSY=> bZeitSave,
        ERR=> ,
        ERRID=> );
END_IF
F_TRIGedit(CLK:= bZeitSave, Q=> );
IF F_TRIGedit.Q THEN
    bZeitEdit:= FALSE;
END_IF

Soweit ich mich erinnern kann, sind auch Befehle der Oscart.lib verwendet.
In der Visualisierung wird mittels bZeitEdit:= TRUE ein Popup Fenster geöffnet in dem die SYSTEMTIMEpuffer editiert werden kann, Speichern mit bZeitSave:= TRUE; Abbrechen mit bZeitEdit:= FALSE;

Funktioniert wunderbar.
Christian


----------



## Itus (11 März 2010)

Hallo Zusammen

Besten Dank für die Vorschläge.

Fx64, deine Idee hab ich implementiert. Cmd wird schön aufgerufen, nun müsste ich noch wissen, wie ich ein Keypad einblende. Ich hab reine Touchoberfläche - gehe ich mit Cerhost auf den Rechner kann ich die Zeit über meinen Laptop verändern.

Danke und Gruss
Itus


----------



## Chräshe (12 März 2010)

Hallo allerseits,

 das mit den vielen Zeiten finde ich doch etwas verwirrend.  
  Ich hab 5 unterschiedliche Zeiten zur Auswahl!?!  :s21: ->  TwinCAT Zeitquellen

 Mit dem FB NT_GetTime kann ich die „Windows/NT Zeit“ mit 1ms Auflösung auslesen. Das ist für meine Anwendungen praktisch immer ausreichend. 

 Wenn ich jetzt mit dem FB NT_SetLocalTime die „Windows/NT Zeit“ neu einstelle, läuft die  „Windows/NT Zeit“ nach einem Neustart dann mit der neu eingestellten Zeit weiter, oder wird diese von der RTC frisch initialisiert?  
            Leider hab ich gerade keine Steuerung zum testen parat.

 Weiß jemand, ob es bei Win CE, mit  Ausnahme von „NT_SetTimeToRTCTime“,  weitere Einschränkungen gibt?
 Ich konnte aktuell nichts finden, aber das heißt ja nichts... 

 Gruß
 Chräshe


----------



## Christian_EWW (12 März 2010)

Wenn du NT_SetLocalTime verwendest, verstellst du die Zeit im Betriebssystem (egal ob du das Recht dazu hast oder nicht :wink: ) die Uhrzeit bleibt also auch beim Neustart erhalten, war zumindest bei meinem CP so.

Christian


----------

