Programm für Schmierstoffpumpe

B

Beginner09

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

als erstes bin ich im Schaltschrankbau und nicht als Programmierer tätig - nun aber stehe ich vor dem Problem dass unser Programmierer ausfällt und ich bei einem Kunden ein bestehendes Programm ändern soll.
Das "Handling" der S7 Hardware & Software ist mir noch aus Schulzeiten bekannt, sa dass ich es eigentlich hinbekommen sollte.

Der Kunde hat eine Anlage von uns in der eine Schmierstoffpumpe nachgerüstet werden soll - kann mir da jemand einen Code schreiben oder mir Starthilfe geben um dieses zu realiesieren.
Folgende Anforderungen sind gegeben:
- nach Ablauf einer Pausenzeit wird die Schmierstoffpumpe eingeschaltet.
- die Laufzeit der Pumpe wird durch einen INI gesteuert der an einem Fettverteiler nach der Pumpe angebracht ist.
- die Pumpe soll so lange Fett fördern bis der INI 1,2 oder 3 Impulse liefert.
- während die Pumpe läuft soll im Hintergrund eine fest eingestellte Zeit zur Überwachung ablaufen. Kommt kein Impuls in eingestellter Zeit wird eine Störmeldung ausgegeben.
- ist die eingestellte Impulszahl erreicht, wird die Pumpe abgeschaltet und die Pausenzeit beginnt von neuem.

Als Hardware ist eine S7-400 verwendet, die Programmiersprache ist AWL und FUP.

Ich wäre euch sehr Dankbar wenn mir jemand weiterhelfen könnte.


Grüße, Beginner09
 
Glaube nicht, dass Dir das wer ausprogrammiert.

Ansatz:
- nach Ablauf einer Pausenzeit wird die Schmierstoffpumpe eingeschaltet.
Code:
UN #PUMPE
L S5T#ZEIT
SE T1
U T1
FP Mx.y
S #PUMPE
R Z1
- die Laufzeit der Pumpe wird durch einen INI gesteuert der an einem Fettverteiler nach der Pumpe angebracht ist.
- die Pumpe soll so lange Fett fördern bis der INI 1,2 oder 3 Impulse liefert.
Code:
U #INI
ZV Z1

L Z1
L #ANZAHL  //1,2 oder 3
==I
R #PUMPE

- während die Pumpe läuft soll im Hintergrund eine fest eingestellte Zeit zur Überwachung ablaufen. Kommt kein Impuls in eingestellter Zeit wird eine Störmeldung ausgegeben.
- ist die eingestellte Impulszahl erreicht, wird die Pumpe abgeschaltet und die Pausenzeit beginnt von neuem.
Code:
U #PUMPE_RM
UN #INI
L S5T#ÜBERWACHUNGSZEIT
SE T2
U T2
S #ALARM
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe da noch schnell einen Vorschlag im leichteren FUP für Dich:Vorschlag.JPGummern

Achja: Achte auf die Timer und Zählern, die dürfen nicht woanders schon verwendet werden. Siehe Extras-->Referenzdaten
 
Zuletzt bearbeitet:
Dankeschön, jetzt habe ich zumindest mal einen "Ansatz" womit ich sicher etwas hinbekommen sollte!

Für weitere Vorschläge, Änderungen oder Ideen bin ich natürlich sehr offen!

;)
 
Hallo nochmal,

soweit habe ich alles hinbekommen und es funktioniert auch "fast" wie gewünscht.

Ich würde noch gerne wissen wollen wie ich einen Timer oder Zähler realisieren kann der den eigenen ist wert speichert.
Bei meinem aktuellen Programm habe ich das Problem dass bei ausschalten der Maschine zwar der Timer stehen bleib, bei erneutem Zuschalten aber wieder beim
Eingestellten Wert beginnt rückwärts zu laufen.
Mein Problem ist dass unter bestimmten umständen die Schmierstoffpumpe nie angesteuert wird wenn zb bei eingestellten 3 stunden zufällig immer jemand nach 2:59h die maschine
stoppt und wieder startet.
Zum starten der Zeit verwende ich ein Signal welches mir sagt dass der Hauptmotor dreht - eine andere Möglichkeit dehe ich da leider nicht.

Danke :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da gäbe es die Möglichkeit, eine Integer-Variable je Sekunde (Taktmerker) und wenn der Hauptmotor "ein" ist hochzuzählen (I=I+1) und bei >=10800 (s = 3h) die Pumpe zu starten und die Integer-Variable wieder auf Null setzen.

Mit Timern geht das nicht umzusetzen.
Hier noch ein ungetestetes Beispiel:

Code:
      L   #Zähler      //Integer
      U   Mx.5         //x: Taktmerker MBx (anpassen)
      FP  Mx.x
      U   #HauptmotorEin
      UN  #StartSchmierpumpe
      SPBN ZAEH
      INC  1
