Logik Problem

litlegerman

Level-2
Beiträge
312
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht hier weniger um ein SPS Problem, aber es geht um ein logikproblem, und wenn einer logisch denken kann seid ihr das
Gegenwärtiges System:
Ich habe wasserkreislauf mit einem sehr grossem Becken dessen Niveau überwacht und über ein selbständiges System bei Notwendigkeit mit frischwasser aufgefüllt wird.

Anforderung des Kunden:
1. Aus de System sollen in regelmässigen zeitabständen, eine vorwählbarere Wassermenge abgelassen werden, um das Systemwasser frisch zu halten, die "Niveauregelung" füllt das verlorene Wasser wieder auf.
2. Die Zuführung soll überwacht werden, und in einem Graph aufgezeichnet werden und bei Überschreitung einer Toleranz auf Alarm gehen.

Hardware:
S7 312c und microinovation touchpanel
2 wasserzähler mit im impulsausgang (0,25L pro Impuls)
1 Ventil

Aufbau:
Am einlauf der "Niveauregelung" wird ein Zähler angebracht.
Das ventil und ein ZÄhler am Auslauf.
Die Zähler werden an die schnellzähler Eingänge angeschlossen und das Ventil an einem DA.
Den Graph übernimmt das TP

Problem:
Wie bekomme ich mit den Zählern einen guten durchsatz errechnet ich dachte so an qm pro Stunde

Bitte helft mir mein Kopf raucht schon!:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte Option 1 bevorzugt, denn ich erwarte mehrere Impulse pro Sekunde, aber mein Problem Isle das ich dein Wert hochrechnen müsste was die Sache wieder sehr ungenau machen würde.
 
Solange du den Durchsatz nicht regeln musst, ist das doch imo genau genug. Eigentlich ist dir doch die Menge wichtig oder? Und die mit Impulsen zu erfassen ist mehr als sinnvoll.
Wenn du den Durchsatz möglichst genau haben willst, solltest du die erfassungszeit möglichst gering halten. Also Auswertung des Zählers im weckalarm. Ich weiß leider grad nicht was genau du da bei deiner CPU für Möglichkeiten hast.

Gesendet von meinem GT-I9100 mit Tapatalk 2
 
Ich benutze in mein Hausamautomation für Sonne, Import,Gas Energie eine modifizierte Oscat FLOW_METER
Ich habe es erweitert mit " Timeout" und Mittelwert
Code:
FUNCTION_BLOCK FLOW_CALC
TITLE = 'FLOW_CALC'
// reworked OSCAT FLOW_METER Function block
// USES Reworked FB64 (STIME)  DB64 (IDB_STIME)
VERSION : '1.0'
AUTHOR  : Peter
NAME    : FlowCalc
FAMILY  : Calc
VAR_INPUT
  VX        : REAL;      //flow per unit / hr       
  TTX       : DWORD;     //PLC msec time
  Input     : BOOL;      //Input flag from flowcounter
  AVG       : BOOL;      //Use averaging
  TIMEOUT   : TIME := T#180S;     //After this time the flowoutput is set to 0.0
  AVGFACt   : TIME := T#1S;         // time averaging value
END_VAR
VAR_IN_OUT  
   F : REAL;   //flow output
END_VAR
//internal used vars
VAR
  lastTX    : DWORD;  // Previous TTX value
  AvgLastTX : DWORD;
  LastF     : REAL;   // Previous Flow value
  LastY     : REAL;
  e_last    : BOOL;   //FLANK DETECTION
  Hold      : BOOL;
 
END_VAR
 
BEGIN
// set / preset /reset some values at PLC startup
IF m40.0 THEN    // M40.0 is 1 cycle active at PLC startup
   lasty :=0.0;
   f := 0.0;
   AvgLastTX :=ttx;
END_IF;
//caculate flow per hour
IF Input AND  NOT e_last THEN  
   IF NOT HOLD  then  
       lastF := (VX *  3.600000e+006 )/ DINT_TO_REAL(DWORD_TO_DINT(ttx) - DWORD_TO_DINT(lastTX));  
   END_IF;    
   Lasttx := ttx;  // store last ttx for next puls
   HOLD := false;
END_IF;
 e_last := Input;
 
//average function
IF AVG THEN 
    F := F+ (lastF-lastY) * DINT_TO_REAL(DWORD_TO_DINT(ttx) - DWORD_TO_DINT(AvgLastTX)) / DINT_TO_REAL(TIME_TO_DINT(AVGFACt));
    LastY:=F;
    AvgLastTX :=ttx;
ELSE
    F:= LastF;
    lasty := 0.0;
END_IF;
 
 //time out if long time (TIMEOUT) no puls from input received
 IF DINT_TO_TIME(DWORD_TO_DINT(ttx) - DWORD_TO_DINT(lastTX)) > timeout AND NOT INPUT THEN
    LastF:= 0.0;
    Lasty := 0.0;
    lastTX := TTX;   
    HOLD := true;
 END_IF;  
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich benutze ... eine modifizierte Oscat FLOW_METER...
Code:
...
IF m40.0 THEN    // M40.0 is 1 cycle active at PLC startup
...
Das ist sicher nicht aus der Oscat, oder?
Ich würde für den M40.0 eine Eingangsvariable, z.B. EZ (Erster Zyklus) oder RESET erstellen, die im Baustein verwendet wird und den M40.0 nur außen an den Baustein anlegen. Damit kann man den Baustein wieder universell auch in anderen Programmen verwenden, ohne daß dann vielleicht untergeht, daß ein Merker für den ersten Zyklus innerhalb des Bausteins benötigt wird.
 
Die Baustein ist noch in bearbeitung in der folgende version vielleicht nichtmehr.

Übrigens verwende ich immer eine standard FC mit start, zeit, und impuls Funktionen.
Das Orignal ist Oscat. In Oscat wird für jede aufruf STIME neu aufgerufen das habe ich geandert nur einmal gleich start OB1 > Aufruf Standard FC mit Call STIME. Ich find es nicht notwendig 20 x call FLOW_CALC auch 20 x call STIME
.
Entschuldigung für Sprache fehler/ Egnischer Wörter
 
Zurück
Oben