Step 7 Signalampel blinken lassen

Thesergant

Level-2
Beiträge
25
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich möchte im eine Signalleuchte blinken lassen z.B mit 1 HZ. Jedoch finde ich keine geeigneten Anweisungen bzw. Bausteine dafür. Wie realisiert man sowas?

Ich benutze eine CPU-319 und programmiert wird in Tia

Wäre um jede Hilfe Dankbar
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Frage: Eine Signallampe soll mit einer Frequenz von einem Herz blinken. Bitte schreibe mir ein Programm dazu, für "Structured Text" im TIA-Portal von Siemens.

Bot: Um eine Signallampe mit einer Frequenz von einem Hertz (1 Hz) blinken zu lassen, können wir eine einfache Logik implementieren, die eine Taktvariable nutzt, um den Zustand der Lampe alle 0,5 Sekunden zu ändern. In Structured Text (ST) für das TIA Portal von Siemens könnte das so aussehen:

Code:
PROGRAM BlinkLampe
VAR
    Toggle: BOOL; // Variable zum Umschalten des Lampenzustands
    Timer: TON; // ON-Delay Timer
END_VAR

// Initialisierung des Timers
Timer(IN := NOT Timer.Q, PT := T#500MS);

// Umschalten der Lampe, wenn der Timer abgelaufen ist
IF Timer.Q THEN
    Toggle := NOT Toggle;
END_IF;

// Zuweisung des Toggle-Zustands zur Lampe
// Hierbei ist 'Lampe' die Ausgangsvariable, die die physische Lampe steuert
Lampe := Toggle;
In diesem Programm wird ein TON-Timer verwendet, der mit einer "Preset Time" (PT) von 500 Millisekunden konfiguriert ist. Dies bedeutet, dass der Timer alle 500 Millisekunden (entsprechend einer Frequenz von 1 Hz, da ein vollständiger Ein-Aus-Zyklus 1 Sekunde dauert) seinen Ausgang (Q) aktiviert. Wenn der Timer-Ausgang aktiv ist, wird die Variable Toggle invertiert. Diese Toggle-Variable steuert dann den Zustand der Signallampe (repräsentiert durch die Variable Lampe im letzten Teil des Programms).

Bitte beachte, dass die genaue Implementierung davon abhängen kann, wie die Signallampe im TIA Portal konfiguriert ist und welche physikalischen Adressen oder Tags verwendet werden. Die Variable Lampe muss entsprechend der realen Konfiguration in deinem Projekt ersetzt oder angepasst werden.
--------------------
Der Account ChatGPT ist ein Experiment von @Gerhard Bäurle
Allgemeine Diskussionen über Chatbots bitte nicht hier, sondern im Thread ChatGPT – Diskussion und Experimente
 
Vielleicht hätte man ChatGPT noch mitteilen sollen, dass der Code für eine S7-300 sein soll.
Bei S7-300 Timern darf nicht der Q der Timer direkt verknüpft werden, sondern es muss eine Zwischenvariable (z.B. Merker) dazwischengeschaltet werden. Sonst bleibt der Pulsgenerator irgendwann stehen. Ich weiß jetzt aber nicht, ob das auch für die SFB TON so ist, ich mache es da einfach auch so.

Vielleicht wäre ChatGPT auch drauf gekommen, dass die CPU 319 Taktmerker in der Hardware hat?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich dieses Werkzeug so gut füttere, dass ich das richtige Ergebnis bekomme, kann ich mir die Antwort auch selbst geben. Nur am Rande: ich habe nichts gegen KI.
 
Die erste Aufgabe war ungenau gestellt. UserEine Signallampe soll mit einer Frequenz von einem Herz blinken. Bitte schreibe mir ein Programm dazu, für "Structured Text" im TIA-Porta von Siemens. Das Zielsystem ist eine S7-300, genauer eine CPU 319.

GPT: Für eine S7-300 Steuerung, speziell eine CPU 319, im TIA Portal mit Siemens S7-300, können wir eine einfache Blinklogik in Structured Text (ST) implementieren, die eine Signallampe mit einer Frequenz von einem Hertz blinken lässt. Dabei nutzen wir die systemeigene Zeitfunktion, um den Zustand der Lampe alle 0,5 Sekunden umzuschalten. Hier ist ein Beispiel, wie solch ein Programm in Structured Text aussehen könnte:

Code:
PROGRAM BlinkLampe
VAR
    LampState: BOOL := FALSE; // Zustand der Lampe (An/Aus)
    BlinkTimer: TIME := T#0S; // Timer für das Blinken
END_VAR

// Hauptprogrammlogik
IF BlinkTimer >= T#500MS THEN
    LampState := NOT LampState; // Zustand der Lampe umschalten
    BlinkTimer := T#0S; // Timer zurücksetzen
ELSE
    BlinkTimer := BlinkTimer + T#10MS; // Timer inkrementieren
END_IF;

// Zuweisung des Lampenstatus zu einem Ausgang
// Beispiel: Ausgang Q0.0 steuert die physische Lampe
// Diese Zeile muss entsprechend der realen Hardware-Konfiguration angepasst werden.
"Q0.0" := LampState;

Erklärung:​

  • LampState: Eine boolesche Variable, die den aktuellen Zustand der Lampe speichert (ein oder aus).
  • BlinkTimer: Eine Timer-Variable, die verwendet wird, um die Zeit zwischen den Zustandsänderungen der Lampe zu messen.
  • Hauptprogrammlogik: Überprüft, ob der Timer BlinkTimer 500 Millisekunden (die Hälfte eines Sekundenzyklus für 1 Hz) erreicht hat. Wenn ja, wird der Zustand der Lampe umgeschaltet und der Timer zurückgesetzt. Andernfalls wird der Timer inkrementell erhöht.

Wichtige Hinweise:​

  • Zeitinkrementierung: Der Timer wird hier in Schritten von 10 Millisekunden inkrementiert. Dieser Wert kann je nach Ausführungszykluszeit der SPS variieren und sollte angepasst werden, um eine präzise Zeitsteuerung zu erreichen.
  • Physischer Ausgang: Der Kommentar "Q0.0" := LampState; zeigt, wie man den Zustand der Lampe einem physischen Ausgang zuweist. "Q0.0" ist ein Platzhalter und muss durch die tatsächliche Adresse des Ausgangs ersetzt werden, der die Lampe steuert. Die genaue Adressierung hängt von der Hardware-Konfiguration und der Zuweisung in deinem TIA-Projekt ab.
Bitte stelle sicher, dass du die realen Adressen und Hardware-Konfigurationen in deinem TIA-Projekt entsprechend anpasst, um dieses Beispiel zu nutzen.

--------------------
Der Account ChatGPT ist ein Experiment von @Gerhard Bäurle
Allgemeine Diskussionen über Chatbots bitte nicht hier, sondern im Thread ChatGPT – Diskussion und Experimente
 
Wenn ich dieses Werkzeug so gut füttere, dass ich das richtige Ergebnis bekomme, kann ich mir die Antwort auch selbst geben.
Da bin ich nicht bei Dir. Aber wer nicht in etwa weiß, was das Ergebnis sein soll, tut sich mit dem Überprüfen schwer.

Und wie schwierig es ist, eine Aufgabe richtig und vollständig zu stellen, sehen wir im Forum ja immer wieder. Der menschliche User fragt nach den fehlenden Umgebungsbedingungen, der Bot nimmt die Glaskugel.

Nur am Rande: ich habe nichts gegen KI.
Alles gut. Hier solle es um Möglichkeiten und Grenzen gehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bitte schreibe mir ein Programm dazu, für "Structured Text" im TIA-Porta von Siemens. Das Zielsystem ist eine S7-300, genauer eine CPU 319.

GPT: Für eine S7-300 Steuerung, speziell eine CPU 319, im TIA Portal mit Siemens S7-300 (...) Hier ist ein Beispiel, wie solch ein Programm in Structured Text aussehen könnte:

[CODE]PROGRAM BlinkLampe[/CODE]
Da hast du ChatGPT aber aufs Glatteis geführt... ;) Weiß ChatGPT nicht, dass das TIA Portal von Siemens "Structured Text" und einige Schlüsselwörter von "Structured Text" gar nicht versteht?
 
