Blinklicht Scl

Dann versuche doch mal, deinen KOP Teil in textliche Sprache umzusetzen/aufzuschreiben.. Worte wie WENN, UND, ODER eventuell herausstechend formatieren.
 
So habe ich es in Kop gelöst.
 

Anhänge

  • IMG_4896.jpeg
    IMG_4896.jpeg
    4,9 MB · Aufrufe: 71
  • IMG_4897.jpeg
    IMG_4897.jpeg
    4,6 MB · Aufrufe: 69
Das ist eine Vorgabe, dass ich Merker nutzen soll oder worum geht es?
Kann jedoch jemand helfen oder nicht?
 
Du hast dein Merkbit 0 im Byte 0 "M1.0" genannt, korrekt wäre "M0.0", oder du änderst eben deine Variable zu Merkerbit 0 Byte 1
Korrekt wäre ein aussagekräftig(er)es Symbol und noch besser die Nichtverwendung von Merkern.
🤷‍♂️ 😁

Das ist eine Vorgabe, dass ich Merker nutzen soll oder worum geht es?
Wir haben 2024 und in den S7-Schulen werden immer noch (PS: zuerst) diese veralteten Merker gelehrt.
Und in den Firmen muss man dann anschließend diese wieder mühsam austreiben wie so'n Exorzist.
😮‍💨


Sorry für den OT.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn meine Eltern mir damals nicht zuerst Deutsch beigebracht hätten, würde mir heute vermutlich Englisch nicht so schwer fallen.
Oder Russisch....
😁

Noch mehr OT...

PS:
Hab' in obigen Post mal noch ein "zuerst" eingefügt.
Kennenlernen sollte man diese Programmierweise schon irgendwann (im Geschichtsunterricht).
 
Gänzlich ungetestet, zum Knobeln für Hans alias Hänschen:
Code:
VAR_INPUT
    ibHalbSec     : BOOL ; // Edit (Danke, funkey!): 2Hz-Takt, woher auch immer ...
END_VAR

VAR_OUTPUT
    obLampe       : BOOL ; // BlinkLampe
END_VAR

VAR_TEMP
    tbAktiv       : BOOL ; // BlinkSequenz ist aktiv
END_VAR

VAR_STATIC
    sdRest        : DINT ; // Rest der BlinkSequenz
    sbHalbSecPrev : BOOL ; // Flanken"Merker"
END_VAR

IF ibHalbSec AND NOT sbHalbSecPrev THEN
    sdRest := sdRest / 2 ;
END_IF ;
sbHalbSecPrev := ibHalbSec ;

tbAktiv := sdRest <> 0 ;

IF tbAktiv THEN
    ; // NOP
ELSIF MerkerAuswahl THEN // M 1.0 !?
    sdRest := 16#1C039C ; // BlinkMuster 1
ELSE
    sdRest := 13#FF7BDE ; // BlinkMuster 2
END_IF ;

obLampe := tbAktiv AND sdRest MOD 2 = 0 ;
 
Zuletzt bearbeitet:
Perfekte Lösung @Heinileini !!👏
Nur versteht das keiner...😅
Ein paar kleine Anmerkungen: Den Merker sollte man von außen übergeben und der Takt sollte 2Hz haben und ich würde das Bit-Muster besser leserlich angeben. Jede 0 schaltet eine halbe Sekunde den Ausgang auf TRUE (von rechts nach links).

Code:
IF #tbAktiv THEN
    ; // NOP
ELSIF #ibSwitch
THEN
    #sdRest := 2#000111000000001110011100;
ELSE
    #sdRest := 2#111111110111101111011110;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur versteht das keiner...😅
Doch! Du hast es verstanden!
Das war ein Bisschen Absicht, darum schrieb ich ja "zum Knobeln" ... sollte doch keine fertige Lösung sein.
... der Takt sollte 2Hz haben ...
Sorry, stimmt, das hatte ich doch auch gemeint, als ich ihn "HalbSec" getauft habe. Das habe ich dann aber leider kurz danach wieder verdrängt.
und ich würde das Bit-Muster besser leserlich angeben. Jede 0 schaltet eine halbe Sekunde den Ausgang auf TRUE (von rechts nach links).
Nicht ganz bzw. nicht jede 0, denn wenn alle Bits 0 geworden sind, wird die Ausgabe inaktiv.
Code:
IF #tbAktiv THEN
    ; // NOP
ELSIF #ibSwitch
THEN
    #sdRest := 2#000111000000001110011100;
ELSE
    #sdRest := 2#111111110111101111011110;
END_IF;
Ja, kann man so machen. Die Umwandlung Binär in Hex bzw. Hex in Binär ist ja zum Glück nicht so geheimnisvoll oder kompliziert, wie uns manche glauben machen wollen.
Und die Umschaltung zwischen den beiden Mustern per Input zu "importieren" hat meinen Segen.
 
