Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: ARRAY nach aktuellem Datum durchsuchen und löschen

  1. #1
    Registriert seit
    09.08.2013
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Mitglieder,

    ich habe zum ersten mal ein ARRAY erstellt in Form von einem STRUCT,

    in der 10 Urlaubstermine gespeichert werden sollen.

    Die Eingabe, Urlaubsanfang und Urlaubsende werden über einer VISU eingegeben

    was soweit auch funktioniert.


    Mein Problem:

    Das ARRAY soll mit dem aktuellen Datum verglichen werden und die abgelaufene

    Urlaubsangaben automatisch gelöscht werden.
    Z. B. Anfang=22.12.2014 Ende=27.12.2014 sollen am 28.12.2014 gelöscht werden.

    Ich habe keinen Schimmer wie ich das bewerkstelligen soll.

    Der Aufbau ist folgendermaßen:

    TYPE Urlaubsliste :
    STRUCT
    Url_Anfang:STRING(13);
    Url_Ende:STRING(13);
    END_STRUCT
    END_TYPE

    VAR
    Daten:Urlaubsliste;
    ST_Urlaubsliste: ARRAY [1..10] OF Urlaubsliste;
    index: INT:=1;
    END_VAR

    Für eine Lösung wäre ich sehr Dankbar

    Freundliche Grüße
    Ossi64

    Zitieren Zitieren ARRAY nach aktuellem Datum durchsuchen und löschen  

  2. #2
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Programmiert fuer Beckhoff

    PROGRAM MAIN
    VAR
    Daten:ARRAY[0..9] OF Urlaubsliste;(*Dein Array; bitte das Datum in Format TT.MM.JJJJ eigeben*)
    fbTime : FB_LocalSystemTime := ( bEnable := 1, dwCycle := 1 );(*Sehe Lib*)
    logTimer : TON := ( IN :=1, PT := T#1000ms );(* 1s Clock for logging Timebase *)
    Timestring:STRING(25);(*Systemtime*)
    Sys_Data_Y:STRING(5);
    Sys_Data_M:STRING(3);
    Sys_Data_D:STRING(3);
    Urlaub_Y:STRING(5);
    Urlaub_M:STRING(3);
    Urlaub_D:STRING(3);
    i:INT;
    _loeschen:BOOL;
    END_VAR
    ##################################################
    (*aktuelle Zeit besorgen*)
    fbTime();
    logTimer( IN := fbTime.bValid );
    IF logTimer.Q THEN
    logTimer( IN :=0 ); logTimer( IN := fbTime.bValid );
    Timestring:=SYSTEMTIME_TO_STRING(fbTime.systemTime);(*Output local Time*)
    Sys_Data_Y:=MID(STR:=Timestring,LEN:=4,POS:=1);(*Kopiere in die Variable 4 Zeichen ab Pos 1 aus dem Time String*)
    Sys_Data_M:=MID(STR:=Timestring,LEN:=2,POS:=6);
    Sys_Data_D:=MID(STR:=Timestring,LEN:=2,POS:=9);
    END_IF;

    i:=0;
    WHILE i < 10 DO(*alle 10 Array Item abarbeiten in einer Schleife*)

    Urlaub_Y:=MID(STR:=Daten[i].Url_Ende,LEN:=4,POS:=7);(*Urlaub Jahr besorgen*)
    Urlaub_M:=MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=4);
    Urlaub_D:=MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=1);

    _loeschen:=0;(*Wenn True dann wird ein Item geloescht*)
    _loeschen:=STRING_TO_INT(Sys_Data_D) > STRING_TO_INT(Urlaub_D);(*Tag pruefen, wenn groesser dann alles hinfaellig*)
    _loeschen:=_loeschen OR( STRING_TO_INT(Sys_Data_M) > STRING_TO_INT(Urlaub_M));(*Monat pruefen*)
    _loeschen:=_loeschen OR( STRING_TO_INT(Sys_Data_Y) > STRING_TO_INT(Urlaub_Y));(*Jahr pruefen*)
    IF _loeschen THEN(*Urlaub abgelaufen*)
    Daten[i].Url_Ende:='';(*Nullstring schreiben*)
    Daten[i].Url_Anfang:='';
    END_IF;
    i:=i+1;
    END_WHILE;


    Lib:
    TcUtilities
    TcSystem
    TcBase

    Irek

  3. #3
    Registriert seit
    16.03.2014
    Beiträge
    358
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard

    Hallo ihr beiden,
    das Beispiel von Irek gefiel mir, aber ich habe lange lesen müssen wegen der vielen Boolschen vergleiche...

    Hatte mich gereizt, das Beispiel nach meinem Datumsdenken zu überarbeiten, voila:

    Code:
    PROGRAM MAIN
    VAR
        Daten:ARRAY[0..9] OF Urlaubsliste ;        (*Dein Array; bitte das Datum in Format TT.MM.JJJJ eigeben*)
        fbTime : FB_LocalSystemTime := ( bEnable := 1, dwCycle := 1 );(*Sehe Lib*)
        logTimer : TON := ( IN :=1, PT := T#1000ms );(* 1s Clock for logging Timebase *)
        Timestring:STRING(25);(*Systemtime*)
        tDatum    : STRING;
        tUrlEnde    : STRING;
        i:INT := 0;
        bInit    : BOOL := TRUE;
    END_VAR
    
    IF bInit THEN
        Daten[1].Url_Anfang     := '15.06.2014';
        Daten[1].Url_Ende     := '22.06.2014';
        Daten[2].Url_Anfang     := '15.07.2014';
        Daten[2].Url_Ende     := '22.07.2014';
        Daten[3].Url_Anfang     := '31.12.2014';
        Daten[3].Url_Ende     := '07.01.2015';
        bInit := FALSE;
    END_IF
    
    fbTime();
    logTimer( IN := fbTime.bValid );
    IF logTimer.Q THEN
        logTimer( IN :=0 ); logTimer( IN := fbTime.bValid );
        Timestring:=SYSTEMTIME_TO_STRING(fbTime.systemTime);    (*Output local Time*)
        tDatum := MID(STR:=Timestring,LEN:=4,POS:=1);
        tDatum := CONCAT(tDatum, MID(STR:=Timestring,LEN:=2,POS:=6));
        tDatum := CONCAT(tDatum, MID(STR:=Timestring,LEN:=2,POS:=9));
    END_IF;
    
    FOR i:= 0 TO 9 DO;
    
        tUrlEnde := MID(STR:=Daten[i].Url_Ende,LEN:=4,POS:=7);
        tUrlEnde := CONCAT(tUrlEnde, MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=4));
        tUrlEnde := CONCAT(tUrlEnde, MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=1));
    
        IF tDatum > tUrlEnde THEN        (*Urlaub abgelaufen*)
            Daten[i].Url_Ende:='';        (*Nullstring schreiben*)
            Daten[i].Url_Anfang:='';
        END_IF;
    
    END_FOR;
    LG
    Shrimps

  4. #4
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    @Shrimps Danke fuer den naechsten Beispiel. Bedenke bitte, dass in Forum auch User ohne Kenntnisse nach Hilfe suchen. Wenn jemand offen schreibt "Ich habe keinen Schimmer wie ich das bewerkstelligen soll.", dann sollte man auch paar Kommentare hinterlassen. Wenn ausser Ossi64 noch andere davon profitieren, dann denke ich haben wir guten Job abgeliefert. Irek

  5. #5
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Nachtrag:

    PROGRAM MAIN
    VAR
    Daten:ARRAY[0..9] OF Urlaubsliste;(*Dein Array; bitte das Datum in Format TT.MM.JJJJ eigeben*)
    fbTime : FB_LocalSystemTime := ( bEnable := 1, dwCycle := 1 );(*Sehe Lib*)
    logTimer : TON := ( IN :=1, PT := T#1000ms );(* 1s Clock for logging Timebase *)

    _Systemzeit:WORD;
    _Urlaubszeit_Ende:WORD;
    i: INT;
    END_VAR
    ####################################
    fbTime();
    _Systemzeit:=fbTime.systemTime.wDay+fbTime.systemTime.wMonth+fbTime.systemTime.w Year;(*Summe bilden*)
    FOR i:=0 TO 9 BY 1 DO
    (*hier genauso*)
    _Urlaubszeit_Ende:=STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=4,POS:=7))+STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=4))+STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=1));
    IF _Systemzeit > _Urlaubszeit_Ende THEN(*und vergleichen*)
    Daten[i].Url_Anfang:='';
    Daten[i].Url_Ende:='';
    END_IF;
    END_FOR;
    #######################################


    Irek

  6. Folgender Benutzer sagt Danke zu Irek für den nützlichen Beitrag:

    shrimps (30.12.2014)

  7. #6
    Registriert seit
    16.03.2014
    Beiträge
    358
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard

    Hallo Irek,
    sorry, du hast vollkommen Recht.
    Als "alter Hase" beim programmieren weiss ich, das Kommentare das wichtigste überhaupt sind.
    Habe selber mal gelernt, das mind. 1 Zeile Kommentar pro Codezeile sein sollte...

    Beim nächsten mal...

    Aber es ist schön anzusehen, wie das nochmals verfeinert hast.
    Das hilft mir wiederum die Datentypen von Twincat besser zu erkennen (Word aus Time).

    Wobei dir und mir komplexe Zeilen nach kurzer Zeit klar sind und ich deswegen auch z. Teil Hilfsvariablen nutze...
    Genau wegen diesen hätte ich ja Kommentare setzen müssen, damit es Einsteigern leichter fällt.

    Prima !

    Beste Grüße
    Shrimps

    PS: So macht mir ein Forum Spaß, es kommen lauffähige Konstrukte von Erfahrenen !
    Leider habe ich auch sehr oft die Erfahrung von "Oberlehrern" gemacht, die gar keinen einzigen funktionierenden Code rausgeben und nur "verbal" auf besseres hinweisen.

  8. #7
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.334
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard

    Zitat Zitat von Irek Beitrag anzeigen
    _Systemzeit:=fbTime.systemTime.wDay+fbTime.systemTime.wMonth+fbTime.systemTime.w Year;(*Summe bilden*)
    ...
    _Urlaubszeit_Ende:=STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=4,POS:=7))+STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=4))+STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=1));
    ...
    IF _Systemzeit > _Urlaubszeit_Ende THEN(*und vergleichen*)
    Hmm.. Interessante Vorgehensweise mit der Summe aber... hmm... hab ich es jetzt nicht richtig verstanden... was ist wenn:
    Systemzeit: 01.07.2014 => 2022
    UrlaubEnde: 31.06.2014 => 2051
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  9. #8
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    @RONIN
    mein Fehler! und Korrektur

    fbTime();

    FOR i:=0 TO 9 BY 1 DO
    _loeschen:=0; (*sonst ist alles weg*)
    _loeschen:=fbTime.systemTime.wYear > STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=4,POS:=7));(*Urlaub Jahr vergleichen*)
    _loeschen:=_loeschen OR fbTime.systemTime.wMonth > STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=4));(*Urlaub Monat vergleichen*)
    _loeschen:=_loeschen OR fbTime.systemTime.wDay > STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=1));(*Urlaub Tag vergleichen*)
    IF _loeschen THEN(*wenn Jahr oder Monat oder Tag im System groesser als Urlaub-Ende dann *)
    Daten[i].Url_Anfang:='';(*Nullstring schreiben*)
    Daten[i].Url_Ende:='';
    END_IF;
    END_FOR;
    Geändert von Irek (30.12.2014 um 12:44 Uhr)

  10. #9
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    leider Fehler passiert. Manchmal sind einfache Sachen ...
    Ich habe das Datum einfach umgewandelt, d.h. 01.10.2015 zu einer INT Zahl 20151001.
    (Wegen der Stringumwandlung muss der Tag zweistellig sein, also der erste wird mit 01 eingegeben!)
    Damit ist fuer jeden Tag ein eindeutiger Wert gegen.
    Wenn das auch mit dem System Zeit passiert, dann haben wir zwei eindeutige Zahlen, die zum Vergleich anstehen.
    PROGRAM MAIN
    VAR
    Daten:ARRAY[0..9] OF Urlaubsliste;(*Dein Array; bitte das Datum in Format TT.MM.JJJJ eigeben*)
    fbTime : FB_LocalSystemTime := ( bEnable := 1, dwCycle := 1 );(*Sehe Lib*)
    logTimer : TON := ( IN :=1, PT := T#1000ms );(* 1s Clock for logging Timebase *)
    i: INT;
    _Sys_TimeINT;
    _Urlaubs_DatumINT;
    _loeschen: BOOL;
    END_VAR
    ############################################
    fbTime();
    _Sys_Time:=(fbTime.systemTime.wYear*10000)+(fbTime.systemTime.wMonth*100)+fbTime .systemTime.wDay;(*=20141230*)(*ohne Mathe nix los!!*)
    FOR i:=0 TO 9 BY 1 DO
    _Urlaubs_Datum:=STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=4,POS:=7))*10000;
    _Urlaubs_Datum:=_Urlaubs_Datum+STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=4))*100;(*Monat hinzuaddieren*)
    _Urlaubs_Datum:=_Urlaubs_Datum+STRING_TO_INT(MID(STR:=Daten[i].Url_Ende,LEN:=2,POS:=1));(*=JJJJMMDD*)(*=20150315*)

    IF _Sys_Time > _Urlaubs_Datum THEN(*jetzt nur INT vergleichen*)
    Daten[i].Url_Anfang:='';
    Daten[i].Url_Ende:='';
    END_IF;
    END_FOR;
    Geändert von Irek (30.12.2014 um 13:51 Uhr)

  11. #10
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.334
    Danke
    448
    Erhielt 688 Danke für 513 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Irek Beitrag anzeigen
    _Sys_TimeINT;
    _Urlaubs_DatumINT;
    _loeschen: BOOL;
    Code:
    _Sys_Time: DINT;
    _Urlaubs_Datum: DINT;
    _loeschen: BOOL;
    @Irek. Wenn du hier schon einen Codehaufen nach dem anderen reinklatschst, dann bitte nimm doch die Code-Tags.
    [ CODE] [ /CODE] oder das #-Symbol in der Menüleiste.
    Geändert von RONIN (30.12.2014 um 14:54 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

Ähnliche Themen

  1. DB nach Array durchsuchen
    Von gPunkt im Forum Programmierstrategien
    Antworten: 3
    Letzter Beitrag: 05.02.2014, 12:10
  2. Step 7 DB nach Array durchsuchen
    Von TimeOUT im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 31.07.2013, 14:14
  3. Antworten: 27
    Letzter Beitrag: 21.06.2012, 15:12
  4. Aktuelle Zeit und Datum in Array schreiben
    Von JanMichael im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 25.02.2011, 13:04
  5. Array an FC übergeben und löschen (SCL)
    Von Isha im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 22.04.2010, 10:23

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •