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

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 41

Thema: Zeitschaltuhr Pulse

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von emilio20 Beitrag anzeigen
    Bei einer Buderus Heizungssteueeurng mit Zeitschaltuhr kann ich x belibig viele Ein und Ausschaltzeiten einfügen. Sowas wollte ich nachbilden.
    Die Buderus-Steuerung holt sich den Speicher aber auch nicht aus der Luft. Da wird genauso eine maximale Zahl hinterlegt sein, nur bist du da wahrscheinlich noch nicht drauf gestoßen.

    Mach dir doch einfach zwei FBs, einen für kleine Wochenprogramme und einen für große.
    In SCL kannst du die Anzahl auch durch eine Konstante ersetzen
    CONST
    ANZAHL_INTERVALLE := 10;
    END_CONST

    Überall wo du jetzt 10 stehen hast setzt du ANZAHL_INTERVALLE ein. Dann brauchst du den Wert nur an einer Stelle zu ändern.

  2. #12
    Registriert seit
    06.10.2003
    Beiträge
    3.414
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Hallo Emilio,

    wenn du flexibel sein willst, dann solltest du m.E. die Schaltzeiten extern in einem DB ablegen und als ANY an den Baustein übergeben. Über die Längenangabe des ANY ermittelst du die Anzahl der Schaltzeitpaare. Der Wochentag bzw. der Wochentagbereich müßte variabel mit den Schaltzeiten abgelegt werden. Falls dieser Weg für dich in Frage kommt, könnte ich dir noch etwas Starthilfe geben, habe ja mal Zeit zum Basteln .


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  3. #13
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    Hallo Emilio,

    wenn du flexibel sein willst, dann solltest du m.E. die Schaltzeiten extern in einem DB ablegen und als ANY an den Baustein übergeben. Über die Längenangabe des ANY ermittelst du die Anzahl der Schaltzeitpaare. Der Wochentag bzw. der Wochentagbereich müßte variabel mit den Schaltzeiten abgelegt werden. Falls dieser Weg für dich in Frage kommt, könnte ich dir noch etwas Starthilfe geben, habe ja mal Zeit zum Basteln .


    Gruß, Onkel
    Das mir dem Any hört sich gut an.
    Habe alerdings mit Any noch nichts gemacht da ich meistens mit For schleifen Arbeite.

    Wie würde wo was in SCL aussehen ?

  4. #14
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Gibst du die Zeitnocken via Panel vor, oder direkt im Programm (also ohne veränderbaren Zugriff??). Wenn per Panel könntest du ja eine Textliste erstellen wo du die Wochentage (1-7) einträgst. Ich habe bei meiner Schaltuhr noch die Option "täglich" (Wert 0) hinzugefügt. Wenn du die Rollo z.B. jeden Tag um die gleiche Uhrzeit steuern willst sparst du dir auch wieder Zeitnocken!

    Ansonsten habe ich zu meinen Eingegebenen Schaltzeitpunkt jeweils eine Sekunde dazuaddiert. Dann ist meine Zeitnocke genau 1 Sekunde lang aktiv und ich komme ohne Schleifen aus. In deinem Fall würde ich dann für jeden Wochentag einen FB erstellen und dort die 10 Zeitnocken runterklopfen (hält sich ja noch in Grenzen).

  5. #15
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo
    Ja mache es über's Panel. Das mit dem Wochentag ist nicht das Problemm.

    Habe das Problem das ich kein TOD über Any Struct einlesen kann
    Code:
    VAR_INPUT
        
        SCHALTZEITEN: ANY ;
        aSCHALTZEITEN AT SCHALTZEITEN :STRUCT
            EINSCHALTZEIT : TOD;
            AUSSCHALTZEIT : TOD;
            WOCHENTAG: INT;
            AKTIV: BOOL;
        END_STRUCT;
        
        ANZAHL_SCHALTZEITEN:INT;
        
    END_VAR

  6. #16
    Registriert seit
    06.10.2003
    Beiträge
    3.414
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Folge 1 - Die Datenablage

    Für die Ablage der Schaltzeitpaare legen wir uns zunächst einen Datentyp an.
    Die Länge des Datentyps beträgt in diesem Fall 10 Byte.

    Code:
    TYPE UDT 1
    VERSION : 0.1
    
    
      STRUCT     
       WOCHENTAG_START : BYTE ;    // 1-So 2-Mo ..
       WOCHENTAG_END : BYTE ;    // 1-So 2-Mo ..
       UHRZEIT_EIN : TIME_OF_DAY ;    // Einschaltzeit
       UHRZEIT_AUS : TIME_OF_DAY ;    // Ausschaltzeit
      END_STRUCT ;    
    END_TYPE
    Je nach Anwendung verwenden wir diesen Datentyp in einem DB.
    Das könnte z.Bsp. so aussehen:

    Code:
    DATA_BLOCK DB 1
    TITLE =
    VERSION : 0.1
    
    
      STRUCT     
       JALOUSIE_1 : UDT 1;    // EINE Schaltzeit
       JALOUSIE_2 : ARRAY  [1 .. 7 ] OF UDT 1;  // SIEBEN Schaltzeiten
       HEIZUNG : ARRAY  [1 .. 100 ] OF UDT 1;   // EINHUNDERT Schaltzeiten
       BIER_HOLEN : ARRAY  [1 .. 1000 ] OF UDT 1;   // EINTAUSEND Schaltzeiten
      END_STRUCT ;    
    BEGIN
    END_DATA_BLOCK

    Die Übergabe der Schaltzeiten an den Programmbaustein erfolgt dann als ANY-Pointer:
    Code:
          CALL FC     1 (SCHALTZEITEN := DB1.JALOUSIE_1);// Zugriffsbreite: 10 Byte
    
          CALL FC     1 (SCHALTZEITEN := DB1.JALOUSIE_2);// Zugriffsbreite: 70 Byte
    
          CALL FC     1 (SCHALTZEITEN := DB1.HEIZUNG);// Zugriffsbreite: 1.000 Byte
     
          CALL FC     1 (SCHALTZEITEN := DB1.BIER_HOLEN);// Zugriffsbreite: 10.000 Byte
    Den Baustein FC1 erstellen wir in der nächsten Folge in SCL.


    Euer Onkel Dagobert
    Geändert von Onkel Dagobert (28.12.2012 um 23:21 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford
    Zitieren Zitieren Wir basteln eine Schaltzeituhr ;-)  

  7. Folgende 2 Benutzer sagen Danke zu Onkel Dagobert für den nützlichen Beitrag:

    bernipaul (05.01.2015),nutellahase (28.12.2012)

  8. #17
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    OK aber wie sied die Übergabe aus?

    Was muss im den Baustein stehe wo ich es übergebe ?

    SCHALTZEITEN : ANY; ?

    Wie kann ich diese dan weiterverarbeiten ?

    Wie ist die jetzt die Adresse von Einschaltzeit Rollo ?

  9. #18
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    Hallo
    Ja mache es über's Panel. Das mit dem Wochentag ist nicht das Problemm.

    Habe das Problem das ich kein TOD über Any Struct einlesen kann
    Code:
    VAR_INPUT
        
        SCHALTZEITEN: ANY ;
        aSCHALTZEITEN AT SCHALTZEITEN :STRUCT
            EINSCHALTZEIT : TOD;
            AUSSCHALTZEIT : TOD;
            WOCHENTAG: INT;
            AKTIV: BOOL;
        END_STRUCT;
        
        ANZAHL_SCHALTZEITEN:INT;
        
    END_VAR
    So wird das nichts... der Datentyp ANY besteht aus 10 Byte. klick

  10. #19
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    OK aber wie sied die Übergabe aus?

    Was muss im den Baustein stehe wo ich es übergebe ?

    SCHALTZEITEN : ANY; ?

    Wie kann ich diese dan weiterverarbeiten ?

    Wie ist die jetzt die Adresse von Einschaltzeit Rollo ?
    Also zuerst würde ich mal Onkel Dagoberts Vorschlag mit den UDT übernehmen! Das ist wie eine Schablone, die du überall in jeden Baustein nutzen kannst und falls du mal eine Änderung vornehmen musst brauchst du sie nur im UDT vornehmen und kannst danach eine Bausteinkonsistenzprüfung drüber laufen lassen (somit ist gewährleistet dass in allen Bausteinen dein UDT wieder aktuell ist im Gegensatz zu einer reinen Struct wo du alles händisch nachbessern müsstest!).
    Der ANY-Pointer zeigt, einfach ausgedrückt, auf einen Datenbereich. Dabei enthält er noch eine ID (deren Bedeutung ich bis heute nicht verstanden habe), den Datentyp und die Länge. Ein POINTER kennt nur den Datenbereich (auch DB-Pointer bzw. 6 Byte Pointer genannt)! Der Datenbereich gliedert sich in DB-Nummer und einen Pointer auf den Adressbereich (bereichsübergreifender bzw. bereichsinterner Pointer).


    Wenn du die Daten per ANY-Pointer übergibst, gibst du auch jede Art von Typprüfung auf! Also würde ich zur Sicherheit den ANY-Pointer prüfen (falls es reiner privater Zweck ist kann es auch entfallen, aber sicher ist sicher). Prüfen kannst du z.B. ob der ANY-Pointer auf einen Bereich in einem DB zeigt, ob er vom Typ Byte ist (bei Arrays und Struct ist glaub ich immer der Typ "Byte" angegeben) und bei Verwendung von UDTs kannst du auch noch prüfen ob du tatsächlich den "richtigen" UDT übergeben hast! Dazu kannst du die UDT Größe als Const angeben (in Onkel Dagoberts Bsp. ist die UDT 10 Byte groß).

    Ist die per ANY-Pointer übergebene Länge durch die Länge der UDT teilbar kannst du dein Programm weiter ausführen. (MOD Befehl ... das Ergebnis muss ungleich 0 sein!). In weiterer Folge kannst du dir dann auch die Array-Elemente so berrechnen (z.B. übergebene Daten = 70 Byte dividiert durch UDT Länge = 10 Byte => Array mit 7 Elementen).
    Geändert von nutellahase (28.12.2012 um 19:40 Uhr)

  11. #20
    Registriert seit
    06.10.2003
    Beiträge
    3.414
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Folge 2 - Der Programmbaustein

    Nachdem wir uns in Folge 1 um die Datenablage gekümmert haben, erfolgt nun die Programmierung des Bausteins in SCL.
    Der Baustein ist nur kurz getestet und kann noch Unstimmigkeiten enthalten.

    Code:
    (************************************************************************************************************************)
    FUNCTION "SCHALTZEITUHR": BOOL
    (************************************************************************************************************************)
    VAR_INPUT
      SCHALTZEITPAARE                   : ANY;                          // ANY-Pointer auf x Schaltzeitpaare
    END_VAR
    
    VAR_TEMP
      ANY_SZP                           : ANY;
      SZP AT ANY_SZP:
        STRUCT
          ID                            : BYTE;
          TYP                           : BYTE;
          ANZAHL_TYP                    : INT;
          DB_NR                         : WORD;
          ZEIGER                        : DWORD;
        END_STRUCT;
      WD                                : INT;                           // Wochentag
      ANZAHL_SZP                        : INT;
      BYTE_INDEX                        : INT;
      n                                 : INT;
      TEMP_INT                          : INT;
      AKT_T                             : TOD;
      AKT_DT                            : DT;
      ADT AT AKT_DT:
        STRUCT
          JAHR                          : BYTE;
          MONAT                         : BYTE;
          TAG                           : BYTE;
          STUNDE                        : BYTE;
          MINUTE                        : BYTE;
          SEKUNDE                       : BYTE;
          MS_MSD                        : BYTE;                          // MSD (most significant decade) von ms 
          MS_LSD                        : BYTE;                          // LSD (least significant decade) von ms & Wochentag
        END_STRUCT;
          
    END_VAR
    
    
    BEGIN
    
    // Initialisierung
    SCHALTZEITUHR := false;
    
    // Überprüfung Datenbereich
    ANY_SZP := SCHALTZEITPAARE;
    IF SHR(IN:=SZP.ZEIGER, N:=24) <> 2#10000100 OR         // kein DB
       SZP.TYP <> 16#02 OR                                 // Typ nicht Byte
       SZP.ANZAHL_TYP MOD 10 <> 0                          // Länge Datenbereich nicht plausibel
       THEN RETURN;
    END_IF;
    
    // Ermittlung der Anzahl der Schaltzeitpaare und der Startadresse
    ANZAHL_SZP := SZP.ANZAHL_TYP / 10;
    BYTE_INDEX := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SZP.ZEIGER, N:=3)) AND 16#FFFF);     // korrigiert, 29.12.2012
     
    // Aktuelle Systemzeit
    TEMP_INT := READ_CLK(CDT := AKT_DT);
    
    // Aktuelle Tageszeit
    AKT_T := DT_TOD(IN := AKT_DT); 
    
    // aktueller Wochentag
    WD := WORD_TO_INT(BYTE_TO_WORD(ADT.MS_LSD AND 16#0F));
    
    // Schaltzeiten abfragen
    FOR n:= 1 TO ANZAHL_SZP DO
      IF WD >= WORD_TO_INT(BYTE_TO_WORD(WORD_TO_BLOCK_DB(SZP.DB_NR).DB[byte_index])) AND
         WD <= WORD_TO_INT(BYTE_TO_WORD(WORD_TO_BLOCK_DB(SZP.DB_NR).DB[byte_index+1])) THEN
         IF AKT_T >= DINT_TO_TOD((DWORD_TO_DINT(WORD_TO_BLOCK_DB(SZP.DB_NR).DD[byte_index+2]))) AND
            AKT_T <= DINT_TO_TOD((DWORD_TO_DINT(WORD_TO_BLOCK_DB(SZP.DB_NR).DD[byte_index+6]))) THEN
            SCHALTZEITUHR := true;
            EXIT;
         END_IF;
      END_IF;
      byte_index:=byte_index+10;
    END_FOR;
    
    END_FUNCTION;
    Wenn du Pulse brauchst, dann erzeugst du sie am besten extern mit dem Rückgabewert des Bausteins durch Flankenbildung (FP/FN).


    Gruß, Onkel Dagobert
    Geändert von Onkel Dagobert (29.12.2012 um 16:16 Uhr) Grund: Code korrigiert
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford
    Zitieren Zitieren Wir basteln eine Schaltzeituhr ;-)  

  12. Folgender Benutzer sagt Danke zu Onkel Dagobert für den nützlichen Beitrag:

    nutellahase (28.12.2012)

Ähnliche Themen

  1. Frequenzumrichter Yaskawa 676VG3 ohne Pulse Generator
    Von lindnerlars im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 01.03.2011, 22:26
  2. Beckhoff EL2521 Pulse Train Klemme
    Von Daberer im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 01.09.2010, 07:56
  3. Zeitschaltuhr
    Von bille1806 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 29.07.2009, 21:54
  4. Zeitschaltuhr
    Von BastiMG im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 12.10.2006, 10:23
  5. S7-200 Pulse Timer
    Von Golf2 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 23.12.2005, 08:41

Lesezeichen

Berechtigungen

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