Endlage zylinder abfrage! Kann das funktionieren? Selbst geschrieben?!

Benedikt

Level-1
Beiträge
55
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
SERVUS, wie schon Mal erwähnt, benötige ich ein paar Infos zur Meisterschule....

ENDLAGEN Überwachung eines Zylinders in einem FB geschrieben mit Taktmerker und Variablen, um es so allgemein zu halten wie möglich.

Hab mich durch die AWL programmiersprache gekämpft und etwas geschrieben.

WEIS ABER NET OB DES SO FUNKTIONIERT. BITTE MAL DRÜBER SCHAUEN UND VORSCHLÄGE BRINGEN!!!



PHP:
      UN    #ENDLAGE_ZYLINDER           // IN_variable
      U     #GO                         // ansteuerung des ventils (start der abfrage)
      SPB   m001
      SPBN  m002
m001: U     #Taktmerker                 //taktmerker von cpu
      FP    #FP                         //Flanke positiv
      L     1
      +R    
      T     #Hochzaehlen                //temp.variable in REAL
      U     #ENDLAGE_ZYLINDER           //endlage des zylinders
      UN    #STORUNG                    //störung
      SPB   m003
      SPBN  m004
m003: L     0
      T     #Hochzaehlen                //temp.vaiable in REAL
      L     #Hochzaehlen                //vergleicht die hochzähl variable mit der vorgegeben überwachunszeit
      L     #Ueberwachungszeit
      >=R   
      =     #Stoerung_ENDLAGE           // störung_endlage als OUT
m002: NOP   0
m004: NOP   0
 
Zuletzt bearbeitet:
Das sieht leider noch ziemlich "roh" aus...

1. Was soll das SBPN m002? Wohin soll denn nun gesprungen werden?
2. Die Flankenauswertung sollte nicht übersprungen werden.
3. Warum überhaupt die ganzen Sprünge? Es muss "NUR" das Hochzählen Übersprungen werden. Alles andere kannst Du ohne Sprünge sauber ausprogrammieren
4. REAL für den Zähler ist nicht die erste Wahl. Ein INT sollte reichen.
5. Der Zähler ist hoffentlich keine TEMP-Variable. Das geht schief...

Versuche mal eine Version mit weniger Sprüngen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, mal an deinem Beispiel erklärt wieso das mal gar nicht funktionieren kann, wei du dir das vorstellst...


Code:
      UN    #ENDLAGE_ZYLINDER           // IN_variable
      U     #GO                         // ansteuerung des ventils (start der abfrage)
      SPB   m001                                       // SPB macht das VKE immer auf true, somit wird ab m001 eh immer alles ausgeführt, egal was deine signale für einen Zustand haben
      SPBN  m002
m001: U     #Taktmerker                 //taktmerker von cpu
      FP    #FP                         //Flanke positiv
      L     1                                                  // 1 zum akku addiert? Du solltest schon den zähler vorher in den akku geladen haben, sonst addierst du 1 zu zufallszahl oder halt etwas anderes...
       +R                                                     // 1 als integer +R geht auch nicht wirklich gut +I und Zähler als int wäre da besser geeignet. wenn du unbedingt real haben willst solltest du L 1.0 laden nich einfach 1
      T     #Hochzaehlen                //temp.variable in REAL
      U     #ENDLAGE_ZYLINDER           //endlage des zylinders
      UN    #STORUNG                    //störung
      SPB   m003  // hier wie oben, entweder springst du zu m003 oder er läuft durch zu m003 da, ja vke =1 und somit kein spbn (du könntest absolut springen "spa" das hätte deinen gewünschten effekt)
      SPBN  m004
m003: L     0
      T     #Hochzaehlen                //temp.vaiable in REAL
      L     #Hochzaehlen                //vergleicht die hochzähl variable mit der vorgegeben überwachunszeit
      L     #Ueberwachungszeit
      >=R   
      =     #Stoerung_ENDLAGE           // störung_endlage als OUT                // eine Zuweisung zu überspringen ist eh sehr unelegant, benutze lieber setz und rücksetz befehle..
