Step 7 OSCAD SUN_TIME: wie wende ich ihn an?

Backe03

Level-1
Beiträge
9
Reaktionspunkte
0
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
 

Anhänge

  • 83-oscat-basic-docu-german.pdf
    4,4 MB · Aufrufe: 34
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
//
[COLOR=#ff0000][B]//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)
[/B][/COLOR]//
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
 
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
 
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é
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
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.

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

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 :cool:[/EDIT]
 
Zuletzt bearbeitet:
Zurück
Oben