Blinklicht ohne timer

duMMbatz

Level-1
Beiträge
128
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi , Leute bekomm es gerade nicht hin und in der Suchfunktioin find ich nix passendes.

Ich habe vor mir einen FB zu basteln der einen eingang zum einschalten hat, dem ich per dm oder ähnlich sollzeiten geben kann und der dann intern einne art blinklicht erzeugt.
Also der Ausgang soll dann für Zeit1 eingeschaltet sein und für Zeit2 ausgeschaltet sein und dann solange abwechseln bis das eingangssignal vom anfang auf 0 geht.

Hat da wer von euch schonmal was gebastelt und mit SUB Fuktionen oder ähnlichem und ohne einsatz von Timern realiesiert?
:ROFLMAO: :ROFLMAO: :ROFLMAO:

Wer kann helfen?
 
Für die Siemens-SPS kann in der Hardwarekonfig ein Taktmerkerbyte konfiguriert werden. Aus diesem kannst du z.Bsp. den 100ms-Takt benutzen (irgendeine Zeitbasis brauchst du schließlich). Dann nimmst du ein Merker-/Datenword und schreibst dort deine Sollzeit rein. Für 1 Sekunde = 10 100ms- Impulse. Bei jedem Impuls zählst du das Merkerwort herunter, wenn es Null ist, ist die eingestellte Zeit um, du kannst den Ausgang setzen. Merkerwort wieder mit Sollzeit laden, runterzählen, wenn Null, Ausgang abschalten, usw., usw.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Wer kann helfen?

Du Dir selbst:ROFLMAO:

So könnte das ganze aussehen:
Code:
FUNCTION_BLOCK FB12

VAR_INPUT
  IN          :BOOL;  (* Start Signal *)
  Time1       :TIME;  (* Einschaltdauer *)
  Time2       :TIME;  (* Ausschaltdauer *)  
  OB1PreCycle :INT;   (* Dauer des letzten OB1 Zyklus *)
END_VAR

VAR_OUTPUT
  Q           :BOOL;  (* Ausgang *)
END_VAR

VAR
  ET          :TIME;  (* Abgelaufene Zeit *)
END_VAR

IF IN THEN  
  ET := ET + DINT_TO_TIME(OB1PreCycle);
  Q := ET < Time1;
  IF ET >= (Time1 + Time2) THEN
    ET := t#0s;
  END_IF;
ELSE
  Q := FALSE;
  ET := t#0s;
END_IF;
END_FUNCTION_BLOCK
Ein FC würde da ja auch reichen:
Code:
FUNCTION FC12:VOID
VAR_INPUT
  IN          :BOOL;  (* Start Signal *)
  Time1       :TIME;  (* Einschaltdauer *)
  Time2       :TIME;  (* Ausschaltdauer *)  
  OB1PreCycle :INT;   (* Dauer des letzten OB1 Zyklus *)
END_VAR

VAR_OUTPUT
  Q           :BOOL;  (* Ausgang *)
END_VAR

VAR_IN_OUT
  ET          :TIME;  (* Abgelaufene Zeit *)
END_VAR

IF IN THEN  
  ET := ET + DINT_TO_TIME(OB1PreCycle);
  Q := ET < Time1;
  IF ET >= (Time1 + Time2) THEN
    ET := t#0s;
  END_IF;
ELSE
  Q := FALSE;
  ET := t#0s;
END_IF;
END_FUNCTION
 
Zuletzt bearbeitet:
Zurück
Oben