Licht dimmen 0-10V

chefren_new

Level-1
Beiträge
138
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

hab folgendes Problem.

hab ein Licht mit EVG 0-10V und dieses möchte ich in einen bestimmten Zeitraum z.B.: 50 min von 100% auf 0% dimmen.

wie kann ich an diese Aufgabe herangehen ? mit einenTimer und einem Zähler?


Danke für die Hilfe

Gruß
 
teile 27648 (entspricht 100%) durch die zeit (ggf in sekunden). und subtrahierst jede sekunde etwas. ich würde da den OB35 einsetzen.
 
Hallo

hab leider noch nicht viel Ahnung und kann Teilweise die Antwort nicht verstehen, lerne nur aus Buecher.
Versuche meine Problme in FUP zu loesen.

aber viel dank fuer die Bemuehung

Gruss
 
was hast du bis jetzt?
hast du das beispiel runter geladen?
was macht es bei dir? verstehst du, was da geschrieben steht? (ich habs nicht runtergeladen, ist es etwa in AWL?)

was hast du bis jetzt? hast du den zeitraum schon berechnet? hast du die formel aus dem anderen thread verstanden? (mathematik 6te klasse ;) ) wie können wir dir helfen? zeig doch einfach mal, was du bis jetzt hast! :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

hab leider noch nicht viel Ahnung und kann Teilweise die Antwort nicht verstehen, lerne nur aus Buecher.
Versuche meine Problme in FUP zu loesen.

Das werde ich wohl nie verstehen.... Mag ja sein, dass KOP/FUP
einfacher zu lesen / verstehen ist, aber vieles ist einfach schneller
und (für mich) leichter in AWL zu lösen.

Gerade für solche Sachen sollte man sich einfach zwingen AWL zu
lernen / verstehen. Das macht das Leben doch viel leichter.
 
Das werde ich wohl nie verstehen.... Mag ja sein, dass KOP/FUP
einfacher zu lesen / verstehen ist, aber vieles ist einfach schneller
und (für mich) leichter in AWL zu lösen.

Gerade für solche Sachen sollte man sich einfach zwingen AWL zu
lernen / verstehen. Das macht das Leben doch viel leichter.

da man das ganze auf y=mx+n runterbrechen kann geht das auch in KUP sehr übersichtlich zu lösen UND wir wollen hier nicht in eine grundsatzdebatte verfallen - bitte nicht schon wieder, danke!
 
Hallo

was ich bis jetzt habe ist leider nicht viel, hab die S5Time für den Timer und die Prozent.Wollte jetzt einen Timer und einen Zähler für z.B.: 60 % - 60 mal in dem berechneten Zeitabstand ablaufen lassen, und ein Zähler sollte runterzählen ( für die restlichen Prozent)
Aber leider bekomme ich das nicht hin.

Ich bitte um Hilfe

AWL kann ich leider fast nicht lesen.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wo kommt der zeitintervall, also die dauer deines dimmvorgangs her?

kannst du sie auch in sekunden als INT zur verfügung stellen? (mit ensprechenden umrechnungen...)

dann würde ich, bezugnehmend auf y=mx+n, mit dem start des dimmvorgangs eine sekundenweise addition einer hilsvariablen (INT) welche die bereits abgelaufene zeit repräsentiert starten.

(die nachfolgende berechnung würde ich mit REAL-zahlen durchführen)
mit der hilfsvariablen(t) und der angestebten länge(Δt) kannst du mit x=t/Δt*100.0 die abzisse berechnen.
der lineare faktor m ist -1.0, da du ja von 100% zu 0% dimmen möchtest
die verschiebungskonstante n beträgt 100.0

mit hilfe dessen kannst du die ordinate y berechnen welche nun nur noch mit hilfe des FC106 auf den analogenausgang 0..10V zu deskalieren ist
 
Zuletzt bearbeitet:
Hallo

ich komme da nicht mit, für mich wäre es einfacher wenn es möglch ich eine Timer und einen Zähler anlaufen zu lassen und wenn der Zähler auf null ist sollte die Schleife abgebrochen werden.

