delphinis - 2016-11-22

Hallo,
bin ziemlich neu bei PLCs. Hab immer probleme mich umzustellen, weil das Programmieren von PLCs irgendwie nicht so straight forward ist, wie im "normalen" Programmieren.
Beispiel:
Wollte nur die Aktuelle Zeit in eine DT-Variable holen. Es gibt nun ein Beispiel-Projekt, welches die CAA DTUtility gebraucht. Nun, für eine gewöhnliche, aktuelle Zeit zu bekommen, braucht es eine komplette Status-Maschine mit sage und schreibe 6 States!
Ich bin aber in einem Task, der jede ms aufgerufen wird und auch jede ms die aktuelle Zeit (in ms) anzeigt! Wie kann ich da auf eine Zeit warten die etwa 3-5ms dafür benötigt. Ich benötige aber auch keine Sommerzeit-Umschaltung und sonstige zusätzliche features.

Wenn ich das richtig sehe, ist es offenbar ziemlich normal für jede Kleinigkeit solche Statusmaschinen zu bauen um simple Probleme zu lösen, oder hab ich nur die falschen Beispiele erwischt? Wieso krieg ich nicht einfach eine aktuelle Zeit, sofort und ohne dass mir das Programm wieder in den nächsten Zyklus muss?

Ok, ziemlich viele Fragen und vielleicht hab ich was nicht begriffen, aber irgendwie komm ich mit dem Umstieg ziemlich schwer. Wenn man in "normalen" Programmiersprachen programmiert ist alles direkter: Zeit holen, in einen String wandeln, in eine Datei schreiben, alles hintereinander ohne Zeitverzögerung...

PS: unten ist ein bisschen code dieser Status-Maschine DTUtility

CASE iState OF
   0:   (*set the timezone information
        this gc_tziTimeZoneCET variable includes the date for switch to summer and winter time and the
        bias for the timezone for the Central European EU countries*)
      SetTimeZoneInformation(xExecute:= TRUE, tziInfo:= DTU.GlobalConstants.gc_tziTimeZoneCET);
      IF SetTimeZoneInformation.xDone THEN
         SetTimeZoneInformation(xExecute:= FALSE);
         iState:= 1;
      END_IF
      IF SetTimeZoneInformation.xError THEN
         SetTimeZoneInformation(xExecute:= FALSE);
         iState:= 32767;
      END_IF
      
   1:  // retrieves the current date and time, including the timezone information which was set before
      GetDateAndTime( xExecute:= TRUE);
      IF GetDateAndTime.xDone THEN
         dtCurrent:= GetDateAndTime.dtDateAndTime;
         GetDateAndTime(xExecute:= FALSE);
         iState:= 2;
      END_IF
      IF GetDateAndTime.xError THEN
         GetDateAndTime(xExecute:= FALSE);
         iState:= 32767;
      END_IF
   
   2: (*set a spedific date and time --> returns a variable of type DATE_AND_TIME 
        DateConcat --> set only date information --> returns a variable of type DATE
       TODConcat  --> set only the time information  --> returns a variable of TOD (Time of day) *)
      dtConcated := DTU.DTConcat(uiYear:= 2010, uiMonth:= 10, uiDay:= 5, 
                     uiHour:= 9, uiMinute:= 20, uiSecond:= 12, peError:=ADR(dtuError));
      IF dtuError = 0 THEN
         iState := 3;
      ELSE
         iState := 32767;
      END_IF
      
   3:  (*a DATE_AND_TIME variable is splitted in its parts, like year, month, day etc.
           DateSplit --> the same function for a DATE variable
         TODSplit  --> the same function for a TOD variable *)
      dtuError := DTU.DTSplit(
         dtDateAndTime := dtConcated,
         puiYear := ADR(uiYear), 
         puiMonth := ADR(uiMonth), 
         puiDay := ADR(uiDay), 
         puiHour := ADR(uiHour), 
         puiMinute := ADR(uiMinute), 
         puiSecond := ADR(uiSecond));
         
      IF dtuError = 0 THEN
         iState:= 4;
      ELSE
         iState:= 32767;
      END_IF
   4:  (*this function returns the weekday of a DATE variable *)
      eWeekday := DTU.GetDayOfWeek(dtDate := DATE#2010-5-15,peError := ADR(dtuError));
   
      IF dtuError = 0 THEN
         iState:= 1;
      ELSE
         iState:= 32767;
      END_IF
      
   32767: ; //error
      
END_CASE