TIA Programmierung Terrarium

Zuviel Werbung?
-> Hier kostenlos registrieren
@heipo
Danke dir. Aber wo gebe ich die Zeiten ein?[/QUOTE]


hallo ich habe deine Frage grade erst gesehen, habe das im PDF makiert



Anhang anzeigen Main (OB1)neu.pdf


habe noch wetere PDFs angehangen wie man es machen könnte das sind nur Denkanstösse
 

Anhänge

  • Main (OB1)1.pdf
    46,3 KB · Aufrufe: 8
  • DT zerlegen (FC1).pdf
    65,9 KB · Aufrufe: 9
  • DTL.pdf
    44 KB · Aufrufe: 10
Also die Zeiten gehen nicht über 0 Uhr hinaus.
Diese Möglichkeit würde ich aber trotzdem vorsehen, da sie ...
- an nur einer einzigen Stelle im Programm (im FC "versteckt") einen nicht wirklich nennenswerten MehrAufwand erfordert und
- auch für den Fall einer versehentlich "zu klein" eingegeben AusschaltZeit ein plausibles/nachvollziehbares Verhalten liefert.

Auf die von Dir in Beitrag #40 gezeigten Tipps & Tricks möchte ich eigentlich nicht eingehen.
Hast Du denn den Bedarf, unterschiedliche Ein-/AusZeiten abhängig vom Wochentag oder Datum zu "programmieren" und wenn ja: lassen sich die TerrariumBewohner das überhaupt gefallen? ;)

Was mir persönlich noch fehlt, sind möglichst kurze, einprägsame, verständliche, informative Namen für den FC und seine Parameter.
So würde jetzt beispielhaft ein Aufruf aussehen:
Code:
Lampe3 := TageszeitAbh(iTodEin := TOD#12:00:00, iTodAus := TOD#12:30:00, iTodAkt := aktuelleTageszeit) ;
... wie schräg ist das denn? :ROFLMAO: Gefällt mir einerseits nicht wirklich, aber andererseits doch. Vielleicht sollte ich mich auch zum DatenTyp 'DT' durchringen? ;)

Code:
FUNCTION TageszeitAbh : BOOL
// ***********************************************************************
// Diese Funktion sagt, ob die aktuelle Zeit 
// zwischen der EINschalt- und der AUSschaltzeit liegt in dem Falle, dass
// EINschaltZeit < AUSschaltzeit (Ausschalten am Tag des Einschaltens)
// bzw. zwischen 00:00:00 und der AUSschaltZeit oder 
// zwischen der EINschaltZeit und 24:00:00 liegt in dem Falle, dass
// EINschaltZeit > AUSschaltzeit (Ausschalten am Tag nach dem Einschalten)
// ***********************************************************************
VAR_INPUT
iTodEin      : TOD ; // Uhrzeit für EINschalten
iTodAus      : TOD ; // Uhrzeit für AUSschalten
iTodAkt      : TOD ; // aktuelle Uhrzeit
END_VAR

VAR
tbInv        : BOOL ; // EinschaltZeit > AusschaltZeit
tbEin        : BOOL ; // aktuelle Zeit ist >= EinschaltZeit
tbNichtAus   : BOOL ; // aktuelle Zeit ist nicht >= AusschaltZeit
END_VAR