Und wie schwierig es ist, eine Aufgabe richtig und vollständig zu stellen, sehen wir im Forum ja immer wieder. Der menschliche User fragt nach den fehlenden Umgebungsbedingungen, der Bot nimmt die Glaskugel.
Und deswegen bin ich mir sehr sicher, dass der Job des Programmierenden in Zukunft sicher davor ist, von KI ersetzt zu werden. Damit das zuverlässig funktioniert, müssten KundInnen die Anforderungen ja konsequent und konkret stellen :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Code:
PROGRAM BlinkLampe
VAR
    Toggle: BOOL; // Variable zum Umschalten des Lampenzustands
    Timer: TON; // ON-Delay Timer
END_VAR

// Initialisierung des Timers
Timer(IN := NOT Timer.Q, PT := T#500MS);

// Umschalten der Lampe, wenn der Timer abgelaufen ist
IF Timer.Q THEN
    Toggle := NOT Toggle;
END_IF;

// Zuweisung des Toggle-Zustands zur Lampe
// Hierbei ist 'Lampe' die Ausgangsvariable, die die physische Lampe steuert
Lampe := Toggle;
...
ChatGPT scheint nicht im SPS-Forum zu lesen, sonst hätte es statt ...
Code:
IF Timer.Q THEN
    Toggle := NOT Toggle;
END_IF;
... ohne IF ...
Code:
Toggle := Timer.Q XOR Toggle;
... geschrieben?
Bei S7-300 Timern darf nicht der Q der Timer direkt verknüpft werden, sondern es muss eine Zwischenvariable (z.B. Merker) dazwischengeschaltet werden. Sonst bleibt der Pulsgenerator irgendwann stehen. Ich weiß jetzt aber nicht, ob das auch für die SFB TON so ist, ich mache es da einfach auch so.
Ich denke mal, dass man auf das "irgendwann stehenbleiben des PulsGenerators" nicht so lange warten muss.
Die gezeigte Reihenfolge ....
1. den Timer neu starten, wenn er denn abgelaufen ist und
2. dann erst das Bit togglen, wenn denn Timer.Q trotzdem noch TRUE sein sollte
... na ja, die Hoffnung stirbt angeblich zuletzt. ;)
Ich würde auf jeden Fall die Reihenfolge umkehren ...
Code:
PROGRAM BlinkLampe
VAR
    Toggle: BOOL; // Variable zum Umschalten des Lampenzustands
    Timer: TON; // ON-Delay Timer
