-Menü

Beiträge anzeigen

Dieser Abschnitt erlaubt es Ihnen, alle Beiträge anzusehen, die von diesem Mitglied geschrieben wurden. Beachten Sie, dass Sie nur Beiträge sehen können, die in Teilen des Forums geschrieben wurden, auf die Sie aktuell Zugriff haben.

Beiträge anzeigen-Menü

Beiträge - tugsi

#1
Hallo,

ich habe die unterschiedlichen Blind-Module endlich mal zusammengepackt und mir quasi einen FB gebastelt, damit ich nicht immer mit sovielen DBs arbeiten muss.

Und während der letzten schönen Tagen ist mir eine leichte Unstimmigkeit beim Shade-Modul aufgefallen.

Wenn die Rollade nun unten ist zum beschatten und der Sonneneingang geht weg, dann läuft der Timer ab für "topen_delay".
Sollte die Sonne wiederkommen, fängt der Timer für "tshade_delay" an zu laufen.
Soweit so gut, nur ich hatte das Phänomen, dass ich hier im Wohnzimmer saß und sah, wie die Rollade hochgefahren wurde und kaum war sie oben, fuhr sie auch wieder runter.

Warum?
Die Sonne kommt, Einschaltverzögert fährt das Rollo runter.
tshade_delay.Q wird auf 1 gesetzt und somit auch topen_delay.IN und topen_delay.Q ebenso auf 1.

Wenn die Sonne weggeht, wird tshade_delay.Q auf 0 gesetzt und auch topen_delay.IN, somit läuft die Zeit für das hochfahren runter.
Kommt die Sonne wieder wird tshade_delay.IN auf 1 gesetzt und die Zeit für das runterfahren wird angestossen.
Und genau hier passiert der "Bug".
Die Zeit für das hochfahren wird nicht angehalten, sondern läuft munter weiter, erst wenn tshade_delay.Q gesetzt wird, würde sie angehalten werden.
Also kann es passieren, wenn die öffnen zeit eher kommt als die wieder beschatten bitte, dass erst das Rollo hochgefahren wird und dann relativ schnell wieder runter.

Ich habe dies umgangen, indem ich im SCL-Code beim öffnen weitere Bedingungen mit eingebaut habe, bevor die Zeit läuft.
Zum einen muss der topen_delay.IN auf 0 gehen (wie bisher), aber gleichzeitig sage ich ODER Sonne und topen_delay.Q zusammen dürfen nicht 1 sein.
Zweiteres sagt nichts anderes aus wie, ich beschatte gerade (also Rollo unten) und es kommt wieder Sonne. Somit wird der Eingang des TOF wieder auf 1 gesetzt und der Timer unterbrochen :-)

Als Code sieht es dann so aus und das bitte austauschen wer es möchte:


tshade_delay(IN := sun, PT := shade_delay);
topen_delay(IN := tshade_delay.Q OR (sun AND topen_delay.Q), PT := open_delay);


#2
oscat.lib fuer Step 7 / Re: Calendar_Calc
15. August 2016, 21:51:36
Hallo dauty,
gib bitte mal ein paar mehr Infos.
Welche S7 benutzt Du und welche Fehlermeldung erhälst Du?

Ich habe die Calendar_Calc in einer S7-300 am Laufen.
#3
Ich war schon lange nicht mehr Online hier, weil mein Projekt im "Provisorium" ja gut lief, aber ich nun mal so langsam das Ein oder Andere ändern bzw anpassen möchte.
Das Problem mit dem DST hatte ich auch immer und es nervte, aber es war ja nur an 2 Tagen im Jahr, konnte also damit bisher leben.

Ich schaue mir das mal an und werde es mal einbinden.
Klingt gut.

Danke dafür!
#4
Doch noch ein Fehler drin :)
Eben noch geschrieben, dass Stop ja Vorrang hat, hab ich das beim Sunset und Sunrise nicht richtig sortiert ;)

ELSIF T_DAY_STOP > TOD#00:00:0.0 AND tdx - T_DAY_STOP >= tc THEN
    (* turn off at specific daytime *)
    qx := FALSE;
    status := 112;
ELSIF T_day_start > TOD#00:00:0.0 AND tdx - T_DAY_START >= tc THEN
    (* turn on at specified daytime *)
    qx := TRUE;
    status := 111;
ELSIF T_SET_STOP > t#0s AND tdx - SUN_SET - T_SET_STOP >= tc THEN
    (* turn off after sunset *)
    qx := FALSE;
    status := 116;
