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
CASEiStateOF
  0:  (*setthetimezoneinformation
     thisgc_tziTimeZoneCETvariableincludesthedateforswitchtosummerandwintertimeandthe
     biasforthetimezonefortheCentralEuropeanEUcountries*)
    SetTimeZoneInformation(xExecute:=TRUE, tziInfo:=DTU.GlobalConstants.gc_tziTimeZoneCET);
    IFSetTimeZoneInformation.xDoneTHEN
      SetTimeZoneInformation(xExecute:=FALSE);
      iState:=1;
    END_IF
    IFSetTimeZoneInformation.xErrorTHEN
      SetTimeZoneInformation(xExecute:=FALSE);
      iState:=32767;
    END_IF
   Â
  1: //retrievesthecurrentdateandtime, includingthetimezoneinformationwhichwassetbefore
    GetDateAndTime(xExecute:=TRUE);
    IFGetDateAndTime.xDoneTHEN
      dtCurrent:=GetDateAndTime.dtDateAndTime;
      GetDateAndTime(xExecute:=FALSE);
      iState:=2;
    END_IF
    IFGetDateAndTime.xErrorTHEN
      GetDateAndTime(xExecute:=FALSE);
      iState:=32767;
    END_IF
 Â
  2: (*setaspedificdateandtime-->returnsavariableoftypeDATE_AND_TIME
     DateConcat-->setonlydateinformation-->returnsavariableoftypeDATE
    TODConcat -->setonlythetimeinformation -->returnsavariableofTOD(Timeofday)*)
    dtConcated :=DTU.DTConcat(uiYear:=2010, uiMonth:=10, uiDay:=5,
              uiHour:=9, uiMinute:=20, uiSecond:=12, peError:=ADR(dtuError));
    IFdtuError=0THEN
      iState :=3;
    ELSE
      iState :=32767;
    END_IF
   Â
  3: (*aDATE_AND_TIMEvariableissplittedinitsparts, likeyear, month, dayetc.
      DateSplit-->thesamefunctionforaDATEvariable
      TODSplit -->thesamefunctionforaTODvariable*)
    dtuError :=DTU.DTSplit(
      dtDateAndTime :=dtConcated,
      puiYear :=ADR(uiYear),
      puiMonth :=ADR(uiMonth),
      puiDay :=ADR(uiDay),
      puiHour :=ADR(uiHour),
      puiMinute :=ADR(uiMinute),
      puiSecond :=ADR(uiSecond));
     Â
    IFdtuError=0THEN
      iState:=4;
    ELSE
      iState:=32767;
    END_IF
  4: (*thisfunctionreturnstheweekdayofaDATEvariable*)
    eWeekday :=DTU.GetDayOfWeek(dtDate :=DATE#2010-5-15,peError :=ADR(dtuError));
 Â
    IFdtuError=0THEN
      iState:=1;
    ELSE
      iState:=32767;
    END_IF
   Â
  32767: ; //error
   Â
END_CASE
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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