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

Ergebnis 1 bis 7 von 7

Thema: OSCAD SUN_TIME: wie wende ich ihn an?

  1. #1
    Registriert seit
    29.09.2014
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    Ich bin bin absoluter Anfänger in Sachen SPS-Programmierung und habe gemeint meine Abschluss Arbeit darüber zu schreiben *Ich dummkopf*.
    das Programm ansich steht schon aber ich komme ums verrecken nicht mit diesem SUN_TIME Baustein klar den ich aber benötige.

    Das ist die AWL zu dem Baustein. In die muss ich jetzt meine Längen und Breitengrade hinein schreiben(L:48,17526 B:10,75387). bin aber Völlig überfordert . Desweitern nimmt die SUN_TIME die Uhrzeit direkt vom OB1 oder muss ich noch einen SFC1 einbauen?

    Hab im Anhang noch mal das OSCAT Handbuch da is der FB SUN_TIME auf Seite 144 zu finden.

    Code:
          SET
           SAVE            
           =    L         0.1
           L    #LATITUDE
           L    1.745329e-02
           *R
           SPO  I007
           SPA  I008
    I007:  CLR
           =    L         0.1
    I008:  T    #b
           L    #LONGITUDE
           T    LD        2
           L    #UTC
           T    LW        6
           TAR2 LD        8
           UC   FC      432
             P#L       2.0            
             P#L       6.0            
             P#L       12.0            
           LAR2 LD        8
           L    LD       12
           T    #MIDDAY
           L    #UTC
           T    LW        2
           TAR2 LD        8
           UC   FC      180
             P#L       2.0            
             P#L       4.0            
           LAR2 LD        8
           L    LW        4
           ITD
           DTR
           U    L         0.1
           SAVE
           L    7.935000e+01
           -R
           SPO  I009
           SPA  I00a
    I009:  CLR
           =    L         0.1
    I00a:  L    1.720000e-02
           *R
           SPO  I00b
           SPA  I00c
    I00b:  CLR
           =    L         0.1
    I00c:  SIN
           SPO  I00d
           SPA  I00e
    I00d:  CLR
           =    L         0.1
    I00e:  CLR
           U    L         0.1
           SAVE
           L    4.095400e-01
           *R
           SPO  I00f
           SPA  I010
    I00f:  CLR
           =    L         0.1
    I010:  T    #dk
           L    #dk
           T    LD        2
           TAR2 LD        8
           UC   FC       72
             P#L       2.0            
             P#L       12.0            
           LAR2 LD        8
           L    LD       12
           T    #SUN_DECLINATION
           L    #SUN_DECLINATION
           L    1.800000e+02
           >R
           SPBN A7d0
           L    #SUN_DECLINATION
           L    3.600000e+02
           -R
           SPO  I011
           SPA  I012
    I011:  CLR
           =    L         0.1
    I012:  T    #SUN_DECLINATION
    A7d0:  L    9.000000e+01
           L    #LATITUDE
           -R
           SPO  I013
           SPA  I014
    I013:  CLR
           =    L         0.1
    I014:  L    #SUN_DECLINATION
           +R
           SPO  I015
           SPA  I016
    I015:  CLR
           =    L         0.1
    I016:  T    #SUN_DECLINATION
           L    #H
           T    LD        2
           TAR2 LD        8
           UC   FC      100
             P#L       2.0            
             P#L       12.0            
           LAR2 LD        8
           L    LD       12
           SIN
           SPO  I017
           SPA  I018
    I017:  CLR
           =    L         0.1
    I018:  CLR
           U    L         0.1
           SAVE
           L    #b
           SIN
           TAK
           T    LD        2
           TAK
           SPO  I019
           SPA  I01a
    I019:  CLR
           =    L         0.1
    I01a:  CLR
           U    L         0.1
           SAVE
           L    #dk
           SIN
           TAK
           T    LD       12
           TAK
           SPO  I01b
           SPA  I01c
    I01b:  CLR
           =    L         0.1
    I01c:  CLR
           U    L         0.1
           SAVE
           L    LD       12
           *R
           SPO  I01d
           SPA  I01e
    I01d:  CLR
           =    L         0.1
    I01e:  L    LD        2
           TAK
           -R
           SPO  I01f
           SPA  I020
    I01f:  CLR
           =    L         0.1
    I020:  L    #b
           COS
           TAK
           T    LD        2
           TAK
           SPO  I021
           SPA  I022
    I021:  CLR
           =    L         0.1
    I022:  CLR
           U    L         0.1
           SAVE
           L    #dk
           COS
           TAK
           T    LD       12
           TAK
           SPO  I023
           SPA  I024
    I023:  CLR
           =    L         0.1
    I024:  CLR
           U    L         0.1
           SAVE
           L    LD       12
           *R
           SPO  I025
           SPA  I026
    I025:  CLR
           =    L         0.1
    I026:  L    LD        2
           TAK
           /R
           SPO  I027
           SPA  I028
    I027:  CLR
           =    L         0.1
    I028:  ACOS
           SPO  I029
           SPA  I02a
    I029:  CLR
           =    L         0.1
    I02a:  CLR
           U    L         0.1
           SAVE
           L    3.819719e+00
           *R
           SPO  I02b
           SPA  I02c
    I02b:  CLR
           =    L         0.1
    I02c:  T    LD        2
           TAR2 LD        8
           UC   FC      189
             P#L       2.0            
             P#L       12.0            
           LAR2 LD        8
           L    LD       12
           T    #delta
           L    #MIDDAY
           TAK
           -D
           SPO  I02d
           L    DW#16#05265C00
           MOD
           SPM  I02e
           SPA  I02f
    I02e:  L    DW#16#05265C00
           +D
           SPA  I02f
    I02d:  CLR
           =    L         0.1
    I02f:  T    #SUN_RISE
           L    #MIDDAY
           L    #delta
           +D
           SPO  I030
           L    DW#16#05265C00
           MOD
           SPM  I031
           SPA  I032
    I031:  L    DW#16#05265C00
           +D
           SPA  I032
    I030:  CLR
           =    L         0.1
    I032:  T    #SUN_SET
           CLR
           U    L         0.1
           SAVE
    Ich danke euch jetzt schon für jeden einzelnen Tipp
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren OSCAD SUN_TIME: wie wende ich ihn an?  

  2. #2
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    Hallo Backe03,

    in der Regel ist in OSCAT nichts in AWL, sondern alles in SCL geschrieben.
    Das bedeutet, Du hast unter dem Bausteinordner noch einen Ordner "Quellen".
    Du hast im Moment vermutlich nur den Baustein aus dem Bausteinordner in dein Projekt kopiert. Bitte kopiere auch die SCL-Quelle in Dein Projekt.
    Wenn Du diese öffnest, hast Du strukturierten Text, den Du sicherlich auch verstehen wirst. Wenn Du den dann übersetzt, hast Du eine Verbindung zwischen dem Baustein und der Quelle. Dann wird immer die Quelle zum Editieren auf gemacht.
    Allerdings benötigst Du natürlich das Paket SCL, um das machen zu können.

    Aber wenn ich mir die Doku so ansehe, mußt Du doch garnichts IM Baustein machen. Länge und Breite werden doch als REAL als Eingangsparameter an den Baustein geschrieben...
    Baustein aufrufen, Parameter beschalten, fertig...

    Welche Bausteine er benötigt, um arbeiten zu können, merkst Du meistens erst, wenn Du ihn übersetzt, also wären wir wieder beim Thema SCL und Quelle öffnen...

    Hoffe, das hat Dir erst einmal weitergeholfen...
    Gruß
    JS

  3. Folgender Benutzer sagt Danke zu JSEngineering für den nützlichen Beitrag:

    Backe03 (21.02.2015)

  4. #3
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    Falls Du kein SCL hast, hier mal der strukturierte Text aus dem Baustein, da steht auch drin, welche anderen Bausteine er verwendet...

    Code:
    FUNCTION_BLOCK SUN_TIME
    TITLE = 'SUN_TIME'
    //
    //this FUNCTION block calculates the sun rise, sun set, sun offset at midday sun declination for a given date 
    //for performance reasons the algorithm has been simplified and is accurate within a few minutes only 
    //the times are calculated in utc and have to be corrected for the given time zone
    //this correction is not done within sun_time because it would be a problem on days where dst is enabled or disabled
    //
    //uses: SUN_MIDDAY (FC432)
    //      DAY_OF_YEAR (FC180)
    //      DATE_DINT (FC405)
    //      HOUR_TO_TOD (FC190)
    //      DEG (FC72)
    //      MODR (FC97)
    //      FLOOR2 (FC82)
    //      HOUR_TO_TIME (FC189)
    //      RAD (FC100)
    //
    VERSION : '1.7'
    AUTHOR  : hugo
    NAME    : SUNTIME
    FAMILY  : TIDT
    
    VAR_INPUT
      LATITUDE : REAL;            (* latitude of geographical position *)
      LONGITUDE : REAL;           (* longitude of geographical position *)
      UTC : DATE;                 (* world time *)
      H : REAL := -0.83333333333; (* heighth above horizon for sunrise *)
    END_VAR
    VAR_OUTPUT
      MIDDAY : TOD;     (*  astrological midday in hours when sun stands at south direction *)
      SUN_RISE : TOD;       (*  sun rise for current day in local time *)
      SUN_SET : TOD;        (*  sun set for current day in local time *)
      SUN_DECLINATION : REAL;   (*  sun declination above horizon at midday in degrees  *)
    END_VAR
    VAR
      dk: REAL;           (* sun declination at midday *)
      delta: TIME;          (* delta from midday for sunrise and sunset  *)
      b: REAL;
    END_VAR
    
    BEGIN
    
    B := latitude * 0.0174532925199433;
    MIDDAY := SUN_MIDDAY(LON:=longitude,UTC:=UTC);
    DK := 0.40954 * SIN(0.0172 * (INT_TO_REAL(DAY_OF_YEAR(UTC)) - 79.35));
    sun_declination := DEG(DK);
    IF sun_declination > 180.0 THEN sun_declination := sun_declination - 360.0; END_IF;
    sun_declination := 90.0 - LATITUDE + sun_declination;
    delta := HOUR_TO_TIME(ACOS((SIN(RAD(H)) - SIN(B) * SIN(DK)) / (COS(B) * COS(DK))) * 3.819718632);
    sun_rise := MIDDAY - delta;
    sun_set := MIDDAY + delta;
    
    (* revision history
    
    rev 1.1 hm  20.1.2007
      deleted unused variables sun_riseR and sun_setR
    
    rev 1.2 hm 17.4.2007
      corrected error while sun:midday would not be corrected for longitude.
    
    rev 1.3 hm  6. jan 2008
      performance improvements
    
    rev 1.4 hm  17. jan 2008
      calculation is now only performed once a day
    
    hm  10. mar. 2009 rev 1.5
      improved performance
      calculation will be performed on every call to allow movong installations
    
    hm  26. jul 2009  rev 1.6
      fixed a problem with wrong midday calculation
    
    hm  25. jan. 2011 rev 1.7
      using function sun_midday
      corrected angle of sun_declination
      added input H
    *)
    END_FUNCTION_BLOCK

  5. #4
    Backe03 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.09.2014
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also ich bin jetzt schon ein stück weiter =)
    Wenn ich die Funktion FB32 einzeln aufrufe komm ich ja in den Oben beschriebenen SCL Code rein.
    wenn ich den aber nun CALL komm ich in die AWL Maske.
    Code:
    @a@0   <Ueberschrift von Netzwerk>
    2       CALL "FB32"
    2         LATITUDE:=0.000000e+00
    2         LONGITUDE:=0.000000e+000
    2         UTC:=D#1999-1-1
    2         H:=0.000000e+000
    2         MIDDAY:=MD0
    2         SUN_RISE:=MD0
    2         SUN_SET:=MD0
    2         SUN_DECLINATION:=MD0
    2
    2
    2
    Aber jetzt kommen schon wieder einige fragen auf.
    Kann ich den Baustein auch im FC (Funktion) aufrufen oder muss ich den im FB(Funktionsbaustein) callen?
    wegen dem Statischen speicher...
    aber egal wo ich ihn Call sagt er mir immer " Die Angabe vom DI Fehlt". Ich meine Gelesen zu haben das der Identifikationsbaustein selbst erstellt wird!?

    In was für nen Format wird die Uhrzeit aus gegeben? und bin ich da mit einem Doppewort am Ausgang richtig bedient?
    123.PNG


    meine Überlegung war dann. einen SFC1 zu nehmen der mir ja die Uhrzeit ausliest und weiter gibt die beiden durch einen Vergleicher zu jagen und dadurch einen Bit zu erhalten wenn die errechnete Uhrzeit erreicht ist.

    Gruß Backe

  6. #5
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Zitat Zitat von Backe03 Beitrag anzeigen
    Also ich bin jetzt schon ein stück weiter =)
    Wenn ich die Funktion FB32 einzeln aufrufe komm ich ja in den Oben beschriebenen SCL Code rein.
    wenn ich den aber nun CALL komm ich in die AWL Maske.
    ein Call ist auch ein AWL befehl, du kannst den Baustein aber auch aus einem in SCL geschriebenen Baustein aufrufen, nennt sich da aber nicht call.

    Aber jetzt kommen schon wieder einige fragen auf.
    Kann ich den Baustein auch im FC (Funktion) aufrufen oder muss ich den im FB(Funktionsbaustein) callen?
    wegen dem Statischen speicher...
    das ist dir überlassen. Wenn du ihn in einem FC calls, musst du ihm halt einen eigenen Instanzdb mitgeben (Da so einen Baustein eh nur einmal aufrufst ist das ja egal).
    In einem FB könntest du ihn im Stat deklarieren und so als instanz im aufrufenden FB aufrufen.

    aber egal wo ich ihn Call sagt er mir immer " Die Angabe vom DI Fehlt". Ich meine Gelesen zu haben das der Identifikationsbaustein selbst erstellt wird!?
    instanzdb angegeben und geladen?

    In was für nen Format wird die Uhrzeit aus gegeben? und bin ich da mit einem Doppewort am Ausgang richtig bedient?
    Steht doch da, als TOD (Time of Day) am besten hängst du da auch eine als TOD deklarierte Variable an

    mfG René

  7. #6
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    Hallo Backe,

    wenn Du den Baustein aufrufst, hast Du zwei Möglichkeiten: Entweder, du gibt ihm einen eigenen Instanz-DB (wenn Du ihn dann mehrfach aufrufst, hast Du so viele DBs, wie Aufrufe) oder Du rufst ihn in einem FB auf und kannst ihn im statischen Bereich als Multiinstanz deklarieren. Dazu einfach rechten Mausklick auf den Baustein und Multiinstanz auswählen. Dann wird eine passende Variable (Indstanz) automatisch im Kopf angelegt.
    Daraus ergibt sich: Du kannst ihn aufrufen, wo Du willst, nur im OB oder FC mußt Du ihm einen DB zuweisen, im FB kannst Du ihn wahlweise als Multiinstanz oder als Instanz mit zugehörigem DB anlegen. Der aufrufende FB erhält dann einen Instanz-DB, der alle Instanzen Deines FBs enthält.

    Ein Instanz-DB wird - meines Wissens - nie automatisch erstellt.

    Code:
    VAR_OUTPUT
      MIDDAY : TOD;     (*  astrological midday in hours when sun stands at south direction *)
      SUN_RISE : TOD;       (*  sun rise for current day in local time *)
      SUN_SET : TOD;        (*  sun set for current day in local time *)
      SUN_DECLINATION : REAL;   (*  sun declination above horizon at midday in degrees  *)
    END_VAR
    Die Zeiten werden alle als TOD, also TimeOfDay rausgegeben. (32bit, Millisekunden seit 0:00)
    Der SFC1 gibt sie Dir aber als DT also als DateAndTime aus. (64bit, siehe Siemens Doku, Typ DATE_AND_TIME)
    Du kannst sie also nicht direkt vergleichen!

    Es gibt die Funktion FC8 im Bausteinordner von OSCAT: DT_TOD (von Siemens), der macht aus DT ein TOD.
    Dann hast Du zwei TOD, die Du beispielsweise in die Funktion TIMECHECK (OSCAT) reinschieben kannst oder sie einfach so vergleichst.

    Gruß
    JS

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Backe03 Beitrag anzeigen
    Aber jetzt kommen schon wieder einige fragen auf.
    Kann ich den Baustein auch im FC (Funktion) aufrufen oder muss ich den im FB(Funktionsbaustein) callen?
    wegen dem Statischen speicher...
    Kannst du schon, wenn du einen FC verwendest musst du die Instanzdaten halt in einem erzeugten Instanz-DB speichern.
    Wie das bei deinem Editor geht.... Was ist das für einer?
    Wenn ich mir aber den Screenshot unten anschaue, wirst du wahrscheinlich (ähnlich wie bei Step7) dort wo das "xx" steht einen Datenbaustein (DBxx) oder nur die Nummer angeben können.
    Zitat Zitat von Backe03 Beitrag anzeigen
    aber egal wo ich ihn Call sagt er mir immer " Die Angabe vom DI Fehlt". Ich meine Gelesen zu haben das der Identifikationsbaustein selbst erstellt wird!?
    Ich glaube dass wird der fehlende Instanzdatenbaustein sein.

    Zitat Zitat von Backe03 Beitrag anzeigen
    In was für nen Format wird die Uhrzeit aus gegeben? und bin ich da mit einem Doppewort am Ausgang richtig bedient?
    Welche Uhrzeit meinst du? Der UTC-Eingang ist laut Handbuch vom Type "DATE", die Ausgänge "sun-midday"/"sun-rise"/"sun_set" sind "TimeOfDay".
    "DATE" ist die Anzahl der vergangenen Tage seit dem 01.01.1970.
    "Time of Day" ist eine Uhrzeit angegeben in der Einheit Millisekunden. z.B.: 01:00 ^= 3600 000dez

    Zitat Zitat von Backe03 Beitrag anzeigen
    meine Überlegung war dann. einen SFC1 zu nehmen der mir ja die Uhrzeit ausliest und weiter gibt die beiden durch einen Vergleicher zu jagen und dadurch einen Bit zu erhalten wenn die errechnete Uhrzeit erreicht ist.
    Hmm... Am einfachsten ist wohl wenn du den Wert vom SFC1 (Date and Time) mit dem FC40 "DT_TOD" (wandeln von "Date and Time" in "Time of Day") in das TOD Format bringst.
    Dann hast du das selbe Format wie vom SUN_TIME.
    Beim Vergleichen müsstest du allerdings noch auf die Millisekunden achten. Die wirst du mit einem = kaum treffen. Da könntest du eventuell was von OSCAT für nehmen.

    In Step7 findet man den FC40 in der Standardbibliothek unter IEC-Functions...
    Sonst gäbe es in OSCAT wahrscheinlich auch ne passende Konverter-Funktionen.

    [EDIT] Vollmi und JS waren schneller [/EDIT]
    Geändert von RONIN (24.02.2015 um 17:43 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

Ähnliche Themen

  1. Antworten: 12
    Letzter Beitrag: 29.09.2012, 13:55
  2. Antworten: 3
    Letzter Beitrag: 20.09.2012, 09:38
  3. Antworten: 5
    Letzter Beitrag: 21.03.2011, 12:39
  4. Wie programmiere ich das??
    Von Tompson im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 28.10.2009, 11:30

Lesezeichen

Berechtigungen

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