ZAEH: T   #Zähler
      L   #ZählerMax   //10800s = 3h
      <I
      SPB NRES
      L   0
      T   #Zähler
      SET
      S   #StartSchmierpumpe
NRES: NOP 0
 
U E2.0 //Maschine läuft
FP M2.5 //PLC-Blinker 1S
= M100.0
SPBN _end
L DB58.DBW 2 //DB58.DBW2 Schmierstoffpumpe
+ 1
T DB58.DBW 2 //DB58.DBW2 Schmierstoffpumpe
end: NOP 0


Würde das bei mir bedeuten dass sobald die Maschiene läuft ich den PLC-Blinker abfrage und in den DB58.DBW2 schreibe und immer um 1 erhöhe?
Wenn ja, bis wieviel kann ich da dann hochzählen?

Ich würde es gerne so lösen da der Rest vom Programm ja besteht und auch funktioniert - natürlich nur wenn möglich...
 
Zuletzt bearbeitet:
Das was Du da schreibst, wird nicht funktionieren, abgesehen von einigen Übersetzungsfehlern. Das kann übrigens leicht nach hinten losgehen. (FP M2.5)

Ich würde Dir empfehlen, Dich eng an mein Beispiel zu halten, es ersetzt den Start-Timer.

Hier habe ich schon mal einiges, was Du gerade bekanntgegeben hast mal ausgetauscht:

Code:
      L   DB58.DBW    2      //Integer
      U   M2.5         //x: Taktmerker MBx (anpassen)
      FP  Mx.x
      U   E2.0         //Maschine läuft
      UN  #StartSchmierpumpe
      SPBN ZAEH
      INC  1 
ZAEH: T   DB58.DBW    2
      L   #ZählerMax   //10800s = 3h
      <I
      SPB NRES
      L   0
      T   #Zähler
      SET
      S   #StartSchmierpumpe 
NRES: NOP 0

Was ist M100.0?, Wie willst Du den Zähler reseten? Gib mal mehr von dem bestehenden Programm, dann kann ich Dir das besser ausformen.

Zu der Frage, wie weit der Zähler geht: von -32768 bis 32767 also in diesem Fall sinnigerweise von 0 bis 32767. Wenn Du <I gegen <D austauscht, dann kannst Du bis L#65535 hochzählen. Wenn Du weiter willst, musst Du satt einem Datenbausteinwort ein Datenbausteindoppelwort nehmen.
 
Also Netzwerk 1 streichst Du und Netzwerk 4 wird wie folgt ergänzt:

Code:
      L    DB58.DBW    2     //Das ist dein Zähler, wie Du ihn vorgeschlagen hast, in den Akku 1 laden
      U    M2.5              //x: Taktmerker MBx (anpassen)
      FP   Mx.x              //Hier einen freies Merkerbit einsetzen
      U    "AGGREGATE"       //Dieser Teil hat
      U    "MA.DREHT"        //mich etwas irritiert, desshalb so: wenn beide Bedingungen wahr, läuft der Zähler
      UN   "29-K10"
      SPBN ZAEH
      INC  1                 //Akku 1 einmal je Sekunde um eins erhöhen
ZAEH: T    DB58.DBW    2     //Akku 1 im Zähler speichern
      L    7200              //7200s = 2h
      >=I                    //7200 Sekunden erreicht
      O    "SCHM.HAND"       //Diese Variante lässt nach einem Test die Zeit neu starten, was m.e. Sinn macht 
      S    "29-K10"          //Starte Schmierpumpe
      SPBN NRES
      L   0
      T   DB58.DBW    2     //Zähler reseten
NRES: NOP 0
      L   #zaehlwert1       //Ab hier wie ursprünglich, nur stark vereinfacht
      L   3
      >=I
      O   "T/SCHM.AUS"
      R   "29-K10"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Netzwerk 1 streichst Du und Netzwerk 4 wird wie folgt ergänzt:

Code:
      L    DB58.DBW    2     //Das ist dein Zähler, wie Du ihn vorgeschlagen hast, in den Akku 1 laden
      U    M2.5              //x: Taktmerker MBx (anpassen)
      FP   Mx.x              //Hier einen freies Merkerbit einsetzen
      U    "AGGREGATE"       //Dieser Teil hat
      U    "MA.DREHT"        //mich etwas irritiert, desshalb so: wenn beide Bedingungen wahr, läuft der Zähler
      UN   "29-K10"
      SPBN ZAEH
      INC  1                 //Akku 1 einmal je Sekunde um eins erhöhen[COLOR=#ff0000] (laut Befehlsliste Erhöhe AKKU1-LL (0...255)