ELSIF T_SET_start > T#0s AND tdx - SUN_SET + T_SET_START >= tc THEN
    (* turn on before sunset *)
    qx := TRUE;
    status := 115;
ELSIF T_RISE_STOP > T#0s AND tdx - SUN_RISE - T_RISE_STOP >= tc THEN
    (* turn off after sunrise *)
    qx := FALSE;
    status := 114;
ELSIF T_RISE_START > T#0s AND tdx - SUN_RISE + T_RISE_START >= tc THEN
    (* turn on before sunrise *)
    qx := TRUE;
    status := 113;
END_IF;

#5
oscat.lib fuer Step 7 / Timer_EXT wirklich korrekt?
24. Dezember 2013, 17:42:32
Hallo,
wollte mal den Timer-Ext einbauen und hab mal etwas mit den Zeiten gespielt, aber irgendwie schaltet der das nicht so ein wie ich möchte bzw auch nicht aus.
Wollte eigentlich mit dem Sonnenuntergang einschalten und um 23h ausschalten.
Also Sunset mit dem Calender eingebunden, dann T_SET_START auf 1s gestellt, damit der auch genommen wird. T_DAY_STOP hab ich auf 23h gestellt. Aber irgendwie geht da nichts wie es soll ;)

Hab mir gerade auch mal den SCL-Code angeschaut, da kommen mir ein paar Fragen auf.

Ich habe jetzt mal T_DAY_STOP beschaltet, wenn ich nur die Zeile sehe:
ELSIF T_DAY_STOP > TOD#00:00:0.0 AND tdx - T_DAY_STOP <= tc THEN
    (* turn off at specific daytime *)
    qx := FALSE;
    status := 112;

Dann ist doch die erste BEdingung auf jedenfall gewährleistet, da größer als 0.
tdx ist ja die aktuelle Uhrzeit, dies minus der Ausschaltzeit heisst ja, solange die Ausschaltzeit nicht erreicht ist, bin ich immer kleiner gleich tc (200ms Zykluszeit).
Müsste da nicht ein >= stehen?

Ich hab den Block mal etwas verändert.
Es ist ja eine ELSIF-Schleife, also immer wieder Bedingung erfüllt ja oder nein, bei ja zum Ende, bei nein nächste Bedingung.
Also habe ich die Ausschaltebedingungen priorisiert, vor den Einschaltbedingungen, dann mein >= noch rein und siehe da, der Baustein macht das was er soll.
Ich beschalte zum Beispiel mein Sunset und T_SET_START (1s), den T_SET_STOP (4h), T_DAY_STOP (23:00Uhr).
Alles andere immer mit 0 belegen als Zeiten.

Jetzt geht das Licht 1 Sekunde (T_SET_START) nach Sonnenuntergang (SUNSET) an.
Das Licht geht aus, wenn einer der beiden Bedingungen erfüllt ist, also entweder 23Uhr (T_DAY_STOP) oder eben 4 Stunden nach Sonnenuntergang (T_SET_STOP).  - Ist nur ein Beispiel-

Hier der geänderte Codeschnippsel:
ELSIF T_DAY_STOP > TOD#00:00:0.0 AND tdx - T_DAY_STOP >= tc THEN
    (* turn off at specific daytime *)
    qx := FALSE;
    status := 112;
ELSIF T_day_start > TOD#00:00:0.0 AND tdx - T_DAY_START >= tc THEN
    (* turn on at specified daytime *)
    qx := TRUE;
    status := 111;
ELSIF T_SET_start > T#0s AND tdx - SUN_SET + T_SET_START >= tc THEN
    (* turn on before sunset *)
    qx := TRUE;
    status := 115;
ELSIF T_SET_STOP > t#0s AND tdx - SUN_SET - T_SET_STOP >= tc THEN
    (* turn off after sunset *)
    qx := FALSE;
    status := 116;
ELSIF T_RISE_START > T#0s AND tdx - SUN_RISE + T_RISE_START >= tc THEN
    (* turn on before sunrise *)
    qx := TRUE;
    status := 113;
ELSIF T_RISE_STOP > T#0s AND tdx - SUN_RISE - T_RISE_STOP >= tc THEN
    (* turn off after sunrise *)
    qx := FALSE;
    status := 114;
END_IF;


Gruß
Thomas
#6
Besteht da noch ein Bedarf?
#7
Hallo,