END_VAR

// Umschalten der Lampe, wenn der Timer abgelaufen ist
Toggle := Timer.Q XOR Toggle;

// Starten des Timers
Timer(IN := NOT Timer.Q, PT := T#500MS);

// Zuweisung des Toggle-Zustands zur Lampe
// Hierbei ist 'Lampe' die Ausgangsvariable, die die physische Lampe steuert
Lampe := Toggle;
... und dann erwarten, dass es wunschgemäss auch bei S7-300 Timern läuft, wenn der Q direkt verknüpft wird, statt für ihn eine Zwischenvariable zu spendieren?
 
Bei S7-300 Timern darf nicht der Q der Timer direkt verknüpft werden, sondern es muss eine Zwischenvariable (z.B. Merker) dazwischengeschaltet werden. Sonst bleibt der Pulsgenerator irgendwann stehen.
Das war wohl falsch ausgedrückt... auf jeden Fall führt die direkte Rückkopplung zu Fehlfunktionen, die ich nicht mehr ganz genau weiß, weil ich diesen Fehler nie mache :cool:

Ich würde auf jeden Fall die Reihenfolge umkehren ...
(...)
... und dann erwarten, dass es wunschgemäss auch bei S7-300 Timern läuft, wenn der Q direkt verknüpft wird, statt für ihn eine Zwischenvariable zu spendieren?
Das Problem ist: wenn der Timer sich mit seinem eigenen Timer.Q als Eingangsparameter neu startet, dass dadurch der Timer.Q auch resettet wird und nach dem Timer-Aufruf Timer.Q nicht mehr TRUE ist und die nachfolgenden Verknüpfungen Timer.Q = TRUE nicht mitbekommen (bzw. nur ganz selten, wenn der Timer genau nach dem Timer-Aufruf abläuft). Daher braucht man eine merkfähige Zwischenvariable, die sich den Zustand des Q für den ganzen Zyklus merkt und stellvertretend abgefragt werden kann. PS: und das Reset des Timers um einen Zyklus verzögert

Wenn man erst Timer.Q verarbeitet und danach den Timer aufruft, dann kann es auch passieren, dass genau dazwischen der Timer abläuft und nur der Timer das Timer.Q = TRUE mitbekommt.

ChatGPT scheint nicht im SPS-Forum zu lesen, sonst hätte es statt ...
Ich hoffe, ChatGPT wird nun in Zukunft seine Vorschläge ändern oder zumindest ergänzen durch den Hnweis "Im SPS-forum.de hat der User @PN/DP aber geschrieben, dass man das nicht so machen soll." ;)
 
Zuletzt bearbeitet:
Falls ChatGPT hier doch mitliest: ;)
Bot: (...)

Code:
PROGRAM BlinkLampe
(...)
// Initialisierung des Timers
Timer(IN := NOT Timer.Q, PT := T#500MS);

// Umschalten der Lampe, wenn der Timer abgelaufen ist
IF Timer.Q THEN
Irgendwie hat ChatGPT wohl wirklich kaum Ahnung von (Siemens-)SPS-Programmierung, und möglicherweise funktioniert das vorgeschlagene Programm auch gar nicht.
- der Kommentar "Initialisierung..." vor dem Timer-Aufruf ist falsch oder zumindest irreführend
- die direkte Verknüpfung des Timer.Q auf den Timer-Eingang IN und die nachfolgende Verknüpfung des Timer.Q funktioniert so nicht (siehe vorigen Beitrag #16)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, um mal zum Ursprung zurückzukehren: Einfacher (übersichtlicher), als die von @PN/DP vorgeschlagene Variante, geht es nun wirklich nicht. Da braucht es nun wirklich keine künstliche Intelligenz, da die menschliche (oder im Fall von Harald, übermenschliche :)) hier völlig ausreicht.
 
Da braucht es nun wirklich keine künstliche Intelligenz, da die menschliche (oder im Fall von Harald, übermenschliche :)) hier völlig ausreicht.
Was Harald hier im Forum leistet, ist wirklich übermenschlich. Aber eigentlich sollte die menschliche Intelligenz völlig ausreichen, um die obige Aufgabe zu lösen. ;)
 
Das war wohl falsch ausgedrückt... auf jeden Fall führt die direkte Rückkopplung zu Fehlfunktionen, die ich nicht mehr ganz genau weiß, weil ich diesen Fehler nie mache :cool:


 
Zurück
Oben