m002: NOP   0
m004: NOP   0                                                                // von diesen Sprungmarken ist bestimmt min. eine überflüssig :P

ich behaupte mal, bis auf ein paar sprungbefehle wird hier immer jede Zeile code ausgeführt.

was du da programmieren willst geht auch ganz gut in FUP.:

NW1: un ENDLAGE u ANSTEUERUNG u SEKUNDENIMPULS -> ADD_I (damit den Zähler hochzählen)
NW2: CMP >=I auf dem Zähler für Störmeldung
NW3: MOVE 0 auf den zähler, wenn der Zylinder nicht angesteuert wird zum rücksetzen
fertig. Da wird sich jeder Instandhalter drüber freuen.

.
 
Zuletzt bearbeitet:
Hallo,

Dein hochzählen wie Du es jetzt hast kann so nicht funktionieren. Da Du ja erst eine 0 in Hochzaehlen schreibst und dann Hochzaehlen mit Uberwachungszeit vergleichst.
Wenn Du wie aus deinem Kommentar (temp. variable in Real) hervorgeht eine temporäre Variable benutzt ist dann sowieso bei jedem Zyklus wieder 0 wie Tigerente
auch schon angemerkt hat.

Code:
      UN    #ENDLAGE_ZYLINDER
      U     #GO
      U     #Taktmerker
      FP    #FP
      SPBN  M001
      L     1
      L     #Hochzaehlen
      +I    
      T     #Hochzaehlen
M001: L     #Hochzaehlen
      L     #Ueberwachungszeit
      >I    
      S     #Stoerung_ENDLAGE

      U     #ENDLAGE_ZYLINDER
      UN    #GO
      SPBN  M002
      L     0
      T     #Hochzaehlen
M002: U     #FehlerReset
      R     #Stoerung_ENDLAGE

Habe mir mal erlaubt deinen Code etwas abzuändern.
Das soll jetzt nicht die optimale Lösung sein, da kann man noch einiges machen.

Gruß DiX
 
Der Zähler sollte immer mit 0 initialisiert werden, wenn die Ansteuerung weggeht. Sonst kriegt man den Fehler nicht weg, wenn die Endlage nicht kommt.
Das könnte gewollt sein, bringt aber Schwierigkeiten wenn der Zylinder doch nicht mehr fahren soll. Ich empfehle die Laufzeitkontrolle erneut zu starten, wenn die Bewegung abgebrochen wurde.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich finde es sinnvoller den Zähler zu initialisieren, wenn die Ansteuerung kommt.
Dann kann man auch eventuelle Programm oder Ablauffehler finden wenn die Überwachung weiter läuft.
Ansonsten kommt man irgendwann an die Anlage alles steht still und keiner weiß erstmal warum.
Die Störung Endlage kommt ja nicht weil der Zähler gestoppt wurde nachdem die Ansteuerung weg war.

Aber bei Diagnosethemen hat ja jeder seine eigene Philosophie und Vorstellungen.

Gruß DiX
 
Hallo Benedikt,
ohne auf den code einzugehen, möchte noch etwas zu der Zylinderabfrage beitragen. Der Zylinder wird normalerweise in beiden Endlagen abgefragt. Als nächstes muß man beachten wie der Zylinder
angesteuert wird, d. 5/2 oder 5/3 Ventile. Gehen wir mal von 5/2 aus :
Grundstellung : Ini GS an, Ventil aus
Arbeitsstellung : Ini AS an, Ventil an
Nun gibt es aber dazwischen Bedingungen, da der Zylinder bei der Bewegung den GS verlässt und nach Laufzeit den As erreicht.
Diese Zeit mußt Du mit einem Timer belegen in Abhängigkeit Laufzeit Zylinder.
Dann gibt es noch die Möglichkeit, das
1.) ein Endschalter defekt ist mit immer aus
2.) ein Endschalter defekt ist mit immer ein
3.) Das Ventil klemmt oder jemand die Drosselrückschlagventile total zugedreht hat.