seit einiger Zeit lese ich hier mit und jetzt, da mein Umbau größtenteils erledigt ist, kann ich mich an die Programmierung setzen.
Leider habe ich nicht immer die Zeit um all meine Ideen umzusetzen, daher bin ich ja froh, dass es so eine Bibliothek wie Oscat gibt.

Dafür erstmal ein Lob! :)

Jetzt das große ABER ... ;)
Kann es sein, dass die S7 hier doch sehr stiefmütterlich behandelt wird?
Habe schon das Ein oder Andere eingebunden und musste feststellen, nicht alles läuft glatt, es kommen immer Komplikationen.
Nehmen wir zB mal die CALENDER-Funktion, finde ich ganz nett, aber warum ist noch niemanden aufgefallen, dass in der SCL Berechnungen für die Variable night falsch sind, nicht xCal, sondern txCal etc. muss man verwenden, damit es funktioniert.
txcal.NIGHT := tXCAL.LTOD < tXCAL.SUN_RISE OR tXCAL.LTOD > tXCAL.SUN_SET;


Dann ärgere ich mich mit dem Blind-Nights, zusammen mit Input und Control rum, Rollade fahren runter, aber nicht mehr rauf.
Ja dazu gibt es einige Fragen, aber halt auch vieles im  Bereich CodeSys.

Jetzt gerade aktuell bin ich am Timer_Ext, funktioniert auch nicht so wie er soll. Im S7-Bereich hat auch jemand mal was dazu gepostet, die Hilfe die kam hat auch bei mir hier nicht funktioniert.
Der Taster wird einfach nicht richtig benutzt, der Switch-Eingang muss dauerhaft wohl 1 sein, damit hinten das Licht ausgeht.
Aber ich bin leider nicht so fit in SCL, dazu bräuchte ich mehr Zeit, leider :( .

Wer ist denn hier noch aktiv dabei?
Gibt es mal Updates für die Fehler?
Gibt es Leute, die schon Fehler entdeckt haben, diese aber hier noch nicht gepostet haben?

Sorry, aber wollte mal meinen Unmut äußern :) Wenn man hier sitzt und programmiert/bastelt und irgendwie will nichts und man versteht den Baustein nicht, dann verzweifelt man auch mal kurz vor Weihnachten :D
Aber bitte nicht persönlich nehmen!!

Gruß
Thomas
#8
Hallo,

ich gebe mir hier mal selbst die Antwort :)

Nachdem ich erst jetzt wieder Zeit hatte, darüber mal zu schauen und im SCL-Syntax eigentlich kein Problem sah, hab ich einfach nochmal den FB und dazugehörigen DB gelöscht und das neu einegstellt und siehe da, es funktioniert  ;D

Schätze habe den DB noch auf alt gehabt, da ich erst die Originale SWITCH_X mit 6 Tastern getestet hatte.

Tja, manchmal liegt die Lösung so nah :)

Gruß
Thomas
#9
Hallo,
ich versuche mich gerade in einer Hausautomatisierung und habe dabei hier die OSCAT-Bibliothek entdeckt, eine feine Sache.

Ich habe hier eine Beckhoff von IBH-Softec stehen, auf der ein Step7 draufgeflanscht wurde.
Hintergrund, CodeSys hab ich noch nie programmiert, S5 und S7 haben wir auf der Arbeit und kann/kenn ich wenigstens ein wenig :)

