Lauflicht für 32 LED´s erstellen - brauche Hilfe

LeTobi

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits^^
Könnte mir evtl jemand ein Beispiel in ST machen wie ich mir einen Lauflicht_FB erstelle?
Ich möchte nämlich gerne ein 32 LED Lauflicht mit TC 2 in ST realisieren und komme überhaupt nicht weiter.

Oder hat evtl jemand sogar eine andere ( bessere/einfachere) Lösung?

Danke schonmal

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
an der Stelle wie ich mir diesen FB zusammenbaue^^ habe nur überall gelesen das es so einen Baustein gibt bzw man ihn sich erstellen kann,
aber ich habe null Vorstellung davon wie^^
 
... dann solltest du vielleicht erstmal damit anfangen, deine Anforderung für dich zu formulieren (wie soll das Ding arbeiten ?).
Als Nächstes käme dann die Schnittstelle (welche Eingänge und Ausgänge hat der Baustein ? Was sollen die bewirken ?)
Dann baut man sich das schon mal zusammen und versucht sich mal an der Code-Syntax.
Jetzt funktioniert etwas nicht, wie gewünscht (oder gar nicht) ... und nun kann man fragen.

Wie wäre das so ?

Gruß
Larry
 
Hi Larry, ja du hast recht, es so zu machen wäre die feine englische Art.
Wie gesagt ich versuche zur Übung ein Lauflicht aus 32 LED´s zum laufen zu bringen.
Hier im Forum in einem anderen Tread habe ich folgenden Beitrag von Borsti87 gelesen:
"ein 32-Bit Lauflicht_FB kannst mit einer DWORD - Variablen machen. Mit GETBIT32 kannst du das n-te bit retten, mit SHL nach links schieben und mit SETBIT32 das Folgelicht anfügen."
Da dachte ich mir, mensch das ist doch genau das was ich machen will. Habe bisher den ganzen morgen an einer Variante mit Timern ( TON und TOF) rumprobiert aber bisher noch nichts verwertbares rausbekommen. Daher dachte ich mir das mir evtl jemand erklären kann wie ich das Problem mit einem FB löse und mir so einen FB erstellen kann, gerne auch mit dieser Vorgehensweise von Borsti87.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... wenn du doch schon mit dem Erstellen herumgespielt hast dann kannst du doch den Code auch mal posten - dann kann man sich darüber unterhalten und ggf. überlegen, was man wie anders oder besser oder überhaupt machen kann ...

Gruß
Larry
 
Hi Larry , jo du hast ja recht^^ sonst lerne ich es nie.
Ok hier mal was ich bisher mit TON und TOF versucht habe.

Code:
(* Programm:  Lauflicht *)