Eine vernünftige Abfrage Aktor / Sensor fängt alle diese Bedingungen ein.

Das heisst Du mußt programmieren ( sinngemäß AWL in Step7 habe ich noch nicht gemacht):

U GS ;beide Inis an
U AS
O
UN GS ; beide Inis aus > Laufzeit !!
UN AS
O
U GS ; Ventil angesteuert, aber GS nicht verlassen
U Ventil
O
U AS ; Ventil abgefallen, aber nicht AS verlassen
UN Ventil
ST Störung

Timer mit Störung anlaufen lassen, nach Ablauf Timer Störung ausgeben

So machen wir das seit über 20 Jahren und wissen ob es ein Problem mit Aktor / Sensor gibt

Gruß olmuk
 
Hallo nochmal,

für meine Anwendungen habe ich mir einen Baustein geschrieben, der für alle diese Fälle
eine separate Meldung bringt.
Also
Paarüberwachung ( beide Inis an),
Endlage nicht erreicht ( jeweils für vor und rück ),
Endlage nicht verlassen ( jeweils für vor und rück ),
Endlage ohne Ansteuerung verlassen ( auch für vor und rück),
dazu kommt noch je eine Freigabe Meldung für die Handbedienung ( also wenn man einen Zylinder fahren will
und man hat noch irgendwelche Verriegelungen.

Das ganze habe ich für Gruppen von bis zu vier Zylindern realisiert. Also alle Meldungen mal 4.

Ob so eine detailierte Diagnose dann für jeden anwendungsfall Sinvoll oder Notwendig ist
liegt dann bei jedem selbst.
Aber eigentlich ging es hier ja glaube ich um eine ganz einfache Anwendung.

Gruß DiX
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo DiX,
ist das nicht zu kompliziert ?
Endlage nicht verlassen = Schrittkette ?
Endlage ohne Ansteuerung verlassen = Schrittkette ?
Für Handbetrieb gelten doch die gleichen Bedingungen für Aktor / Sensor wie in Auto ?

Unsere Erfahrung ist, das ein "Sparen" an Zylinderenschaltern und nur eine Stellung abfragen bei weltweit verstreuten Vorrichtungen
nur zu unnötigen Ärger und ungeplantem Service führt. Etwas teurer in der Hardware und die Bausteine hat man sowieso.

Gruß olmuk
 
Hallo DiX,
ist das nicht zu kompliziert ?
Endlage nicht verlassen = Schrittkette ?
Endlage ohne Ansteuerung verlassen = Schrittkette ?
Für Handbetrieb gelten doch die gleichen Bedingungen für Aktor / Sensor wie in Auto ?


Wer schreibt denn was von Schrittkette?

kompliziert? Deine Ausführung will doch das gleiche erreichen, oder nicht?

Im Handbetrieb : zum Einstellen der Zylinder. Zur Zeit-Erfassung der Bewegung. Zum Testen der Endlagen-ini's...
 
Hallo Olmuk,

Schrittketten braucht man dafür keine. Ist eigentlich eine relativ einfache Logik.
Ganz grob das Prinzip:

U EndlageWurdeErreicht (Bool Variable wird gesetzt wenn Endlage erreicht und rückgesetzt wenn die andere Richtung angesteuert wird)
UN EndlageZylinder
UN Ansteuerung
S FehlerEndlageOhneAnsteuerungVerlassen

Für Endlage nicht verlassen kann man den Wert des Laufzeit Timer oder Zähler mit einem kleinerem Wert als die Laufzeit vergleichen und
damit den Fehler erzeugen.

L ZaehlWert
L Vergleichswert
>I
U AnsteuerungVOR
U EndlageRueck
S FehlerEndlageNichtVerlassen

Es ist richtig das im Handbetrieb die gleichen Bedingungen gelten wie in Auto. Nur der der die Anlage bedient gehorcht diesen nicht immer
und damit nicht alles zu bruch gefahren wird macht man Verriegelungen rein das Aktoren nur dann angesteuert werden können wenn "der Weg frei ist"

Gruß DiX
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo DiX,

habe ja nicht gesagt, das man dafür Schrittketten braucht. Es ging darum, das "normale" Erreichen einer Position dann in der Schrittkette abgefragt wird.
Der Ansatz ist, egal wie und wann angesteuert wird, die genannten Bedingungen ( innerhalb der Laufzeit ) nicht erfüllt sein dürfen.
Dem Frager sollte nur ein bereits im Einsatz befindlicher Ansatz dargestellt werden. Was nützt Ihm der Teil einer Abfrage die zwar für die Prüfung reicht,
aber dann in der Praxis nicht alles einfängt.
Auch über Verriegelungen haben wir nicht gesprochen - das ist alles selbstverständlich.

Was ist denn der Unterschied bei Dir zwischen EndlageWurdeErreicht und EndlageZylinder ?

Gruß olmuk
 
KANN DES SO GEHEN? VERSUCH No II in FUP!

Kann des so funktionieren???

Oder hat irgendjemand noch einen verbesserungsvorschlag, wäre euch sehr dankbar!!!!




TESTSPS.jpg
 
Mir ist grad aufgefallen das ich beim Vergleicher IN1 und IN2 vertauscht hab....

Was meint ihr dazu???

Danke schon mal...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schon besser, aber:

1. Warum schiebst du eine Real Zahl in einen Integer? Das geht nicht. Ich glaube das geht nicht mal mit 0. Wegen der Mantisse usw. hab mich damit noch nicht so doll beschäftigt. (3. Netzwerk)
2. Würde ich im 3. NW nur bei nicht angesteuert 0 in den Zähler schieben (also rücksetzen.)
3. zählst du im NW1 solange der Taktmerker ansteht, also bei Sekunden Takt 1 Sekunde über alle Zyklen +1, hier solltest du eine Flankenauswertung machen. Am besten einen globalen Sekundenimpuls, damit du nicht für jeden Zähler einen Flankenmerker brauchst.
4. Hast du selber schon gesehen :)