Jetzt aber zu meiner Frage:
Hab hier von Jung den 8-fach-Taster und dazu Euren Switch_X, der ist aber nur mit 6 Tastern belegt.
OK dachte ich, dann mach doch einfach zwei hinzu :-)
Gesagt getan, Step7 und den SCL-Editor aufgerufen und eingepflegt, übersetzt und zack... shit SPS geht direkt in Stop :(

Wo habe ich einen Denkfehler, das übersetzen gibt keine Fehlermeldung aus.

FUNCTION_BLOCK SWITCH_X
TITLE = 'SWITCH_X'
//
VERSION : '1.0'
AUTHOR  : oscat
NAME    : SWITCHX
FAMILY  : ELECT

VAR_INPUT
    IN1 : BOOL;
    IN2 : BOOL;
    IN3 : BOOL;
    IN4 : BOOL;
    IN5 : BOOL;
    IN6 : BOOL;
    IN7 : BOOL;
    IN8 : BOOL;
END_VAR
VAR_OUTPUT
    Q1 : BOOL;
    Q2 : BOOL;
    Q3 : BOOL;
    Q4 : BOOL;
    Q5 : BOOL;
    Q6 : BOOL;
    Q7 : BOOL;
    Q8 : BOOL;
    Q31 : BOOL;
    Q41 : BOOL;
    Q51 : BOOL;
    Q61 : BOOL;
    Q71 : BOOL;
    Q81 : BOOL;
    Q32 : BOOL;
    Q42 : BOOL;
    Q52 : BOOL;
    Q62 : BOOL;
    Q72 : BOOL;
    Q82 : BOOL;
END_VAR
VAR_INPUT
    t_debounce : TIME := t#50ms;
END_VAR
VAR
    init : BOOL;
    T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8 : TOF;
    tx: TIME;
    x1: BOOL;
    x2: BOOL;
    E1, E2 : BOOL;
END_VAR

BEGIN

  (* initialize on startup *)
  IF NOT init THEN
      init := TRUE;
      IF t_debounce < t#50ms THEN tx := t#50ms; ELSE tx := t_debounce; END_IF;
      T_1(PT := Tx);
      T_2(PT := Tx);
      T_3(PT := Tx);
      T_4(PT := Tx);
      T_5(PT := Tx);
      T_6(PT := Tx);
      T_7(PT := Tx);
      T_8(PT := Tx);

  ELSE
      Q1 := FALSE;
      Q2 := FALSE;
      Q3 := FALSE;
      Q4 := FALSE;
      Q5 := FALSE;
      Q6 := FALSE;
      Q7 := FALSE;
      Q8 := FALSE;
      Q31 := FALSE;
      Q41 := FALSE;
      Q51 := FALSE;
      Q61 := FALSE;
      Q71 := FALSE;
      Q81 := FALSE;
      Q32 := FALSE;
      Q42 := FALSE;
      Q52 := FALSE;
      Q62 := FALSE;
      Q72 := FALSE;
      Q82 := FALSE;
  END_IF;
 
  (* read inputs and debounce *)
      T_1(IN := IN1);
      T_2(IN := IN2);
      T_3(IN := IN3);
      T_4(IN := IN4);
      T_5(IN := IN5);
      T_6(IN := IN6);
      T_7(IN := IN7);
      T_8(IN := IN8);       
  (* detect edge of IN1 and IN2 *)
  IF t_1.Q AND NOT E1 THEN X1 := TRUE; END_IF;
  IF t_2.Q AND NOT E2 THEN X2 := TRUE; END_IF;
 
  IF t_1.Q THEN
      IF t_3.q THEN
          q31 := TRUE;
          X1 := FALSE;
      ELSIF t_4.q THEN
          q41 := TRUE;
          X1 := FALSE;
      ELSIF t_5.q THEN
          q51 := TRUE;
          X1 := FALSE;
      ELSIF t_6.q THEN
          q61 := TRUE;
          X1 := FALSE;
      ELSIF t_7.q THEN
          q71 := TRUE;
          X1 := FALSE;
      ELSIF t_8.q THEN
          q81 := TRUE;
          X1 := FALSE;
      END_IF;
  ELSIF t_2.Q THEN
      IF t_3.q THEN
          q32 := TRUE;
          X2 := FALSE;
      ELSIF t_4.q THEN
          q42 := TRUE;
          X2 := FALSE;
      ELSIF t_5.q THEN
          q52 := TRUE;
          X2 := FALSE;
      ELSIF t_6.q THEN
          q62 := TRUE;
          X2 := FALSE;
      ELSIF t_7.q THEN
          q72 := TRUE;
          X2 := FALSE;
      ELSIF t_8.q THEN
          q82 := TRUE;
          X2 := FALSE;
      END_IF;
  (* in1 was active alone *)
  ELSIF NOT T_1.Q AND E1 AND X1 THEN
      Q1 := TRUE;
      X1 := FALSE;
  ELSIF NOT T_2.Q AND E2 AND X2 THEN
      Q2 := TRUE;
      X2 := FALSE;
  ELSIF T_3.Q THEN
      Q3 := TRUE;
  ELSIF T_4.Q THEN
      Q4 := TRUE;
  ELSIF T_5.Q THEN
      Q5 := TRUE;
  ELSIF T_6.Q THEN
      Q6 := TRUE;
  ELSIF T_7.Q THEN
      Q7 := TRUE;
  ELSIF T_8.Q THEN
      Q8 := TRUE;
  END_IF;
 
  (* save state of in1 and in2 *)
  E1 := T_1.Q;
  E2 := T_2.Q;
 
END_FUNCTION_BLOCK



Vielen Dank
Gruß
Thomas