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

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 41

Thema: Zeitschaltuhr Pulse

  1. #31
    Registriert seit
    06.10.2003
    Beiträge
    3.412
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Jetzt hast du genau die Zeile erwischt, in der ich einen Fehler hatte!
    Und nicht korrigiert.

    Nach dem Rechtsschieben steht die Byte-Adresse rechtsbündig im Akku.

    Code:
    00010000_10000000_yyyyyyyy_yyyyyyyy
    "16#00FF" war der Fehler, es muß dort "16#FFFF" stehen.
    "16#FFFF" ist nichts anderes als

    Code:
    00000000_00000000_11111111_11111111
    Durch das "Verunden" mit "AND" werden die ersten beiden Bytes auf Null gesetzt. Übrig bleibt dann nur noch die Byte-Adresse.
    Geändert von Onkel Dagobert (30.12.2012 um 17:42 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

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

    Standard

    Hallo

    kannst du mir sagen wie ich eine TOD in diese Adresse schreiben?
    ZEIT ist eine TOD VAR.

    ZEIT : TOD;


    WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX] :=DWORD_TO_WORD(DINT_TO_DWORD(TOD_TO_DINT ZEIT));

    Da kommt immer ein fehler ?

  3. #33
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    Hallo

    kannst du mir sagen wie ich eine TOD in diese Adresse schreiben?
    ZEIT ist eine TOD VAR.

    ZEIT : TOD;


    WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX] :=DWORD_TO_WORD(DINT_TO_DWORD(TOD_TO_DINT ZEIT));

    Da kommt immer ein fehler ?
    Code:
     
    // Aktuelle Systemzeit
    TEMP_INT := READ_CLK(CDT := AKT_DT);
    
    // Aktuelle Tageszeit
    AKT_T := DT_TOD(IN := AKT_DT);
    Mit diesen Anweisungen wird die Systemzeit ausgelesen und umgewandelt!

    Gruß
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

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

    Standard

    Ja das weiß ich
    ich wollte eine Mux erstellen mit dem ich mich am Panel durch den Array blättern kann. Wenn ich einen Wert in den Array speichern möchte muss ich die Variable ZEIT in die entsprechende Adresse schreiben.

    Der Code sied bis jetzt so aus
    Code:
    
    (***********************UDT***********************************************************************************************)
    
    TYPE SCHALTZEITEN
        STRUCT
        ZEIT: TOD:=TOD#0:0:0.000;
        //BYTE  x.1=SO x.2=MO x.3=DI x.4=MI x.5=DO x.6=FR x.7=SA 
                    frei      :BOOL;
                    Sonntag   :BOOL;
                    Montag    :BOOL;
                    Dienstag  :BOOL;
                    Mittwoch  :BOOL;
                    Donnerstag:BOOL;
                    Freitag   :BOOL;
                    Samstag   :BOOL;
                    
        EREIGNIS : BOOL; //0=AUS 1=EIN   
        END_STRUCT
    END_TYPE
    
    (*************************ENDE UTD***************************************************************************************)
    
    
    
    (************************************************************************************************************************)
    FUNCTION "SCHALTZEITUHR": BOOL
    (************************************************************************************************************************)
    VAR_INPUT
      SCHALTZEITPAARE                   : ANY;                          // ANY-Pointer auf x Schaltzeitpaare
    END_VAR
    
    VAR_OUTPUT
        
        PULS_EIN                         :BOOL;
        PULS_AUS                         :BOOL;
        
    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;
      SPS_TIME_I                        :DINT;    
    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 6 <> 0                          // Länge Datenbereich nicht plausibel
       THEN RETURN;
    END_IF;
    
    // Ermittlung der Anzahl der Schaltzeitpaare 
    ANZAHL_SZP := SZP.ANZAHL_TYP / 6;
    // Startadresse ermitteln
    //Nach dem Rechtsschieben steht die BYTE-Adresse rechtsbündig im Akku.
    //Durch das "Verunden" mit "AND" werden die ersten beiden Bytes auf Null gesetzt. Übrig bleibt dann nur noch die BYTE-Adresse. 
    BYTE_INDEX := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SZP.ZEIGER, N:=3)) AND 16#FFFF);
    
    // Aktuelle Systemzeit
    TEMP_INT := READ_CLK(CDT := AKT_DT);
    
    // Aktuelle Tageszeit
    AKT_T := DT_TOD(IN := AKT_DT); 
    
    // ZEIT ind DINT umwandeln und durch 1000 Teile um sec zu erhalten     
    SPS_TIME_I:=TOD_TO_DINT (AKT_T)/1000 ;
    
    
    // aktueller Wochentag
    WD:= DT_DAY(IN :=AKT_DT);
    
    // Schaltzeiten abfragen
    FOR n:= 1 TO ANZAHL_SZP DO
    // Überprüfen ob Bit für Wochentag true ist
      IF WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,WD] = TRUE THEN
    // Abfrage ob Schaltuhr Zeit mit Zeit aktuell übereinstimmt    
         IF SPS_TIME_I = DWORD_TO_DINT(WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX])/1000 AND
            DWORD_TO_DINT(WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX])/1000>0 THEN
    // Abfrage ob EREIGNIS EIN oder AUS ist          
            IF WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+5,0]= TRUE THEN
               PULS_EIN:=TRUE;
                EXIT;
            END_IF;
            
            IF WORD_TO_BLOCK_DB (SZP.DB_NR).DX[BYTE_INDEX+5,0]= FALSE THEN
               PULS_AUS:=TRUE;
                EXIT;
            END_IF;
         ELSE
           PULS_EIN:=FALSE;
           PULS_AUS:=FALSE;  
                
         END_IF;
      END_IF;
    byte_index:=byte_index+6;
     
    END_FOR;
    
    END_FUNCTION;
    Das Problem ist hier
    Code:
    FUNCTION_BLOCK "MUX_SCHALTZEITUHR" 
    (*********************************************************************************************************************************************)
    VAR_IN_OUT
      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;
      SPS_TIME_I                        :DINT;    
    END_VAR
    
    VAR
       ZEIT                             :TOD;
       
       frei                             :BOOL;
       Sonntag                          :BOOL;
       Montag                           :BOOL;
       Dienstag                         :BOOL;
       Mittwoch                         :BOOL;
       Donnerstag                       :BOOL;
       Freitag                          :BOOL;
       Samstag                          :BOOL;
                    
      EREIGNIS                          :BOOL; //0=AUS 1=EIN  
      SPEICHERN                          :BOOL;
      RESET                             :BOOL;
      ANZEIGE_NR                        :INT;
        
    END_VAR    
    
    BEGIN
    
    
    // Ermittlung der Anzahl der Schaltzeitpaare 
    ANZAHL_SZP := SZP.ANZAHL_TYP / 6;
    // Startadresse ermitteln
    //Nach dem Rechtsschieben steht die BYTE-Adresse rechtsbündig im Akku.
    //Durch das "Verunden" mit "AND" werden die ersten beiden Bytes auf Null gesetzt. Übrig bleibt dann nur noch die BYTE-Adresse. 
    BYTE_INDEX := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SZP.ZEIGER, N:=3)) AND 16#FFFF);
    
    //Anzeige NR bei Max Große SpeicherArray auf Max setzen 
    IF ANZEIGE_NR>=ANZAHL_SZP THEN
       ANZEIGE_NR:= ANZAHL_SZP;
    END_IF;
    //Anzeige NR bei Min Große SpeicherArray auf 1 setzen
    IF ANZEIGE_NR <=1 THEN
       ANZEIGE_NR:= 1;
    END_IF;
    
    
    
    // Werte einlesen
    byte_index:=byte_index+(6*(ANZEIGE_NR-1));
    
    
    ZEIT := DINT_TO_TOD ((DWORD_TO_DINT(WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX]))); 
    Sonntag   := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,1];
    Montag    := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,2];
    Dienstag  := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,3];
    Mittwoch  := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,4];
    Donnerstag:= WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,5];
    Freitag   := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,6];
    Samstag   := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,7];
    EREIGNIS  := WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+5,0];
    
    
    // Werte SPEICHERN
    IF SPEICHERN = TRUE THEN
      WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX]    :=DWORD_TO_WORD(DINT_TO_DWORD(TOD_TO_DINT ZEIT));????????????????????????????????????????????????????????????
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,1]:=Sonntag;
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,2]:=Montag;
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,3]:=Dienstag; 
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,4]:=Mittwoch ;
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,5]:=Donnerstag;
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,6]:=Freitag;
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+4,7]:=Samstag;
      WORD_TO_BLOCK_DB(SZP.DB_NR).DX[BYTE_INDEX+5,0]:=EREIGNIS;
    END_IF;
    
          
    END_FUNCTION_BLOCK;
    Geändert von emilio20 (30.12.2012 um 20:30 Uhr)

  5. #35
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Achso okay!
    Du willst also die Zeit Variable in ein Doppel des Datenbausteins schreiben!
    Mir kommt die Umwandlung in deiner Anweisung etwas komisch vor!
    Wieso wandelst du es auf ein Word?!
    Quasi schreibst du ein Word in ein Doppel.

    Code:
    WORD_TO_BLOCK_DB(SZP.DB_NR).DD[BYTE_INDEX]    :=DINT_TO_DWORD(TOD_TO_DINT(ZEIT));
    So müsste es doch gehen!

    Gruß
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

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

    Standard

    Hallo

    Ja das hatte ich zuerst habe aber die eine klammer vergessen. Jetzt geht es

  7. #37
    Registriert seit
    06.10.2003
    Beiträge
    3.412
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    ..ich wollte eine Mux erstellen..
    Das ging aber schnell .

    Wenn ich dir noch einen Tipp zum HMI-Multiplexen geben darf, dann lege im DB einen weiteren Datensatz vom Typ UDTx mit dem Namen "HMI_DATEN" an. Diesen verwendest du als einzigen Datensatz am Panel. Bei Anwahl änderst du deine "ANZEIGE_NR". Mit der Änderung der "ANZEIGE_NR" kopierst du einmalig den jeweiligen Datensatz in deine "HMI_DATEN", nur um die Daten bei Anwahl erst einmal am Panel an zu zeigen. Jetzt hast du verschiedene Möglichkeiten, deine Eingaben zu speichern. Die einfachste Möglichkeit ist ein zusätzliches Bit zur Übernahme. Eine zweite Möglichkeit ist die Überwachung der "HMI_DATEN" auf Änderungen. Wenn du sicher gehen möchtest dass dabei nichts schief geht, speicherst du in jeden Datensatz noch dessen "ANZEIGE_NR" zur Verifizierung mit ab. Daten dürfen nur dann in den Datensatz geschrieben werden, wenn die "ANZEIGE_NR" der "HMI_DATEN" mit der "ANZEIGE_NR" des Datensatzes überein stimmt.

    Dann klappt das auch mit dem "BIER_HOLEN"

    Code:
    BIER_HOLEN : ARRAY  [1 .. 1000 ] OF UDT 1;   // EINTAUSEND Schaltzeiten

    Gruß, Onkel
    Geändert von Onkel Dagobert (31.12.2012 um 00:01 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

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

    Standard

    Hallo Onkel
    Habe deinen Beitrag erst jetzt gelesen. Ich habe mir jetzt einen FB erstellt der MUX kann,
    Ich stell mal das Projekt ein ,du kannst es ja mal anschauen und sagen was nicht ganz ok ist.

    Zu der Funktion

    Ich Pulse nur die Ausgänge für ca 1sec.

    Ich muss mich mal mit den Bytes in einer Adresse beschäftige damit ich weis wo was steht. Aber dank deiner hilfe dat dies super Funktionier.
    Angehängte Dateien Angehängte Dateien

  9. #39
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Morgen!

    Also ein paar kleinigkeiten sind mir da aufgefallen!

    Beim FC Schaltzeituhr verwendest du den RET_VAL Ausgang ja nicht mehr!
    Also kannst folgende Zeile ändern:
    Code:
    FUNCTION "SCHALTZEITUHR": BOOL
    FUNCTION "SCHALTZEITUHR": VOID
    Somit fällt auch diese hier weg:
    Code:
    // Initialisierung
    SCHALTZEITUHR := false;
    Das anbinden an die Visu passt schon so!
    Das einzige was mir aufgefallen ist das dort bei der Auswahl der Schaltzeitpaare "AK_ANZEIGE" statt "ANZEIGE_NR" verwendet ist!Passt das schon soooo???
    Nur der Zugriff auf den Instanz DB ist halt Geschmacksache!Ich würde das nicht machen!
    Wenn du jetzt mal was an dem Baustein änderst!Verschieben sich ja auch die Adressen!
    Somit müsstest die Visu auch wieder neu Synchronisieren!

    Gruß
    Geändert von SCM (31.12.2012 um 08:39 Uhr)
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
    Das einzige was mir aufgefallen ist das dort bei der Auswahl der  Schaltzeitpaare "AK_ANZEIGE" statt "ANZEIGE_NR" verwendet ist!Passt das  schon soooo???
    Ja das Passt habe ich so gamacht damit wirklich nur das angezeigt wird was grade geladen ist.

    Code:
    Nur der Zugriff auf den Instanz DB ist halt Geschmacksache!Ich würde das nicht machen!
    Ich verwende doch den Instanz DB damit ich nicht all 10 bzw 3 Schaltzeitpaare einseln am Panel Adrssieren muss. Was wäre eine bessere Lösung hierzu ?

Ä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
  •