korrektur.jpg
 
Zuletzt bearbeitet:
So jetzt aber noch eine allgemeine Frage....

Habe jetzt die zeitüberwachung in einem FB geschrieben..... wenn ich jetzt BSP.-Weise, 20 Ventile hab und einen FC aufrufe den ich Ventilüberwachung nenne, muss ich doch 20 mal den FB aufrufen?!

MUSS ICH ABER DANN FÜR DIE 20 FBs 20 verschiedene DBs zuweisen?

ACH JA HAB JETZT im FB nur STAT-Variablen verwendet....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So jetzt aber noch eine allgemeine Frage....

Habe jetzt die zeitüberwachung in einem FB geschrieben..... wenn ich jetzt BSP.-Weise, 20 Ventile hab und einen FC aufrufe den ich Ventilüberwachung nenne, muss ich doch 20 mal den FB aufrufen?!

MUSS ICH ABER DANN FÜR DIE 20 FBs 20 verschiedene DBs zuweisen?

ACH JA HAB JETZT im FB nur STAT-Variablen verwendet....

Warum schreibst du jetzt alles groß?
Nimm einen FB und nache dann Multiinstanz darus und ein DB reicht.



bike
 
Multiinstanz

  1. Nimm einen neuen leeren FB
  2. dann im Stat-Bereich Variablen vom Typ "<FB>" (Dein FB) deklarieren,
  3. Aufrufe deines FB in die Netzwerke einfügen
  4. Je FB-Aufruf: Rechtsklick auf den FB ->Ändern in Multiinstanz mit Zuweisung des Namens wie im Stat-Bereich festgelegt
  5. Den neuen, übergeordneten FB im OB1 oder sonstwo aufrufen und einen Instanz-DB generieren lassen.
Fertig. ;)

Gruß Approx
 
Zurück
Oben