BEGIN
tbInv        := iTodEin >  iTodAus ;
tbEin        := iTodAkt >= iTodEin ;
tbNichtAus   := iTodAkt <  iTodAus ; 
TageszeitAbh := tbInv XOR ((tbInv XOR tbEin) AND (tbInv XOR tbNichtAus)) ;
END_FUNCTION
Wenn man nicht so viele TempVariablen spendieren mag, kann man die beiden DeklarationsZeilen und die beiden ZuweisungsZeilen für 'tbEin' und 'tbNichtAus' einsparen und dafür die ZuweisungsZeile für 'TageszeitAbh' wie folgt aufbohren. Zum besseren Verständnis inkl. "AngstKlammern":
Code:
TageszeitAbh := tbInv XOR ((tbInv XOR (iTodAkt >= iTodEin)) AND (tbInv XOR (iTodAkt < iTodAus))) ;
Abschliessend noch Beispiele für den Aufruf von 'TageszeitAbh':
Code:
Lampe1 := TageszeitAbh(iTodEin := aEin[23].Von, iTodAus := aEin[23].Bis, iTodAkt := aktuelleTageszeit) 
       OR TageszeitAbh(iTodEin := TOD#23:00:00, iTodAus := TOD#01:00:00, iTodAkt := aktuelleTageszeit) 
       OR TageszeitAbh(iTodEin := TOD-Var-Von3, iTodAus := TOD-Var-Bis3, iTodAkt := aktuelleTageszeit) ;  

Lampe2 := TageszeitAbh(iTodEin := Ein4, iTodAus := Aus4, iTodAkt := aktuelleTageszeit) ;

 
Ja gut. Theoretisch ist es natürlich nicht falsch auch mal ein oder zwei schaltzeituhren die über 0 hinaus gehen zu haben. Aber die Art der Programmierung ist für mich sehr unverständlich da ich eigendlich mit FUP arbeite.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber die Art der Programmierung ist für mich sehr unverständlich da ich eigentlich mit FUP arbeite.
Ja, ich kann das gut verstehen, dass einem das Programmieren und ProgrammeLesen in einer Sprache leichter von der Hand geht, als in einer anderen.

Da es hier "lediglich" um logische BitVerknüpfungen geht und um Vergleiche, liegst Du auch "voll im Trend". Für solche Aufgaben wird u.a. hier im Forum von den meisten das Programmieren in KOP und/oder in FUP statt SCL bevorzugt bzw. empfohlen und von vielen Kunden, Inbetriebnehmern und vom WartungsPersonal gewünscht/gefordert.

Ich bin aber sicher, Du kannst mein Konglomerat aus SCL-orientiertem "PseudoCode", bestehend aus 3 Vergleichen, 1 UND-Verknüpfung, 3 XOR-Verknüpfungen und 4 WertZuweisungen in der einen Version des FC und mit 2 weniger WertZuweisungen und 2 weniger Deklarationen in der "abgespeckten" Version entschlüsseln und viel besser und schneller in FUP umsetzen, als ich es mit Kästchen- und Striche-Malen hier im Editor kann (ohne Zugriff auf ein S7-System und ohne fundierte FUP-Kenntnisse :oops:).
Aber ich versuche einfach mal, den FC in der abgespeckten Version in etwas FUP-ähnliches umzusetzen ... bitte ... warten ... Sie ... jetzt ... :
Code:
             +-----+   
             |  >  |   
  iTodEin ---|     |   tbInv
             |     |   +---+
  iTodAus ---|     |---|   |
             +-----+   +---+                                       
 
// hier vermutlich neues Netzwerk beginnen
                                                                
             +-----+            +-----+                                                     
             |  >= |            | XOR |                                                     
  iTodAkt ---|     |   tbInv ---|     |                                                     
             |     |            |     |                                                     
  iTodEin ---|     |------------|     |---+             
             +-----+            +-----+   |                                                 
                                          |                                    
             +-----+            +-----+   |   +-----+            +-----+                                          
             |  <  |            | XOR |   |   | AND |            | XOR |                                                        
  iTodAkt ---|     |   tbInv ---|     |   +---|     |   tbInv ---|     |   TageszeitAbh             
             |     |            |     |       |     |            |     |   +---+                      
  iTodAus ---|     |------------|     |-------|     |------------|     |---|   |          
             +-----+            +-----+       +-----+            +-----+   +---+

Hier noch der Versuch, ein Beispiel für Aufrufe des FC zu liefern für "Lampe1 mit bis zu 3 EIN-Perioden pro Tag":
Code:
                       +--------------+  
                       | TageszeitAbh |  
                ... ---|EN            |                                                                           
                       |              |                                                                
        aEin[1].Von ---|              |                                                                           
                       |              |                                                                
        aEin[1].Bis ---|           OUT|-----+                                                                     
                       |              |     |                                                          
  aktuelleTageszeit ---|           ENO|     |
                       +--------------+     |
                                            |
                       +--------------+     |
                       | TageszeitAbh |     |
                ... ---|EN            |     |                                                                      
                       |              |     |                                                           
       TOD#23:00:00 ---|              |     |                                                                      
                       |              |     |                                                           
       TOD#01:00:00 ---|           OUT|---+ |                                                                      
                       |              |   | |                                                          
  aktuelleTageszeit ---|           ENO|   | |
                       +--------------+   | |                   
                                          | |
                       +--------------+   | |   +-----+  
                       | TageszeitAbh |   | |   |  OR |  
                ... ---|EN            |   | +---|     |                                                                           
                       |              |   |     |     |                                                         
       TOD-Var-Von3 ---|              |   +-----|     |   Lampe1                                                                         
                       |              |         |     |   +---+                                                         
       TOD-Var-Bis3 ---|           OUT|---------|     |---|   |                                                                    
                       |              |         +-----+   +---+                                                              
  aktuelleTageszeit ---|           ENO|    
                       +--------------+
Und da ich mit dem Malen so schön in Schwung gekommen bin, jetzt noch ein ZeitDiagramm als kleine Zugabe.
Es veranschaulicht, warum die Ergebnisse der beiden Vergleiche mit der aktuellen Zeit
mit UND verknüpft werden, wenn EinschaltZeit <= AusschaltZeit und sonst mit ODER.
Ausserdem ist dargestellt, was bei EinschaltZeit = AusschaltZeit passiert: "nichts"! D.h. der FC gibt in diesem Fall 0 alias FALSE aus.
Code:
                   |<---- E<A ---->|       |<-- E=A-->|       |<---- E>A ---->|
           UhrZeit 0    E     A    0       0     E    0       0    A     E    0
                                                 A                             
iTodAkt >= iTodEin  ____|==========         _____|====         __________|==== 
                                                                              
iTodAkt <  iTodAus  =========|_____         ====|_____         ===|___________ 
                                                                              
iTodEin >  iTodAus  _______________         __________         =============== 
                                                                              
                AND ____|====|_____     AND __________      OR ===|______|====
 
Zuletzt bearbeitet:
Hallo Leute.
Kann mir einer einen Tipp geben
Der Analogausgang (0-10V) einer S7 Baugruppe kann ja nur 25mA maximal ausgeben.
Ich benötige ein Gerät bzw eine Schaltung mit der ich aus 0-10V (25mA) ---> 0-10V (ca200mA) machen kann. Würde gerne bis zu 6 LEDs mit diesem Ausgang dimmen. Den Vorwiderstand der jeweiligen LED würde ich dann für eine Spannung von 10V auslegen und die 6 LEDs parallel schalten.
 
Den Vorwiderstand der jeweiligen LED würde ich dann für eine Spannung von 10V auslegen und die 6 LEDs parallel schalten.
Genau das sollte man nicht tun.
Das sollte man sogar dann vermeiden, wenn mehrere "baugleiche" LEDs "parallel" geschaltet werden sollen.
Jede Diode mit einem eigenen Vorwiderstand in Reihe schalten! Und dann erst diese 6 ReihenSchaltungen parallel schalten.

PrimitivLösung für Deinen "ImpedanzWandler":
1 npn-Transistor, Kollektor an +10V, Basis an AnalogAusgang, Emitter an das "Plus-Ende" der 6 parallel geschalteten ReihenSchaltungen aus je 1 Vorwiderstand und 1 LED.

Oder besser pro LED:
1 npn-Transistor, 1 Widerstand
Basis an AnalogAusgang,
Kollektor an Kathode von LED, Anode von LED an +12V
Emitter an Widerstand, anderes Ende von Widerstand an GND alias Masse.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja so meine ich es ja. Es sind 6 baugleiche LEDs die jeweils einen eigenen Widerstand bekommen. Aber die 6 LEDs sind nicht immer alle gleichzeitig in Betrieb und 1 Transistor wäre mir lieber. Mit 12V würde noch am besten sein. Vorwiderstand für die Basis würden ja 1kohm reichen oder? Welcher Widerstand wird dann für Emitter benötigt?
 
Ja so meine ich es ja. Es sind 6 baugleiche LEDs die jeweils einen eigenen Widerstand bekommen.
Super!
Aber die 6 LEDs sind nicht immer alle gleichzeitig in Betrieb und 1 Transistor wäre mir lieber.
Nicht gleichzeitig? Werden sie zusätzlich noch durch Kontakte geschaltet?
Betrieb mit insgesamt nur 1 Transistor würde ich gar nicht empfehlen, insbesondere nicht, wenn unterschiedliche Anzahl von LED in Betrieb sein werden.
Mit 12V würde noch am besten sein. Vorwiderstand für die Basis würden ja 1kohm reichen oder?
Könnte man vorsichtshalber pro Basis spendieren.
Welcher Widerstand wird dann für Emitter benötigt?
Pro Emitter R = (10V - 0,6V) / (maximalen LED-Strom einer LED).
 
Was für Transistoren würden denn gehen? Der BC547B? Wenn ich für jede LED einen transistor benutze?
Also wäre der Widerstand Emitter der vorwiderstand der led?

Ja die leds werden zusätzlich über Relais Kontakte geschaltet
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
    o-------------+----- +12V
                  |
                  o
                   /
                  o
                  |A
                --+--
                 \ /  LED
                --+--
                  |K
     >= 1 kΩ      |
       +----+  B / C            (<= 100 mA)
    o--+    +--|<    BC547B     (<= 500 mW)
       +----+    \
                  |E
                 +++
 0..10 V         | |   z.B. 820 Ω für max. 10 mA durch LED
                 | |   z.B. 470 Ω für max. 20 mA durch LED, 250 mW
                 +++
                  |
    o-------------+----- 0V
BC547B sollte genügen, da der grösste Strom fliesst, wenn die Kollektor-EmitterSpannung am kleinsten ist.
Welchen maximalen LED-Strom planst Du? Ich gehe mal von 20 mA aus.
Wie gross ist der SpannungsAbfall an der LED bei diesem Strom? Ich gehe mal von 1,6..2,5V aus.
Also wäre der Widerstand Emitter der vorwiderstand der led?
Jain. Der EmitterWiderstand bildet mit dem Transistor eine StromQuelle für die LED, also einen etwas "komfortableren" VorWiderstand.
 
Zuletzt bearbeitet:
Ja der led Strom sollte so 20-25ma sein. Sind weiße leds. Also keine 1w LEDs. Die Spannung der LED müssten so um die 2.2v liegen

Kann ja dann den Eingang der 1kohm Widerstände alle parallel klemmen und am analogausgang anschliesen oder?
 
Kann ja dann den Eingang der 1kohm Widerstände alle parallel klemmen und am analogausgang anschliesen oder?
Genau!
Bei 390 Ω als EmitterWiderstand kommst Du auf 24 mA.
Die Erwärmung der Transistoren bei mittleren Strömen im Auge behalten. Ihre VerlustLeistung ist bei kleinen und bei grossen Strömen am unkritischsten (wie bereits angedeutet).
 
Und so wird der analogausgang auch nicht groß belastet. Richtig?
Ja, nur durch die BasisStröme. Z.B. 6 * 4 mA = 24 mA < 25 mA.
Kritisch sind allenfalls die abgeschalteten LED-Zweige, da sie keinen KollektorStrom liefern und der EmitterStrom dann nur aus dem BasisStrom besteht. So gesehen würde ich für die BasisWiderstände 2,7 kΩ .. 3,3 kΩ wählen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre es dann vielleicht sinnvoll die Basis mit über einen Kontakt weg zu schalten oder muss das nicht?
Einfacher wäre, nur die Verbindung vom AnalogAusgang zur Basis zu unterbrechen/schalten.
Code:
    o----------------------+----- +12V
                           |
                           |
    o-----------+          |
  0..10 V       |          |
                o          |
                 /         |
                o          |
                |          |A
               +++       --+--
               | | 1 kΩ   \ /  LED
               | |       --+--
               +++         |K
                |          |
                |       B / C            (<= 100 mA)
                +-------|<    BC547B     (<= 500 mW)
                |         \
                |          |E
               +++        +++
               | |330 kΩ  | | 390 Ω für max. 24 mA durch LED, 250 mW   
               | |        | |
               +++        +++
                |          |
    o-----------+----------+----- 0V
Oder LED aus bei geschlossenem Kontakt:
Code:
    o----------------------+----- +12V
                           |
    o-----------+          |
  0..10 V       |          |
                |          |A
               +++       --+--
               | |2,7kΩ   \ /  LED
               | |       --+--
               +++         |K
                |          |
                |       B / C            (<= 100 mA)
                +-------|<    BC547B     (<= 500 mW)
                |         \
                |          |E
                o         +++
                 /        | | 390 Ω für max. 24 mA durch LED, 250 mW   
                o         | |
                |         +++
                |          |
    o-----------+----------+----- 0V
 
Zuletzt bearbeitet:
Okay das wäre natürlich am besten. Dank dir.

Aber bei dem zweiten Bild:
Macht dem Analogsignal das nichts aus wenn man den über den 2,7kohm Widerstand auf Masse schaltet?
Und wenn ich das bei 5 leds mache wäre ja der analogausgang über 5 x 2,7kohm parallel zur Masse. Wenn die weißt was ich meine. Dann würde sich da der Widerstand extrem verkleinern
 
Musst Du guggen nach der maximalen Bürde des AA.

Und 5x2,7k gegen Masse parallel kannst Du ausrechnen: 1/R=1/R1+1/R2+1/R3+1/R4+1/R5
2700/5 geht schneller.
 
Zurück
Oben