[/COLOR]ZAEH: T    DB58.DBW    2     //Akku 1 im Zähler speichern
      L    7200              //7200s = 2h
      >=I                    //7200 Sekunden erreicht
      O    "SCHM.HAND"       //Diese Variante lässt nach einem Test die Zeit neu starten, was m.e. Sinn macht 
      S    "29-K10"          //Starte Schmierpumpe
      SPBN NRES
      L   0
      T   DB58.DBW    2     //Zähler reseten
NRES: NOP 0
      L   #zaehlwert1       //Ab hier wie ursprünglich, nur stark vereinfacht
      L   3
      >=I
      O   "T/SCHM.AUS"
      R   "29-K10"

Ich Nutze den Befehl "INC" fast nie, genau as dem Grund.
Mache es immer so
Code:
L DB58.DBW    2
L 1
+I
T DB58.DBW    2
 
Stimme Dir zu. statt INC bitte L 1 und +I oder +D verwenden.
 
Zuletzt bearbeitet:
Vielen Dank, jetzt habe ich soweit alles hinbekommen! :s1:

Eine Frage aber habe ich noch, den Blinker und auch viele andere unterschiedliche finde ich in der Symboltabelle und auch in der Queerverweisliste.
Wenn ich aber den Ursprung suche wo diese generiert werden kommt da garnichts.

Könnt ihr mir da nen Tip geben wo ich diese Finden kann - einfach um das ganze voll zu verstehen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Hardwarekonfig der SPS kann man ein Taktmerkerbyte angeben. Damit hat man dann 8 unterschiedlich lange Takte zur Verfügung.
 
Zuletzt bearbeitet:
Inc/dec

Code:
      SPBN ZAEH
      [COLOR="#FF0000"]+    1[/COLOR]                 //Akku 1 einmal je Sekunde um eins erhöhen
      T    DB58.DBW    2     //Akku 1 im Zähler speichern
ZAEH: L    7200              //7200s = 2h
      >=I                    //7200 Sekunden erreicht

INC/DEC für die verschiedenen Ganzzahlgrößen:
Code:
BYTE  (8 Bit):   INC  1  |  DEC  1
INT  (16 Bit):   +  1    |  +  -1
DINT (32 Bit):   +  L#1  |  +  L#-1
Achtung: alle diese Operationen beinflussen NICHT die Statusflags.

Harald
 
Als Hinweis auf das in HW-Konfig projektierte Taktmerkerbyte programmiere ich mir immer im OB1 einen Bytezugriff:
Code:
      L    MB2       //Zugriff auf Taktmerkerbyte für Referenzliste

Durch Beobachten dieser Zeile kann man auch sehr schön die Kommunikationsgeschwindigkeit PG-CPU einschätzen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Komisch, ich habe soeben nochmals alles durchtesten wollen und festgestellt dass der Ausgang nicht zurückgesetzt wird.
Mein #zaehlwert1 ist höher wie die geladen zahl zum Vergleichen und trotzdem bleibt der ausgang gesetzt?

Hat mir noch jemand einen spontanen Tipp?

L 10800 //Wert laden in DB58.dbd4
T "DB58.dbd4".grenze

L "DB58.dbd0".hochzaehlen //in den Akku 1 laden
U "fBLINKER1S" //Taktmerker
FP "FP_SCHSP" //Merkerbit
U "AGGREGATE" //Wenn Aggregate an
U "MA.DREHT" //und Maschine dreht
UN "29-K10" //und nicht die Schmierstoffpumpe läuft
SPBN ZAEH //wenn VKE hier = 0 ist dann zu ZAEH: springen
L "DB58.dbd0".hochzaehlen
L 1
+I //Akku 1 einmal je Sekunde um eins erhöhen
ZAEH: T "DB58.dbd0".hochzaehlen //Akku 1 im Zähler speichern
L "DB58.dbd4".grenze //10800s = 3h
>=I //10800 Sekunden erreicht
O "SCHM.HAND" //nach einem Test die Zeit neu starten
S "29-K10" //Starte Schmierpumpe
SPBN NRES //springe wenn VKE = 0
L 0
T "DB58dbd0".hochzaehlen //Zähler resetten
NRES: NOP 0
L #zaehlwert1 //Lade Zahlenwert1
L 3 //lade L#X
>=I // VKE = 1 wenn #zaehlwert1 größer oder gleich L#X
O "T/SCHM.AUS" //oder T39 aktiv
R "29-K10" //dann Schmierstoffpumpe zurücksetzen
 
Hat sich erledigt, ich habe den Zähler direkt verwendet und nicht den temporären Ausgangswert und schon funktioniert es! ;-)
 
Noch ein Tipp von mir. Du verwendest ein Doppelwort als Zähler. Es macht Sinn, dann auch die Doppelwortoperanten (+D, >=D) statt den Integer-Varianten zu verwenden.
 
Zurück
Oben