Impuls_Pause_Repeat_in FC/FB

mzva

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

wollte mir einen Baustein (FC/FB) erstellen, in dem es moeglich ist ein Ausgang mit folgenden Optionen auszustatten. Der Baustein soll spaeter mehrmals aufgerufen werden.
z.B.

Impuls: DB100.DBW0
Pause: DB100.DBW2
Repeat: DB100.DBW4
Output: A8.4

leider bin ich etwas ratlos wie ich Timer und Counter innerhalb des Baustein verwenden soll. Die Eingabe der verschieden Zeiten (impuls-pause) und Wiederholungen (repeat) erfolgt via OP (DB).
Ich benutze S7V5.3.

Besten Dank schon im voraus fuer die Hilfe.

mzva :eek:
 
Es gibt einige Möglichkeiten:

1. Die gibst als Input-Var einen bzw. mehrere Timer an, den/die du dann intern nutzt.

2. Du nimmst einen Zählimpuls der CPU (100ms) als Input für den Baustein und eine Zählvariable. Diese Zählvariable wird hochgezählt und mit den Impuls- und Pausewerten verglichen, bei Erreichen der vorgegebenen Anzahl jeweils den Ausgang ein- bzw. ausschalten. (Diese Variante würde ich vorziehen.)

Wenn du einen Timer nutzt, kannst du am OP die Wert direkt als Timerwert konfigurieren, bei einem Zähler (100 ms) nimm am OP eine INT mit 1 Kommastelle, so kann der Zählwert direkt mit dem Zeitwert verglichen werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ein fb wär am besten...

am besten du kreirst einen FB mit folgenden Parametern:

IN : Impuls : integer
IN : pause : integer
IN : repeat : integer
IN : takt : integer
IN : start : bool
OUT : output : bool

aus takt machst du eine Flanke : TEMP : t_fl
mit start setzt Du dir : STAT : gestartet
Du addierst pause + impuls zu TEMP : Zyklus
Du brauchst noch zwei weitere Zählvariablen als STAT : ZZ1 und ZZ2
wenn gestartet 1 ist und die sekundenflanke da ist, erhöhst du ZZ1 um einen (mit +I). Ist ZZ1 grösser gleich Zyklus, setzt du zz1 auf null und erhöst zz2 gleichzeitig um einen. wenn zz2 grösser ist als repeat, setzt du zz2 zu null und setzt gestartet zurück.
Nun zum ausgang: wenn zz1 kleiner gleich impuls ist und gestartet da, weist du dies dem ausgang zu. fertig.

Ich hoffe ich konnte Dir damit helfen und habe die aufgabenstellung verstanden, sonst meld ich nochmal.

gruß
 
Vielleicht hilft Dir das weiter !

Quelle anlgen,
Namen angeben in Symboltabelle,
übersetzen,

fertig

FUNCTION_BLOCK "fbPulsPausCnt"
TITLE =
//Taktgeber mit einstellbarer Puls, Pausezeit.
//iEnable 0 -> 1 = oPuls wird ausgegeben gleichzeitig lauft iPulsTime, nach
//Ablauf von
//iPulsTime wird umgeschaltet zu oPause.iPauseTime wird gestartet.
//Nach Ablauf von iPauseTime beginnt der Ablauf von neuem.
//iEnable 1 -> 0 oPuls und oPause schalten sofort aus. Zugehoerige Zeiten werden
//gestoppt.
//Zeiten laufen bei jedem wechsel von iEnable die volle Zeit neu.
//Zeitwerte mit 0ms sind nicht erlaubt.
//Jeder Puls wird mitgezaehlt, bei erreichen von iCount_Pulse wird oCount_OK auf
//High gesetzt.
// KNOW_HOW_PROTECT
AUTHOR : FKJ
FAMILY : TIMING
NAME : PULSCNT
VERSION : 0.1
Know_how_protect
VAR_INPUT
iEnable : BOOL ;
iPulsTime : TIME ;
iPauseTime : TIME ;
iCount_Pulse : INT ;
END_VAR
VAR_OUTPUT
oPuls : BOOL ;
oPause : BOOL ;
oCount_OK : BOOL ;
END_VAR
VAR
T_1 : "TON";
T_2 : "TON";
Counter_x : INT ;
RT_2 : TIME ;
RT_1 : TIME ;
Q_T_1 : BOOL ;
Q_T_2 : BOOL ;
A : BOOL ;
B : BOOL ;
HM_1 : BOOL ;
HM_3 : BOOL ;
Count_ok : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
U #iEnable; // Pulstime
UN #Q_T_2;
UN #Count_ok;
= #A;
CALL #T_1 (
IN := #A,
PT := #iPulsTime,
Q := #Q_T_1,
ET := LD 0);
U #Q_T_1; // Pausetime
U #iEnable;
UN #Count_ok;
= #B;
CALL #T_2 (
IN := #B,
PT := #iPauseTime,
Q := #Q_T_2,
ET := LD 4);
U #iEnable; // Reset
SPB m002;
L 0;
T #Counter_x;
SET ;
R #Count_ok;
m002: NOP 0;
U #oPuls; // Count
FP #HM_3;
SPBN m001;
L #Counter_x;
L 1;
+I ;
T #Counter_x;
m001: NOP 0;
L #Counter_x; // Count Auswerten
L #iCount_Pulse;
>=I ;
U #Q_T_1;
S #Count_ok;
U #Q_T_1; // Pause
U #iEnable;
UN #Count_ok;
= #oPause;
U #iEnable; // Puls
UN #oPause;
UN #Count_ok;
= #oPuls;
ON #iEnable; // Reset bei fertig oder Ende
O #Count_ok;
R #oPuls;
R #oPause;
U #Count_ok; // Count OK
= #oCount_OK;
END_FUNCTION_BLOCK


mfg FKJ
 
Besten Dank fuer die Hilfe, denke ich habe nun ein paar Ansatzpunkte um selbst zu einem "Ergebnis" zu kommen.

Ralle was meinst du mit Zaehlimpuls (Taktmerker?)

mzva;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Hardwarekonfiguration der S7 kannst du ein Taktbyte angeben (z.Bsp. MB100). Die einzelnen Bits haben unterschiedliche Taktzeiten, daraus kann man Impulse machen und diese dann zählen. Mit einem 100ms-Impuls als Zählimpils aus diesem Taktmerker realisiere ich alle Zeitüberwachungen (z.Bsp. für Zylinderbewegungen) in meinen SPS-Programmen.
 
Genau mit Taktmerker meinet ich was du beschrieben hast, Taktbyte.
Wenn es ok fuer dich waere, koenntest du mir ein einem einfach Beispiel (Zylinderueberwachung) erklaeren wie du dies machst? Vielleicht Code posten?

Gruss mzva :)
 
Zurück
Oben