lfb_lauflicht_Timer1(IN:=gbi_Schalter_Lauflicht OR lfb_lauflicht_aus_Timer4.Q , PT:=t#700ms , Q=> gbo_Lampe1 , ET=> );

lfb_lauflicht_aus_Timer1(IN:=lfb_lauflicht_Timer1.Q , PT:=t#700ms , Q=> , ET=> );

lfb_lauflicht_Timer2(IN:=lfb_lauflicht_aus_Timer1.Q , PT:=t#700ms , Q=> gbo_Lampe2 , ET=> );

lfb_lauflicht_aus_Timer2(IN:=lfb_lauflicht_Timer2.Q , PT:=t#700ms , Q=> , ET=> );

lfb_lauflicht_Timer3(IN:=lfb_lauflicht_aus_Timer2.Q , PT:=t#700ms , Q=> gbo_Lampe3 , ET=> );

lfb_lauflicht_aus_Timer3(IN:=lfb_lauflicht_Timer3.Q , PT:=t#700ms , Q=> , ET=> );

lfb_lauflicht_Timer4(IN:=lfb_lauflicht_aus_Timer3.Q , PT:=t#700ms , Q=> gbo_Lampe4 , ET=> );

lfb_lauflicht_aus_Timer4(IN:=lfb_lauflicht_Timer4.Q , PT:=t#700ms , Q=> , ET=> );

Komme damit aber bisher auf keinen grünen Zweig.
Ist jetzt auch erstmal nur für 4 Lampen, bevor die net laufen brauche ich net auf 32 gehen^^
 
Zuletzt bearbeitet:
OK ... das ist doch schon mal ein Anfang ;)

So, wie ich das sehe würde das bewirken, dass beim Aktivieren von "Schalter_Lauflicht" eine Lampe nach der anderen aktiviert wird und dann an bleibt.
Das war sicherlich nicht so ganz das, was du haben wolltest.

Das Beispiel, was du schon gesehen und nicht verstanden hast funktioniert nach einem komplette anderem Schema wie dein Ansatz.
Möchtest du nun erstmal deinen Ansatz sinnvoll zum Laufen bekommen oder sollen wir auf das andere System umschwenken ?
Ich würde (um des Verstehens willen) erstmal dies zum Laufen bringen (auch wenn es nicht besonders Resourcen-schonend ist).

Wenn du bewirken möchtest, dass immer nur eine Lampe an ist, dann geht das nur über Verknüpfungen.
Das könnte dann so aussehen :
Code:
gbo_Lampe1 := lfb_Lauflicht_Timer1.q and not lfb_Lauflicht_aus_Timer1.q
das Gleiche für die anderen Lampen - die dürfen dann natürlich nicht mehr auch noch an dem Timer-Aufruf selbst hängen.

Wenn dann der 4. Timer den ersten wieder abwerfen soll so müßtest du den Code an der Stelle so abändern :
Code:
lfb_lauflicht_Timer1(IN:=gbi_Schalter_Lauflicht [COLOR=#ff0000][B]and not[/B][/COLOR] lfb_lauflicht_aus_Timer4.Q , PT:=t#700ms , Q=> , ET=> );

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok Danke dir ich werde das heute abend oder morgen probieren ich melde mich dann bei wieder mit ergebnissen.
Genau, ja ich würde auch sagen erstmal so und dann reden wir danach über das andere system, verstehen will ich beide^^
 
hmm so wie du das geschrieben hast ging gar nichts evtl hatte ich auch die anderen timer und die aus_timer falsch verknüpft.
habe dann ein bisschen rumprobiert und irgendwann bin ich zu diesem stand gekommen der aber immer noch nicht läuft.

Code:
fb_lauflicht_Timer1(IN:=gbi_Schalter_Lauflicht AND NOT lfb_lauflicht_aus_Timer4.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_Timer2(IN:=lfb_lauflicht_aus_Timer1.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_Timer3(IN:=lfb_lauflicht_aus_Timer2.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_Timer4(IN:=lfb_lauflicht_aus_Timer3.Q , PT:=t#700ms , Q=> , ET=> );

lfb_lauflicht_aus_Timer1(IN:=lfb_lauflicht_Timer1.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_aus_Timer2(IN:=lfb_lauflicht_Timer2.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_aus_Timer3(IN:=lfb_lauflicht_Timer3.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_aus_Timer4(IN:=lfb_lauflicht_Timer4.Q , PT:=t#700ms , Q=> , ET=> );


gbo_Lampe1 := lfb_Lauflicht_Timer1.q (* AND NOT lfb_Lauflicht_aus_Timer1.q*);
gbo_Lampe2 := lfb_Lauflicht_Timer2.q (*AND NOT lfb_Lauflicht_aus_Timer2.q*);
gbo_Lampe3 := lfb_Lauflicht_Timer3.q (*AND NOT lfb_Lauflicht_aus_Timer3.q*);
gbo_Lampe4 := lfb_Lauflicht_Timer4.q (*AND NOT lfb_Lauflicht_aus_Timer4.q*);

könntest du mir das nochmal genauer erklären wie das du vorher gemeint hast?

Grüße
 
Also ich würde die Ausgänge als DWORD nehmen, dann einen Zähler, der zählt dann aber nur bis 32. Und dann mit dem Zählwert das entsprechende Bit setzen mit Hilfe einer Maske.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
fb_lauflicht_Timer1(IN:=gbi_Schalter_Lauflicht AND NOT lfb_lauflicht_aus_Timer4.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_Timer2(IN:=lfb_lauflicht_aus_Timer1.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_Timer3(IN:=lfb_lauflicht_aus_Timer2.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_Timer4(IN:=lfb_lauflicht_aus_Timer3.Q , PT:=t#700ms , Q=> , ET=> );

lfb_lauflicht_aus_Timer1(IN:=lfb_lauflicht_Timer1.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_aus_Timer2(IN:=lfb_lauflicht_Timer2.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_aus_Timer3(IN:=lfb_lauflicht_Timer3.Q , PT:=t#700ms , Q=> , ET=> );
lfb_lauflicht_aus_Timer4(IN:=lfb_lauflicht_Timer4.Q , PT:=t#700ms , Q=> , ET=> );


gbo_Lampe1 := lfb_Lauflicht_Timer1.q [COLOR=#ff0000](* AND NOT lfb_Lauflicht_aus_Timer1.q*)[/COLOR];
gbo_Lampe2 := lfb_Lauflicht_Timer2.q [COLOR=#ff0000](*AND NOT lfb_Lauflicht_aus_Timer2.q*)[/COLOR];
gbo_Lampe3 := lfb_Lauflicht_Timer3.q [COLOR=#ff0000](*AND NOT lfb_Lauflicht_aus_Timer3.q*)[/COLOR];
gbo_Lampe4 := lfb_Lauflicht_Timer4.q [COLOR=#ff0000](*AND NOT lfb_Lauflicht_aus_Timer4.q*)[/COLOR];
könntest du mir das nochmal genauer erklären wie das du vorher gemeint hast?

Klar ... ich weiß jetzt nur nicht, was du genau meinst ...
Warum hast du in deinem Code das von mir rot markierte auskommentiert ? Aus meiner Sicht müßte das die Lampen richtig agieren lassen.
Was passiert denn jetzt genau bei dir ?

@Mobi:
Das mit dem DWord hatten wir schon (in einem anderen Thread).
Das hat der TE zunächst nicht verstanden. Deshalb wollte ich jetzt erstmal seinen eigenen Ansatz zum Laufen bringen - und dann, wie ich schon geschrieben habe, zu einer Resourcen-schonenden Variante wechseln.

Gruß
Larry
 
Meine Erfahrung: die meisten SPS-Programme programmieren sich quasi "von selbst", wenn man eine klare Aufgabenstellung formuliert - dann muß die Aufgabenstellung einfach nur noch in Programmcode übersetzt werden. Das ist dann vielleicht nicht die Ressourcen-optimalste tricky-Variante, doch man kommt schnell zu einem allgemein verständlichen Programmm.

Weil LeTobi gerade einen extrem umständlichen Ansatz verfolgt, möchte ich einen anderen einfacheren Lösungsweg vorschlagen.

Aufgabe "Lauflicht"
Man hat eine Lampenkette mit 32 Lampen.
Es soll immer nur 1 Lampe leuchten, zuerst die Erste, dann die Zweite, dann die Dritte... nach der letzten Lampe soll das Ganze wieder von vorne wiederholt werden. Das sind 32 verschiedene Zustände.
Von einem Zustand zum nächsten soll im gleichbleibenden Takt (z.B. alle 700ms) weitergeschaltet werden.

Was brauchen wir nun?
  • einen Taktgenerator, der alle 700ms einen Weiterschalt-Impuls liefert
    --> z.B. ein TON, welcher sich bei Ablauf selbst rücksetzt
    TON_Takt(IN:=NOT bIncPulse, PT:=T#700ms, Q=>bIncPulse)
  • eine Variable, wo drin steht, in welchem der 32 Zustände sich die Lampenkette befindet.
    Bei jedem Weiterschalt-Impuls wird der Zustand in der Variable zum nächsten Zustand weitergeschaltet: 1 - 2 - 3 - 4 - ... 31 - 32 - 1 - 2 - ...
    --> dafür bietet sich ein Zähler an (einfach den Wert der Variable um 1 erhöhen oder fertigen Zählerbaustein benutzen)
    Ist der Zustand (Zählerstand) in der Variable größer als der höchste benötigte Zustand (> 32), dann soll die Variable auf den ersten Zustand gesetzt werden (für Fehlerprüfung und automatisch wiederholen)
    IF bIncPulse THEN iCount := iCount + 1
    IF iCount > 32 OR iCount < 1 THEN iCount := 1
  • für jede Lampe eine Anweisung, in welchem Zustand (Zählerstand) die Lampe leuchten soll
    --> Lampe(x) leuchtet bei Zustand = x
    (dazu nicht mit IF..THEN arbeiten, sondern mit einer Zuweisung!)
    Lampe1 := iCount = 1
    Lampe2 := iCount = 2
    ...
    Lampe32 := iCount = 32

Ggf. Verbessern oder Anpassen:
- statt der Zustände 1..32 mit 0..31 arbeiten, das vereinfacht das Programm (vor allem falls mit einem Zählerbaustein CTU gearbeitet wird). Auch kann man dann MOD statt IF für die automatische Überlauf-Weiterschaltung benutzen.
- braucht man mehr oder weniger Lampen, so ist nur eine Anpassung bei der Überlaufprüfungung nötig.

Harald
 
Meine Erfahrung: die meisten SPS-Programme programmieren sich quasi "von selbst", wenn man eine klare Aufgabenstellung formuliert - dann muß die Aufgabenstellung einfach nur noch in Programmcode übersetzt werden. Das ist dann vielleicht nicht die Ressourcen-optimalste tricky-Variante, doch man kommt schnell zu einem allgemein verständlichen Programmm.

Weil LeTobi gerade einen extrem umständlichen Ansatz verfolgt, möchte ich einen anderen einfacheren Lösungsweg vorschlagen.

Harald

Das ist aber nicht nett :(
Larry wollte den TE doch zu einer funktionierenden Lösung nach seinem eigenen Ansatz verhelfen :(
Und du präsentierst eine (Fast) fertige Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OHO Danke allerseits, den Beitrag von PN/DP ( Harald - trotzdem danke sehr ich werde drauf zurück kommen) werde ich erstmal überlesen^^ werde mich heute abend nochmal an den Ansatz von Larry setzen.

( PS.: sry habe auf der Arbeit nen anderen Acc daher nicht LeTobi. Die brauchen meine privaten Passwörter un Nutzernamen net wissen^^)

Grüße
 
Zuletzt bearbeitet:
so OK, ich musste PN/DP´s (Harald´s) Lösung nun doch mal ausprobieren da sie so einfach aussah^^
Und Ja es funktioniert. Sauber ! Danke PN/DP !

Dennoch möchte ich mich nochmal Larry´s Lösungsweg widmen.
@ Larry: ich hatte das was du rot markiert hattest ausgeklammert. da sonst ünerhaupt nichts geleuchtet hat.
Ich glaube ich habe die Timer und die aus_Timer nicht richtig verknüpft, sprich IN und Q zugewiesen. Das habe ich noch nicht verstanden.

Achso.. und danke für die Mühe die sich hier bisher jeder für mich macht.
Ich bin blutiger Anfänger im thema SPS...hatte nur in der Schule wärend der Ausbildung etwas S7 und jetzt bin ich da ich es beruflich gut gebrauchen kann dabei mich in die Beckhoff ST-Programmierung einzuarbeiten. Hatte auch schon einen 1-Wöchigen Grundkurs bei der Firma Beckhoff und versuche jetzt halt mich selber und auf Arbeit wenn Zeit, weiter zu bilden, sodass ich auf der Arbeit irgendwann meinen Chef unterstützen kann und auch mehr Projekte alleine machen kann.
So das war ein kleiner Einblick in meine Hintergünde^^
 
Zurück
Oben