aber leider bekomme ich solch ein Schleife nicht zum laufen, wie kann ich das machen.

möchte nicht nur von 100% auf 0% sonder Variabel z.B.: von 70 auf 30 oder so

ein solche Schleife wäre für mich auch bei anderen Bausteinen wichtig.

Gruß
 
Hallo

ich komme da nicht mit, für mich wäre es einfacher wenn es möglch ich eine Timer und einen Zähler anlaufen zu lassen und wenn der Zähler auf null ist sollte die Schleife abgebrochen werden.

aber leider bekomme ich solch ein Schleife nicht zum laufen, wie kann ich das machen.

möchte nicht nur von 100% auf 0% sonder Variabel z.B.: von 70 auf 30 oder so

ein solche Schleife wäre für mich auch bei anderen Bausteinen wichtig.

Gruß
Hallo Chefren,
Zeiten zu nehmen ist hier nicht so günstig.

100 / 70 == Ist
0 / 30 == Soll

Code:
   U #Sekundentakt
   UN M #Fertig
   FP M 10.0
   SPBN go
   L #Ist  // Statische Variable oder MW
   + -1
   T #Ist
go:NOP 0
   L #Ist
   L #Soll
   <=I   // Zeit abgelaufen
   = M #Fertig
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

warum ist mein Weg nicht so günstig?
Ich verstehe deine Lösung nicht, kann derzeit AWL noch nicht lesen, kann leider nur FUP.

Stehe voll auf der Leitung, Sorry

Warum Sekundentakt?
kann ich ein Beispiel in FUP haben?

wie soll das gehen wenn ich von 70% auf 30 % in z.B.: 23 min Dimmen möchte

ich habe ja eine Zeitspanne die für jedes Prozent gilt, oder?

Gruß Klaus
 
die einzelnen bausteine sind nicht in FUP, aber die aufrufe lassen sich in KUP darstellen

zuerst bauen wir uns eine simple zeitschaltuhr:

Code:
*
FUNCTION "SIMPLE_CLOCK" : VOID
TITLE =
//this function realize a switching clock and calculate the range in seconds
//
//DATE:     31.10.2009
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
VERSION : 0.1


VAR_INPUT
  todNOW : TIME_OF_DAY ;	
  todON : TIME_OF_DAY ;	
  todOFF : TIME_OF_DAY ;	
END_VAR
VAR_OUTPUT
  xOut : BOOL ;	
  dRange : DINT ;	
END_VAR
VAR_TEMP
  xTemp1 : BOOL ;	
  xTemp2 : BOOL ;	
  xTemp3 : BOOL ;	
  xTemp4 : BOOL ;	
END_VAR
BEGIN
NETWORK
TITLE =

      L     #todON; 
      L     #todOFF; 
      >D    ; 
      SPB   days; 

      U(    ; 
      L     #todNOW; 
      L     #todON; 
      >=D   ; 
      )     ; 
      U(    ; 
      L     #todNOW; 
      L     #todOFF; 
      <=D   ; 
      )     ; 
      =     #xOut; 
      SPA   end; 

days: L     #todNOW; 
      L     #todON; 
      >=D   ; 
      =     #xTemp1; 

      L     #todNOW; 
      L     TOD#23:59:59.999; 
      <=D   ; 
      =     #xTemp2; 

      L     #todNOW; 
      L     TOD#0:0:0.0; 
      >=D   ; 
      =     #xTemp3; 

      L     #todNOW; 
      L     #todOFF; 
      <=D   ; 
      =     #xTemp4; 

      U     #xTemp1; 
      U     #xTemp2; 
      O     ; 
      U     #xTemp3; 
      U     #xTemp4; 
      =     #xOut; 

end:  NOP   0; 

NETWORK
TITLE =

      L     #todON; 
      L     #todOFF; 
      >D    ; 
      SPB   day; 

      L     #todOFF; 
      L     #todON; 
      -D    ; 
      L     L#1000; 
      /D    ; 
      T     #dRange; 
      SPA   out; 

