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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Mit SCL Zeiten vergleichen aus UTD

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo ich benötige wiedermal eure Hilfe in SCL

    Ich möchte bei meiner Heizungssteuerung Zeiten vergleichen, die in einem DB34 als Zeiten Schaltuhr liegen, verweis auf UTD1 Tage Sonntag bis Sammstag verweis auf UTD 2 Heizung EIN, Heizung AUS, Absenkung EIN, Absenkung ;AUS; siehe Bilder.

    Die Wochentage bekomme ich als Zahl von 1-7.

    Jetzt mochte ich in SCL am Sonntag einen Bit ausgeben vom Zeitraum Heizung EIN und Heizung aus.
    Desweiterne soll ein Bit von Absenkung EIN und Absenkung Aus ausgegeben werden. Dies soll für jeden Wochentag geschehen

    Als erstes habe ich mal versucht mit einer For schleife nur die die DB adressen von Sonntag in einer Variable zu Speichern
    z.b
    siehe Bild Da stimmt aber garnichts sage ich gleich mal




    Kann mir da jemand weiterhelfen ?
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Mit SCL Zeiten vergleichen aus UTD  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    aus deinen Anhängen kann ich keine Beziehung zu deiner beschriebenen Aufgabenstellung herstellen.
    Ist aber nicht schlimm - das kriegen wir sicherlich noch ...

    Erstmal ein paar Fragen von mir :
    1.) du erstellst dir einen FB ?
    2.) woher erhältst du die Information des Wochentages ?
    3.) warum arbeitest du bezüglich der Zeiten mit einem externen DB und nicht mit IN-Parametern des FB's ? Das hielte ich für praktikabler und du brauchst dir den Kram nicht in den Baustein kopieren ...

    Gruß
    Larry

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Um aber die Sachen in dein Array zu bekommen würde ich so vorgehen :
    Code:
    for i := 0 to 1 by 1 do
       Zeit_Heiz[i] := DWORD_to_TOD(DB34.DBD[i*4]) ;
       Zeit_Absenk[i] := DWORD_to_TOD(DB34.DBD[(i+2)*4]) ;
    end_for ;
    Nachsatz :
    Die absoluten DB-Zugriffe werden nur in der Grundform der Variablen durchgeführt (also BIT, Byte, Word, DWord). Wird ein anderes Format benötigt muß dann erst eine Typ-Umwandlung erfolgen (auch ein Grund, warum ich es so nicht machen würde).
    Ich hoffe, dass es den Befehl DWord_to_TOD gibt (ich kann es gerade nicht nachschauen). Ansonsten müßtest du hier zu deinem deklarierten Array noch eine AT_Sicht im Format DWord machen ...

    Gruß
    Larry
    Geändert von Larry Laffer (23.07.2011 um 12:06 Uhr) Grund: TypeCast vergessen

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

    Standard

    Die information des wochentage erhalte ich von einem anderen FC wo ich den Wochentag aus der SPS Zeit Extrahiere. Dieser ist von 1-7.

    Die Zahl steh in einen anderen DB.

    Der Externe DB ist dafür da um die Zeiten in Panel Darzustellen.

    Danke schon mal für die Hilfe ich versuche mal mein glück.

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Vielleicht mal so zur Anregung um die absolute Adressierung rauszuwerfen:

    Wenn du deine Wochenschaltuhr im Datenbaustein umstrukturierst, und nicht so wie du es jetzt hast als einzelne Tage sondern als Array anlegst, also:
    Code:
    STRUCT 	
       SCHALTUHR : ARRAY  [1 .. 7 ] OF UDT 2;	
    END_STRUCT ;
    dann stehen Array Index 1 dabei für Sonntag, 2 für Montag usf.

    Dann kannst du in Scl ganz einfach auf die Daten des aktuellen Wochentages zugreifen.
    Als Eingabeparameter für einen FC z.B.
    Code:
    VAR_INPUT
        Wochentag : INT; // 1=So, 2=Mo, ...
        Wochenschalt : ARRAY[1..7] OF udt 2; // 1=So, 2=Mo, ...
    END_VAR
    (Wenn du einen FB anstelle eines FC verwenden willst, würde ich "Wochenschalt " als VAR_IN_OUT anlegen, weil ansonsten die Werte per Wert übergeben werden, was im späteren Instanz-DB nochmal den gleichen Speicherplatz benötigt.)

    Auf die Daten der Wochenschaltuhr kannst du dann einfach mit:
    Code:
    ZEIT_HEIZ := Wochenschalt[Wochentag].HEIZUNG_EIN;
    ZEIT_ABSENK := Wochenschalt[Wochentag].ABSENKTEMPERATUR_EIN;
    zugreifen.

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

    Standard

    Habe es jetzt mal so versucht, das der wert aus der entsprechenden Variable in die aktuelle Variable geschrieben wird. Geht aber nicht, kommen nur fehler beim SCl


    Code:
    FUNCTION FC34 : INT
    
    (*********************************************************
      Adresierung
     ***********************************************************)
    
    
    VAR_INPUT
      Wochentag : INT;
        
    END_VAR
    
    VAR_OUTPUT
        
        
    END_VAR
    
    VAR
        // Zeit Heizung Ein / Aus Aktuelle
      Z_HEIZ_EIN_AKT : DWORD;
      Z_HEIZ_AUS_AKT : DWORD;
        // Zeit Absenkung Ein / Aus Aktuell
      Z_ABSE_EIN_AKT : DWORD;
      Z_ABSE_AUS_AKT : DWORD; 
      
      i : INT;
    
    END_VAR 
    
    BEGIN
    
    
       i := (Wochentag-1)*16
       
       Z_HEIZ_EIN_AKT := DWORD_to_TOD(DB34.DBD[0+i]) ;
       Z_HEIZ_AUS_AKT := DWORD_to_TOD(DB34.DBD[4+i]) ;
       Z_ABSE_EIN_AKT := DWORD_to_TOD(DB34.DBD[8+i]) ;
       Z_ABSE_AUS_AKT := DWORD_to_TOD(DB34.DBD[12+i]) ;
       
       
       
       
    
    FC34 := 100;
    
    END_FUNCTION
    Fehler
    Angehängte Grafiken Angehängte Grafiken
    Geändert von emilio20 (23.07.2011 um 17:49 Uhr)

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

    Standard

    Hallo Thomas das versuche ich auch mal Danke Aber wich berechne ich da die Adresse so wie in meinem Beispiel ?
    Geändert von emilio20 (23.07.2011 um 17:58 Uhr)

  8. #8
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    Zitat Zitat von emilio20 Beitrag anzeigen
    Habe es jetzt mal so versucht, das der wert aus der entsprechenden Variable in die aktuelle Variable geschrieben wird. Geht aber nicht, kommen nur fehler beim SCl...
    Strichpunkt vergessen, sollte das nicht * 32 sein wegen DWORD.
    Code:
    i := (Wochentag-1)*16;
    und DWORD_TO_TOD ist auch Käse deine Variable ist ja schon vom Typ DWORD.

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  9. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zu deinem anderen Beispiel: Warum legst du die Variablen denn als DWORD an wenn im Datenbaustein ein TIME_OF_DAY steht?
    Für die Konvertierung eines DWORD in TIME_OF_DAY musst du noch einen Zwischenschritt über ein DINT einfügen.

    DINT_TO_TOD(DWORD_TO_DINT(...))

    Es gibt aber noch andere Möglichkeiten um sich diese absolute Adressierung zu ersparen. Du könntest z.B. auch die UDT1 als Parameter anlegen, und dann mit einem Case je nach Wochentag auf die Daten zugreifen. Dann hast du keine Magic-numbers im Programm und die ganzen Konvertierungen fallen auch weg.

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Ich möcht TIME_OF_DAY vergleichen dachte das geht nicht.

    Ich möchte einfach die werte des Aktuellen Tages in die Variablen Akuell verschieben und Ausgeben. Dann kann ich mit FUP die Verte vergleichen und einen Bit schalten.

    Ich habe keine großen SCL erfahrungen.

Ähnliche Themen

  1. Zeiten Simatic S5
    Von wernerbacherl im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 19.12.2013, 20:53
  2. Zeiten mit Step7
    Von S5-Junkie im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 18.03.2011, 18:03
  3. MIN, MAX, LIMIT --> Zeiten
    Von SPS-newbie im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 02.06.2010, 13:19
  4. Analogwerte als Zeiten?
    Von thomas W.W, im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 01.12.2005, 13:37
  5. Zeiten!
    Von Anonymous im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.06.2005, 15:48

Lesezeichen

Berechtigungen

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