Zuletzt bearbeitet:
Hier mal eine mögliche Lösung, Deiner Schulaufgabe, mit nur einem Puls-Timer.
Es gibt unzählige Varianten, wie man diese lösen kann. Ich empfehle Dir verschiedene Varianten auszuprobieren, zu verstehen und die Vor- und Nachteile analysieren.

Code:
FUNCTION_BLOCK "BlinkSeq_FB"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      Select : Bool;
   END_VAR

   VAR_OUTPUT
      Lampe : Bool;
   END_VAR

   VAR
      Seq : Array[0..9] of Time;
      SeqMax : Int;
      TP_Pulse : TP_TIME;
      Pulse : Bool;
      Step : Int;
   END_VAR


BEGIN
    IF #Step = 0 THEN //Werte nur übernehmen, wenn die Sequenz neu startet
        IF #Select THEN //Ablauf bei Eingang True
            #Seq[0] := t#1s;
            #Seq[1] := t#1s500ms;
            #Seq[2] := t#1s;
            #Seq[3] := t#1s500ms;
            #Seq[4] := t#4s;
            #Seq[5] := t#1s500ms;
            #SeqMax := 5;
        ELSE //Anlauf bei Eingang False
            #Seq[0] := t#500ms;
            #Seq[1] := t#2s;
            #Seq[2] := t#500ms;
            #Seq[3] := t#2s;
            #Seq[4] := t#500ms;
            #Seq[5] := t#2s;
            #Seq[6] := t#500ms;
            #Seq[7] := t#4s;
            #SeqMax := 7;
        END_IF;
    END_IF;
   
    //Pulse erzeugen
    #TP_Pulse(IN := NOT #Pulse,
              PT := #Seq[#Step],
              Q => #Pulse);
   
    //Wenn Puls zu Ende gehe in den nächsten Schritt
    IF (NOT #Pulse) THEN
        #Step += 1;
    END_IF;
   
    //Wenn Maximum erreicht, dann von vorne
    IF #Step > #SeqMax THEN
        #Step := 0;
    END_IF;
   
    //Lampe nur in den geraden Schritten einschalten, daher Modulo mit 2 auf 0 abgefragt.
    #Lampe := #Pulse AND #Step MOD 2 = 0;
END_FUNCTION_BLOCK
 
Ich danke allen. Meine Lösung ist dann doch anders geworden als die Vorschläge.
Ich habe auch eine 1500er SPS, daher waren auch einige Lösungsvorschläge nicht ganz umsetzbar.


"Time1" := ("M1.0" AND NOT #IEC_Timer_0_Instance_1.Q OR #IEC_Timer_0_Instance.Q AND NOT "M1.0") AND NOT #IEC_Timer_0_Instance.Q;
#IEC_Timer_0_Instance(IN := "Time1",
PT := T#10s500ms);

"Time2" := (NOT "M1.0" AND NOT #IEC_Timer_0_Instance.Q OR #IEC_Timer_0_Instance_1.Q AND NOT "M1.0") AND NOT #IEC_Timer_0_Instance_1.Q;
#IEC_Timer_0_Instance_1(IN := "Time2",
PT := T#12s);


"P1" := (NOT #IEC_Timer_0_Instance_1.Q AND #IEC_Timer_0_Instance.ET >= T#0s AND #IEC_Timer_0_Instance.ET <= T#1s)
OR (NOT #IEC_Timer_0_Instance_1.Q AND #IEC_Timer_0_Instance.ET >= T#2s500ms AND #IEC_Timer_0_Instance.ET <= T#3s500ms)
OR (NOT #IEC_Timer_0_Instance_1.Q AND #IEC_Timer_0_Instance.ET >= T#5s AND #IEC_Timer_0_Instance.ET <= T#9s)
OR (NOT #IEC_Timer_0_Instance.Q AND #IEC_Timer_0_Instance_1.ET >= T#0s AND #IEC_Timer_0_Instance_1.ET <= T#500ms)
OR (NOT #IEC_Timer_0_Instance.Q AND #IEC_Timer_0_Instance_1.ET >= T#2s500ms AND #IEC_Timer_0_Instance_1.ET <= T#3s)
OR (NOT #IEC_Timer_0_Instance.Q AND #IEC_Timer_0_Instance_1.ET >= T#5s AND #IEC_Timer_0_Instance_1.ET <= T#5s500ms)
OR (NOT #IEC_Timer_0_Instance.Q AND #IEC_Timer_0_Instance_1.ET >= T#7s500ms AND #IEC_Timer_0_Instance_1.ET <= T#8s);
 
Zurück
Oben