day:  L     TOD#23:0:0.0;
      L     #todON;
      -D    ;
      L     TOD#1:0:0.0;
      +D ;
      L     #todOFF; 
      +D    ; 
      L     L#1000; 
      /D    ; 
      T     #dRange; 
out:  SET   ; 
      SAVE  ; 
      
END_FUNCTION

und ein sekundenzähler für die bereits gedimmte zeit:

Code:
*
FUNCTION "SIMPLE_DELTATICK" : VOID
TITLE =
//this function realize the calculation of an percantage value from a time length
//
//DATE:     31.10.2009
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
VERSION : 0.1


VAR_INPUT
  xPlcPulse : BOOL ;	
  xReset : BOOL ;	
  dTimeLength : DINT ;	
END_VAR
VAR_OUTPUT
  rPercentage : REAL ;	
END_VAR
VAR_IN_OUT
  dTimeTemp : DINT ;	
  xHelpFlag : BOOL ;	
END_VAR
BEGIN
NETWORK
TITLE =

// reset
      U     #xReset; 
      SPBN  tick; 
      L     0; 
      T     #dTimeTemp; 
// END_reset

// incTime
tick: U     #xPlcPulse; 
      FP    #xHelpFlag; 
      SPBN  calc; 
      L     #dTimeTemp; 
      L     L#1; 
      +D    ; 
      T     #dTimeTemp; 
// END_incTime

// calcValue
calc: L     #dTimeTemp;
      DTR   ;
      L     #dTimeLength;
      DTR   ;
      /R    ;
      L     1.000000e+002;
      *R    ;
      T     #rPercentage;
// END_calcValue
	  SET;
	  SAVE;
END_FUNCTION

und natürlich den von mir schon oft erwähnten y=mx+n sachverhalt:

Code:
*
FUNCTION "SIMPLE_LINEAR" : VOID
TITLE =
//this function realize a simple linear function by the input of the four 
//parameters X1,X2,Y1 and Y2
//
//DATE:     31.10.2009
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
VERSION : 0.1


VAR_INPUT
  rY1 : REAL ;	
  rY2 : REAL ;	
  rX1 : REAL ;	
  rX2 : REAL ;	
  rAbscissa : REAL ;	
END_VAR
VAR_OUTPUT
  rOrdinate : REAL ;	
END_VAR
VAR_TEMP
  rConstant : REAL ;	
  rGrade : REAL ;	
END_VAR
BEGIN
NETWORK
TITLE =

// rGrade
      L     #rX2; 
      L     #rX1; 
      -R    ; 
      T     #rGrade; 

      L     #rY2; 
      L     #rY1; 
      -R    ; 
      L     #rGrade; 
      /R    ; 
      T     #rGrade; 
// END_rGrade

// rConstant
      L     #rGrade; 
      L     #rX1; 
      *R    ; 
      L     #rY1; 
      TAK   ; 
      -R    ; 
      T     #rConstant; 
// END_rConstant

// rOrdinate
      L     #rGrade; 
      L     #rAbscissa; 
      *R    ; 
      L     #rConstant; 
      +R    ; 
      T     #rOrdinate; 
// END_rOrdinate
	  SET;
	  SAVE;
END_FUNCTION

im OB1 machen wir dann folgendes:

Code:
*
ORGANIZATION_BLOCK "CYCL_EXC"
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_TEMP
  OB1_EV_CLASS : BYTE ;	//Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;	//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;	//Priority of OB Execution
  OB1_OB_NUMBR : BYTE ;	//1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;	//Reserved for system
  OB1_RESERVED_2 : BYTE ;	//Reserved for system
  OB1_PREV_CYCLE : INT ;	//Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;	//Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;	//Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;	//Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =

      U     "xLogFalse"; 
      UN    "xLogFalse"; 
      =     "xLogFalse"; 
NETWORK
TITLE =



      CALL "DT_TOD" (
           IN                       := #OB1_DATE_TIME,
           RET_VAL                  := "tod_NOW");
      NOP   0; 
