Quellcode für Stromstoßschalter gesucht

spshugo

Level-1
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Ich arbeite mich gerade in Codesys ein und hab auch schon verschiedenes mit einem Wago Starterkit zum laufen gebracht. Ziel ist eine Haussteuerung.
Die Wago Gebäude lib habe ich auch gefunden. In meinem Projekt wird es einige Stromstoßschalter geben, das ist die Hauptanwendung der Steuerung.
Daher wäre es schön wenn ich nicht für alle einzeln einen Zweig mit jeweils einem einzelnen Stromstoßschalter Baustein anlegen müsste. Meine Idee ist, ich schreibe mir Code der in einer Schleife alle Stromstoßfunktionen durchläuft. Ist ja immer das selbe, nur mit anderen Eingängen und Ausgängen und ein paar Merkern. Was man sich merken muss kann in ein Array, also aktueller Status, Zeit für Entprellen usw. Dann hätte ich das alles schön kompakt.
(könnte natürlich auch viele fertige Bausteine in einer Schleife nutzen aber das gefällt mir nicht so gut)

Dazu suche ich Quellcode für einen möglichst durchdachten und robusten Stromstoßschalter Baustein, den ich in meine Idee einarbeiten kann. Wo suche ich da am besten? Eigentlich ists ja nichts was man sich nicht auch selber herleiten könnte aber man denkt ja doch nicht an alles.

Oder hat jemand eine ganz andere Idee für mein Vorhaben?


Noch etwas, ist es empfehlenswert und gängige Praxis sich die Ein/Ausgänge in der Konfiguration nach der Position in der Karte zu benennen (IN_1_4) und dann die Werte in globale Variablen mit der Funktion umzuschreiben (Wohnzimmer_Schalter1) oder nennt man das lieber gleich in der Konfiguration so?
Letzteres wäre einfacher zu ändern, da man sich einige Klickerei spart.
 
Den Stromstoßschalter kann man sich einfach selbst erstellen.
Eine schöne Anleitung für die Sprachen FUP, KOP und AWL findest Du in der FAQ.

Das Grundprinzip lässt sich auch einfach auf andere Sprachen wie z.B. ST übertragen.


PS: Was der FAQ fehlt, sind noch Zentraleingänge.
Für's zentrale EIN einfach noch ein ODER dem XOR und für's zentrale AUS ein UND folgen lassen. Je nachdem, welches von beiden später eingefügt ist, hat dieses Vorrang.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok das war simpel :)
Jetzt such ich noch eine Einschaltverzögerung um die da rein zu bauen. Seltsam dass man wirklich kein einziges Beispiel findet das sowas zeigt, alle verweisen immer nur auf die fertigen Blöcke. Die kann ich aber nicht nutzen weil ich ja die internen Merker selber verwalten will.
Wo krieg ich denn ein brauchbares Beispiel her das ähnlich TON aufgebaut ist?
 
Also wenn Du das Fahrrad neu erfinden möchtest: Du merkst Dir die Systemzeit, zu der die auslösende Flanke kam in Deinem selbst verwalteten Merker. Dann wartest Du auf Systime+ Verzögerung und setzt den selbst verwalteten Merker für abgelaufene Zeit.

Ich würde allerdings TON sooft instanzieren, wie ich es brauche. Ich bin aber auch überaus bequem ;)
 
Ja oft instantieren würde eigentlich auch in einem Array gehen. Mach ich vielleicht wirklich. Wahrscheinlich wäre es auch kein Schaden 80 mal einen fertigen Stromstoßschalter Baustein reinzupacken. Aber man will ja auch was lernen.
Ich hab hier was gecodet, wer mag kann es sich ansehen und mir Tips geben wie mans nicht macht und wie stattdessen :)

Leider stoß ich grad auf den Umstand dass in der Simulation die Systemzeit nicht gesetzt ist. Und TIME() hat einen Überlauf was auch wieder einiges an Aufwand erfordert. Aber für den Anfang egal.

Code:
FUNCTION_BLOCK StromstossTest
VAR_INPUT
    toggle: BOOL;
    on: BOOL;
    off: BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
    togglemerker: BOOL := FALSE;
    done: BOOL := FALSE;
    outsoll: BOOL := FALSE;
    outmerker: BOOL := FALSE;
    startzeit: TIME;
    jetzt: TIME;
END_VAR

jetzt := TIME(); (*SysRtcGetTime(TRUE);*)

(* nichts verändert, nichts gedrückt => nichts zu tun *)
IF (NOT ((togglemerker <> toggle) OR toggle OR on OR off)) THEN
  RETURN;
END_IF

(* Positive Flanke bei toggle startet die Zeit, erst wenn die vergangen ist passiert die Umschaltung. *)
IF toggle THEN
  IF NOT togglemerker THEN
    done := FALSE;
    startzeit := jetzt;
  END_IF;
END_IF;

togglemerker := toggle;

(* toggle lange genug gedrückt? Dann umschalten. *)
IF toggle AND (NOT done) AND (jetzt - startzeit >= T#30ms) THEN
  outsoll := NOT outmerker;
  done := TRUE;
END_IF;

(* Vorgaben für ein/aus berücksichtigen. *)
outsoll := (outsoll OR on) AND (NOT off);

IF outsoll <> outmerker THEN
  outmerker := outsoll;
END_IF

Die Merkervariablen stelle ich mir später in einem Array vor, so dass eine Schleife alles auf einmal abarbeiten kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schon irgendwie krass, was man aus einer Flanke und einen XOR für einen Aufwand machen kann ...
Was soll der Timer eigentlich für einen (tieferen) Sinn haben?
 
Der Timer soll entprellen.
Heute ist Feiertag, ich hab Zeit, Bausteine aneinander hängen kann ich inzwischen... da ist eben Zeit für neues :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Macht es nicht mehr Sinn einen Baustein zu erstellen (wenn du schon so einen Aufwand betreiben möchtest) diesen dann für jeden Eingang als Entprellung auf rufen ?
So hältst du dir deinen SSL etwas sauberer und hast deinen eigenen Entpreller auch gleich für andere Anwendungen.
 
In meinen Versuchen mit nur einem Eingang hab ich den TON als Entpreller verwendet und an den Stromstoßschalter Baustein gepackt. Einen eigenen Entpreller hatte ich nicht geplant. Was ich da gebastelt habe soll das gleiche tun wie TON. Nur eben in Kombination mit der Relaisfunktion in einem.

Ich werde 80 oder auch 90 Eingänge haben die ich entprellen sollte, die meisten davon haben die Funktion eines Stromstoßschalters. Deswegen die Idee das alles in einen Codeblock mit Schleife zu packen statt 90 x TON und 90 x Stromstoßschalter Bausteine einzusetzen. Ist vielleicht weniger Aufwand wenn das zig mal pro Sekunde durchgerattert wird, dachte ich.

Erfahrung hab ich halt überhaupt keine. Wenn ihr mir sagt das ist Blödsinn, 200 Bausteinchen haben oder nicht wär überhaupt nicht schlimm... dann mach ich das so. Ich muss nicht unbedingt was eigenes haben nur damits sonst keiner versteht...
 
Zurück
Oben