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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: TIME OF DAY <> WinCC V7

  1. #11
    Registriert seit
    19.06.2015
    Beiträge
    459
    Danke
    26
    Erhielt 40 Danke für 35 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn das funktioniert hätte es eine allgemeine Veröffentlichung verdient FinnAH.
    Bitte dann die vollständigen Skripte mal veröffentlichen.Das interessiert mich auch.

  2. #12
    FinnAh ist offline Benutzer
    Themenstarter
    Registriert seit
    20.08.2014
    Beiträge
    44
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das werde ich tun

  3. #13
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Wenn du bei einem EA-Feld ein C-Script beim Ereignis "Eingabewert Änderung" einfügst, sollte es so funktionieren:
    Code:
    void OnPropertyChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, char* value)
    {
    unsigned long tod;
    int error;
    
    tod = StringToTimeOfDay(value, &error);
    if (error == 0) {
      SetTagDWord("DeineTimeOfDayVariable", tod);
    }
    }
    Wenn eine falsche Zeit eingegeben wird, wird nichts geschrieben. Bei Bedarf könnte man das um eine Meldung ergänzen, dass die Eingabe nicht korrekt war.

  4. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Ich habe die Funktionen zur Vereinfachung der Verwendung in WinCC mal etwas angepasst.

    Zuerst werden die beiden folgenden Global-Scripts angelegt:

    SetTagDWordTimeOfDay:
    Code:
    #define ERR_STRING_ZU_LANG       1
    #define ERR_UNGUELTIGES_ZEICHEN  2
    #define ERR_STELLENANZ_H_M_S     3
    #define ERR_STELLENANZ_MS        4
    #define ERR_H_M_S_NICHT_VOLLST   5
    #define ERR_MS_NICHT_VOLLST      6
    #define ERR_WERTUEBERSCHR_H      7
    #define ERR_WERTUEBERSCHR_M      8
    #define ERR_WERTUEBERSCHR_S      9
    #define ERR_WERTUEBERSCHR_MS     10
    // Rückgabe TRUE wenn ohne Fehler, FALSE wenn ein Fehler aufgetreten ist
    BOOL SetTagDWordTimeOfDay(Tag Tag_Name, char *value)
    {
        int error;
        unsigned long time_of_day;
        int i, j;
        int h = 0, m = 0, s = 0, ms = 0;
        char sVal[4][4];
        int stage;
        sVal[0][0] = '\0';
        sVal[1][0] = '\0';
        sVal[2][0] = '\0';
        sVal[3][0] = '\0';
    
        if (value == NULL) {
            return FALSE;
        }
        if (strlen(value) > 12) {
            error = ERR_STRING_ZU_LANG;
            return FALSE;
        }
        stage = 0;
        j = 0;
        for (i = 0; i < strlen(value); i++) {
            if (value[i] >= '0' && value[i] <= '9') {
                sVal[stage][j] = value[i];
                if (stage < 3 && j >= 2) {
                    error = ERR_STELLENANZ_H_M_S;
                    return FALSE;
                } else if (j >= 3) {
                    error = ERR_STELLENANZ_MS;
                    return FALSE;
                }
                j++;
            } else if (value[i] == ':') {
                sVal[stage][j] = '\0';
                stage++;
                j = 0;
            // Millisekunden sind nur erlaubt nach allen drei vorherigen Stufen
            } else if (stage == 2 && value[i] == '.') {
                sVal[stage][j] = '\0';
                stage = 3;
                j = 0;
            } else {
                error = ERR_UNGUELTIGES_ZEICHEN;
                return FALSE;
            }
        }
        // Wurde ein Punkt angegeben, so muss auch ein Wert für Millisekunden folgen
        if (stage == 3 && strlen(sVal[3]) == 0) {
            error = ERR_MS_NICHT_VOLLST;
            return FALSE;
        }
        // Auf Gültigkeit prüfen. Es müssen Stunden, Minuten und Sekunden angegeben sein.
        for (i = 0; i <= 2; i++) {
            if (strlen(sVal[i]) < 1) {
                error = ERR_H_M_S_NICHT_VOLLST;
                return FALSE;
            }
            switch (i){
                case 0:
                    h = atoi(sVal[i]);
                    if (h > 23) {
                        error = ERR_WERTUEBERSCHR_H;
                        return FALSE;
                    }
                    break;
                case 1:
                    m = atoi(sVal[i]);
                    if (m > 59) {
                        error = ERR_WERTUEBERSCHR_M;
                        return FALSE;
                    }
                    break;
                case 2:
                    s = atoi(sVal[i]);
                    if (s > 59) {
                        error = ERR_WERTUEBERSCHR_S;
                        return FALSE;
                    }
                    break;
            }
        }
        if (strlen(sVal[3]) > 0) {
            ms = atoi(sVal[3]);
            if (ms > 999) {
                error = ERR_WERTUEBERSCHR_MS;
                return FALSE;
            }
        }
        time_of_day = (h * 3600000u + m * 60000u + s * 1000u + ms);
        SetTagDWord(Tag_Name, time_of_day);
        return TRUE;
    }
    und GetTagDWordTimeOfDay:
    Code:
    char *GetTagDWordTimeOfDay(Tag Tag_Name)
    {
        unsigned long time_of_day;
        char *str = SysMalloc(13);
    
        time_of_day = GetTagDWord(Tag_Name);
        if (time_of_day > 86399999u) {
            time_of_day = 86399999u;
        }
        sprintf(str, "%02lu:%02lu:%02lu.%03lu",
               (time_of_day / 3600000u), 
    	     (time_of_day % 3600000u) / 60000u, 
               ((time_of_day % 3600000u) % 60000u) / 1000u,
               ((time_of_day % 3600000u) % 60000u) % 1000u
        );
        return str;
    }
    Verwendung der Funktionen bei einem EA-Feld:

    Ausgabewert Eigenschaften -> Ausgabe/Eingabe -> Ausgabewert: C-Skript einfügen, Variablentrigger auf die TimeOfDay-Variable einstellen.
    Code:
    #include "apdefap.h"
     char* _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
    {
        // WINCC:TAGNAME_SECTION_START
        #define TIMEOFDAY_VARIABLE "tod1"
        // next TagID : 1
        // WINCC:TAGNAME_SECTION_END
        return GetTagDWordTimeOfDay(TIMEOFDAY_VARIABLE);
    }
    und

    Ereignis -> Propertythemen -> Ausgabe/Eingabe -> Eingabewert: Änderung: C-Skript einfügen
    Code:
    #include "apdefap.h"
    void OnPropertyChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName,  char*  value)
    {
        // WINCC:TAGNAME_SECTION_START
        #define TIMEOFDAY_VARIABLE "tod1"
        // next TagID : 1
        // WINCC:TAGNAME_SECTION_END
    
        SetTagDWordTimeOfDay(TIMEOFDAY_VARIABLE, value);
    }
    Bisher muss bei der Eingabe der TimeOfDay-Variable die komplette Syntax eingehalten werden, d.h. immer Stunden, Minuten, Sekunden und Millisekunden. Bei Bedarf könnte man sich das noch so anpassen, dass auch eine Eingabe wie 12:30 dann automatisch als 12:30:00.000 angenommen wird.

  5. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    FinnAh (28.09.2015),RONIN (28.09.2015)

  6. #15
    FinnAh ist offline Benutzer
    Themenstarter
    Registriert seit
    20.08.2014
    Beiträge
    44
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vielen Dank, funktioniert jetzt einwandfrei.


    Grüße
    Finn
    Geändert von FinnAh (29.09.2015 um 11:43 Uhr)

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 13.11.2014, 14:59
  2. WinCC Time of Day ausgeben
    Von Contor im Forum HMI
    Antworten: 2
    Letzter Beitrag: 18.07.2014, 08:39
  3. WinCC V7 - Datentyp TIME OF DAY
    Von RONIN im Forum HMI
    Antworten: 3
    Letzter Beitrag: 09.03.2014, 14:30
  4. Time of day 2.0
    Von badarni im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 05.02.2013, 12:07
  5. Time of Day
    Von enter im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 14.09.2007, 20:27

Stichworte

Lesezeichen

Berechtigungen

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