NETWORK
TITLE =
//timerange
      CALL "SIMPLE_CLOCK" (
           todNOW                   := "tod_NOW",
           todON                    := TOD#18:0:0.0,
           todOFF                   := TOD#22:0:0.0,
           xOut                     := "xDimEnable",
           dRange                   := "dDimTimeRange");
      NOP   0; 
NETWORK
TITLE =
//control range
//START
//
      L     7.000000e+001; 
      T     "rDimStart"; 
      NOP   0; 
NETWORK
TITLE =
//control range
//END
      L     3.000000e+001; 
      T     "rDimEnd"; 
      NOP   0; 
NETWORK
TITLE =

      U     "xPLCPulse_1Hz"; 
      =     L     20.0; 
      BLD   103; 
      U     "xDimEnable"; 
      FP    "xHelpFlag01"; 
      =     L     20.1; 
      BLD   103; 
      U     "xDimEnable"; 
      SPBNB _001; 
      CALL "SIMPLE_DELTATICK" (
           xPlcPulse                := L     20.0,
           xReset                   := L     20.1,
           dTimeLength              := "dDimTimeRange",
           rPercentage              := "rTimeState",
           dTimeTemp                := "dDimPeriod",
           xHelpFlag                := "xHelpFlag02");
_001: NOP   0; 
NETWORK
TITLE =

      CALL "SIMPLE_LINEAR" (
           rY1                      := "rDimStart",
           rY2                      := "rDimEnd",
           rX1                      := 0.000000e+000,
           rX2                      := 1.000000e+002,
           rAbscissa                := "rTimeState",
           rOrdinate                := "rDimState");
      NOP   0; 
NETWORK
TITLE =

      U     "xLogFalse"; 
      =     L     20.0; 
      BLD   103; 
      CALL "UNSCALE" (
           IN                       := "rDimState",
           HI_LIM                   := 1.000000e+002,
           LO_LIM                   := 0.000000e+000,
           BIPOLAR                  := L     20.0,
           RET_VAL                  := "wTempRetVal",
           OUT                      := AW     0);
      NOP   0; 
END_ORGANIZATION_BLOCK

am besten übernimmst du folgende symboltabelle beim nachvollziehen vor dem übersetzen der quelle:

Code:
*
CYCL_EXC         OB      1   OB      1 Cycle Execution
wTempRetVal      MW    200   WORD 
dDimPeriod       MD    154   DINT 
rDimEnd          MD    124   REAL 
rDimStart        MD    120   REAL 
rDimState        MD    112   REAL 
rTimeState       MD    108   REAL 
dDimTimeRange    MD    104   DINT 
tod_NOW          MD     20   TOD 
xHelpFlag02      M     150.1 BOOL 
xHelpFlag01      M     150.0 BOOL 
xDimEnable       M     100.0 BOOL 
xPLCPulse_1Hz    M       2.5 BOOL 
xLogFalse        M       0.0 BOOL 
UNSCALE          FC    106   FC    106 Unscaling Values
SIMPLE_CLOCK     FC     12   FC     12 
SIMPLE_DELTATICK FC     11   FC     11 
SIMPLE_LINEAR    FC     10   FC     10 
DT_TOD           FC      8   FC      8 DT to TOD
 
Zuletzt bearbeitet:
das im anhang befindliche projekt beinhaltet die bausteine sowohl als AWL als auch umgeschrieben in KUP ...
 

Anhänge

  • S7_dim.zip
    179,1 KB · Aufrufe: 13
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
die berechnung hier:

Code:
*
day:  L     TOD#23:0:0.0;
      L     #todON;
      -D    ;
      L     TOD#1:0:0.0;
      +D ;
      L     #todOFF; 
      +D    ; 
      L     L#1000; 
      /D    ; 
      T     #dRange;

gefällt mir nicht ... bin für vorschläge offen
 
Hallo


hab das Problem gelöst!!

hab noch eine kleine Frage zu Schluß

Wie kann ich sehen ob auf meinen MC noch Platz frei ist? oder erfahre ich das wenn ich Keinen Bausteine mehr in die CPU laden kann.


DANKE

Gruß
 
Zurück
Oben