Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Anfängerfragen über Timer, Fehlerauswertung, Code mehrfach verwenden

  1. #1
    Registriert seit
    29.12.2015
    Beiträge
    11
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebes Forum,

    mein Name ist Ahmed, bin 18 Jahre alt. Zur SPS-Programmierung bin ich durch meine Schule gekommen und habe nun bei einer freiwilligen SPS-Projekt mitgemacht.
    Da ich noch ein blutiger Anfänger in der SPS-Programmierung bin, würde ich mich sehr über eure Hilfe freuen.

    Problem #1:

    Mein Projekt besitzt ein Auslaufband, welches 2x starten muss:
    1.Fall: Schieber fährt los, Auslaufband startet und schaltet sich nach einer gewissen Zeit ab.
    2. Fall: Der Sensor am Ende erkennt das entfernen eines Objektes und fährt für eine gewisse Zeit nach.

    Dazu habe ich auch einen Code geschrieben:
    Code:
    // Hauptfunktion
    "timer_auslaufband_fahrzeit".TOF(IN := "Daten_DB".schieber2_belegt,
                                     PT := "Zeiten_DB".zeit_auslaufband_fahrzeit,
                                     Q => #auslaufband);
    // Objekt angekommen und abholbereit
    "pos_flankenerkennung_objekte_abholbereit"(CLK := "timer_auslaufband_fahrzeit".Q);
    IF "pos_flankenerkennung_objekte_abholbereit".Q THEN
        "Daten_DB".objekte_abholbereit_anzahl := "Daten_DB".objekte_abholbereit_anzahl + 1;
    END_IF;
    
    
    
    
    // Objekt wurde entfernt und Station fährt nach
    "neg_flankenerkennung_objekte_abholbereit"(CLK := #auslaufband_belegt);
    "timer_auslaufband_nachfahren".TOF(IN :="neg_flankenerkennung_objekte_abholbereit".Q AND"Daten_DB".objekte_abholbereit_anzahl > 0,
                                       PT := T#500ms,
                                       Q => #auslaufband);
    
    
    IF "neg_flankenerkennung_objekte_abholbereit".Q AND "Daten_DB".objekte_abholbereit_anzahl > 0 THEN
        "Daten_DB".objekte_abholbereit_anzahl := "Daten_DB".objekte_abholbereit_anzahl - 1;
    END_IF;
    Mein Problem nun: Je nachdem welcher der beiden Timer weiter unten im Code ist, funktioniert nur dieser. Abhilfe?

    Problem #2:

    In meinem Projekt sind mehrere Fehlererkennungen, die je eine Fehlervariable in meinem Fehler_DB setzt. Nun möchte ich, wenn einer dieser Variablen gesetzt wird, dass alle meine Outputs auf 0 gesetzt werden.
    Könnte mir jemand erklären, wie man das am Besten macht?

    Problem #3:

    In meinem Projekt besitze ich 2 FB's die zu 90% gleich sind und viele andere Stellen wo der Code auch schonmal vorgekommen ist. Mein Lehrer meinte, man könnte diesen Code öfter verwenden und man bräuchte das Programm nicht öfter schreiben. Da ich aber immer andere Variablen habe und so auch keine Idee wie das funktioniert, würde ich mehr sehr freuen, wenn auch das mir jemand erklären könnte.

    Danke im Vorraus.

    Lg
    Zitieren Zitieren Anfängerfragen über Timer, Fehlerauswertung, Code mehrfach verwenden  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    zu #1

    Beide Timer haben die selbe Outputvariable.
    Der letzte gewinnt immer, denn sein Ergebnis überschreibt das des vorhergehenden (ist ja der selbe Ausgang).

    2 Möglichkeiten:

    1. Je eine Temp- oder Star-Var an den Ausgang des Timers. Dann nach beiden Timern im Code

    #Auslaufband := TimerOut1 OR TimerOut2

    2. Timer-Output nicht beschalten und nach den beiden Timern im Code

    #Auslaufband := "timer_auslaufband_fahrzeit".Q OR "timer_auslaufband_nachfahren".Q

    zu #2

    1. Ganz am Ende des Bausteins:

    If #FEHLER Then

    #Auslaufband := False;
    ...

    END_IF;

    Alle Ausgangsvariablen werden dann mit False überschrieben.

    oder

    2. schon in der Zuweisung

    #Auslaufband := (TimerOut1 OR TimerOut2) AND NOT #FEHLER

    zu #3

    Als Variablen verwendest du Input, Output, INOUT, TEMP und STAT, keine externen Variablen aus DB, Merker oder Timer.
    Das heißt, du mußt die Timer im FB in den Stat-Var deklarieren und dann diese Timer im Baustein verwenden. Alle Variablen von "Außen"
    mußt du ja nach Verwendung als Input, Output oder INOUT deklarieren, keine Direkt-Zugriffe in DB.

    "Daten_DB".objekte_abholbereit_anzahl z.B.

    wäre ein IN_OUT, denn du
    merkst dir darin die Anzahl der Abholbereiten Objekte, holst also die Daten in den FB, veränderst sie und gibst sie wieder aus. Wenn diese Variable nur in deinem FB verwendet wird, dann kannst du sie auch im STAT-Bereich deklarieren, der Stat-Bereich ist ein Variablenbereich, der Werte enthält, die sich der FB "merken" kann. Der Temp-Bereich enthält Variablen, die immer nur genau einen Zyklus lang gültig sind. Darin kann man Zwischenergebnisse ablegen, die im Baustein im gleichen Zyklus wiederverwendet werden. Sie müssen immr zuerst mit einem Wert beschrieben werden, ehe man sie liest, sonst sind sie zufällig und undefiniert!

    Suche mal in der Step7-Hilfe und im Forum unter dem Stichwort "Multiinstanz".
    Geändert von Ralle (31.12.2015 um 00:09 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    ex0dus (31.12.2015)

  4. #3
    ex0dus ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.12.2015
    Beiträge
    11
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo erstmal,

    danke für deine ausführliche Beschreibung. Hat mir wirklich sehr geholfen.

    Zu #1: gelöst durch folgende Methode: #Auslaufband := "timer_auslaufband_fahrzeit".Q OR "timer_auslaufband_nachfahren".Q.

    Zu #2: habe es im ersten Post sehr schlecht ausgedrückt aber hier erneut: Ich habe ca. 15 Fehlercodes. Wenn 1 Fehlercode aktiv ist, sollen alle Outputs auf 0 gesetzt werden. Da ich aber 7 FB's habe und diesen Code überall reinzuschreiben wäre sehr unschön. Kann man dies nicht irgendwie übergeordnet ins OB1 oder als FB machen, so das die Fehlercodes nur 1x immer abgefragt werden und nicht immer im dazugehörigen FB?

    Zu #3: Danke für diese tolle Erklärung. Ich habe hier 2 Bearbeitungsstationen, wo ich den Code weiterverwenden will. Beide werden gleich angesteuert doch 3 Zeilen Code sind zwischen den beiden Stationen anders. Was mach ich mit diesen extra Code? Außerdem haben beide Stationen verschiedene Bearbeitungszeiten, aber keine Ahnung wie ich das mit nur einem FB machen soll. Außerdem hab ich mich jetzt etwas durch die Hilfe gelesen, wegen den Multiinstanzen, aber verstehe dies leider überhaupt nicht.. Wäre schon wenn einer erklären könnte warum man diesen braucht und wie man so einen erstellt.

    Noch eine Frage zum Schluss: Die Station wird später mit einer HMI bedient. Da aber nicht ich die Visualisierung mache und davon auch keine Ahnung habe, wäre noch wichtig zu wissen, welche Variablen man im HMI auslesen und verändern kann.

    Danke und Lg

    Edit: habe nun einen FB erstellt der alle Fehlercodes durchcheckt und wenn einer gesetzt ist schaltet er alles aus, den FB hab ich ganz am Ende meines OBs und wird nur abgearbeitet wenn eine Fehler auftritt. Wäre dies so ok oder gibt es eine schnellere und sichere Möglichkeit?
    Geändert von ex0dus (31.12.2015 um 14:23 Uhr)

  5. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    zu #2

    Ja, das kannst du machen.
    es macht ohnehin Sinn, die Fehler aus den FB nach außen zu führen, um sie dann später z.B. mit einem Oanel oder ener roten Meldeleuchte anzuzeigen.
    Die Ausgänge werden von dir zwar mitten im Programm gesetzt oder rückgesetzt, aber immer am Ende bzw. am Anfang eines SPS-Zyklus werden sie erst tatsächlich an die Peripherie übertragen. Wenn du also innerhalb eines Zyklus 10 mal einen Ausgang setzt und rücksetzt, wirst du physikalisch am Ausgang immer nur das Letzte sehen, das du gemacht hast!

    Dein Edit hört sich gut an.

    zu #3

    Ok, Multiinstanzen war ein wenig zu weit gegriffen, brauchst du nicht unbedingt, wenn man mal von den Timern absieht, die du im Stau-Bereich des FB definierst, das sind im grunde genommen, dann auch welche. Hast du diesen Teil der Ausführungen, mit den Timern denn verstanden?

    Wenn Code wirklich unterschiedlich ist, dann muß man ihn entweder auslagern, also aus dem FB herausnehmen und dann eben nach oder vor dem FB bearbeiten oder, man baut als Input quasi einen Schalter ein, der dem FB dann sagt, "Du verhältst dich wie Fall1 oder Fall2". Im FB dann mit einer IF ... Then - Abfrage diesen "Schalter" abfragen und den jeweiligen Code ausführen..
    Das ist aber in gewissem Maße eine wenig geschummelt, denn die FB lassen sich dann nicht einfach für einen dritten Fall wiederverwenden, es sei denn, das entspricht einem der beiden brereits programmierten Fälle. MAn muß dann noch enen Schalter einbauen oder eine Integer zur Fallunterscheidung nutzen.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    ex0dus (31.12.2015)

  7. #5
    ex0dus ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.12.2015
    Beiträge
    11
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also erstmal danke für dein großartige Hilfe.

    Zu #2: Die Fehler habe ich alle in eine eigene DB gepackt, damit man später bei der Visualisierung die Fehler schneller anfindet und nicht jeden FB durchsuchen muss.

    Zu #3: Ich habe es inzwischen geschafft einen FB mehrfach zu verwenden, zwar ohne Multiinstanz-DB aber es hat funktioniert. Problem nun: Dieser Code wird ja bei 2 Stationen ausgeführt. Diese Stationen haben aber andere PT bei den Timern und andere Fehlermeldungen, wie schaffe ich es nun, dies so umzuändern, dass es ersichtlich ist für welche der beiden Stationen dies ist.

    Zu meinem Edit: Ein Screenshot von meinem OB1 ist angehängt (derzeit nur rot markiert, da ich den Namen einer lokalen Variable geändert habe und noch nicht im OB1 geändert hab, falls nicht ersichtlich, der ENO meines Fehlerfalls geht zu jedem meiner Programmbausteine, die nichts mit dem Fehler zu tun haben) und der Code in meinem Fehlerfall sieht so aus:
    Code:
    #zufuehrband := 0;#schieber1_vor := 0;
    #schieber1_zurueck := 0;
    #fraesband := 0;
    #fraeser := 0;
    #bohrband := 0;
    #bohrer := 0;
    #schieber2_vor := 0;
    #schieber2_zurueck := 0;
    #auslaufband := 0;
    Hier setzte ich einfach all meine Outputs auf 0.
    Ist diese Lösung so ok? Oder gibt es vielleicht doch eine bessere Lösung?
    Und wenn ich den Fehler wieder zurücksetze, starten dann die ganzen Bausteine von neu, oder dort wo sie aufgehört haben, als der Fehler kam?

    Danke und LG

    Edit: Hab nun bisschen mit Multiinstanzen herumgespielt und ich habs geschafft! Meine #3 Frage kann man nun vergessen, da ich verstanden habe, wie ich das mit Multiinstanz hinbekomme. Danke dafür.
    Angehängte Grafiken Angehängte Grafiken
    Geändert von ex0dus (31.12.2015 um 16:21 Uhr)

  8. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Du mußt für Unterschiede, dem FB jeweils einen Engang spendieren.
    Wenn z.B. Timerwerte unterschiedlich sind, dann also einen Eingang definieren der den Datentyp der Variablen hat, die am Timer zu stehen hat.
    Dann kannst du beim jeweiligen Aufruf des FB an diesen Eingang den Entsprechenden Zeitwert ertragen. Im FB schreibst du die Eingangsvariable an den Input PT des Timers.
    Gleiches machst du mit boolschen Variablen oder Integer etc. Außen an den FB dann die Wert oder auch die exteren Variable, z.Bsp. einen Wert aus dem HMI-DB, falls du da variable Werte übergeben willst, im FB mit der Input-Variablen arbeiten.

    Generell ist die Frage, ob du die Outputs im Fehlerfall auf 0 bringen mußt. Der Rest deinens Programmes kann ja durchaus normal weiterarbeiten, obwohl ein Fehler auftritt.
    Bsp. Du hast 2 Bänder, die nicht vonenander abhängen. Dann kann Band 1 in Fehler gehen, Band 2 aber normal weiterarbeiten und an einer LS stoppen etc. ja nachdem, wie das Programm arbeiten soll.
    Hängen die Bänder hintereinander, macht es Sinn, das vordere zu stoppen, wenn das darauffolgende Band einen Fehler hat, umgekehrt könnte man das hintere Band weiterlaufen lassen, wenn das vordere in einen Fehler geht.

    Es hängt also immer von Anwendungsfall ab, wie man auf Fehler reagiert.

    Ich persönlich versuche, Ausgänge nur an einer Stelle zu beschreiben. Das passiert dann durchaus mit mehreren Varaiblen, wie du das ja auch schon machst, bei den Timer-Outputs.
    Dazu habe ich teilweise Bausteine, z.B. für Ventile oder Motore, die haben dann Freigabe-Eingänge oder auch Sperr-Eingänge, über die ich dann bei Bedarf auch die Reaktion der Ausgänge beeinflusse.
    Geändert von Ralle (31.12.2015 um 17:03 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    ex0dus (31.12.2015)

  10. #7
    ex0dus ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.12.2015
    Beiträge
    11
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Du mußt für Unterschiede, dem FB jeweils einen Engang spendieren.
    Wenn z.B. Timerwerte unterschiedlich sind, dann also einen Eingang definieren der den Datentyp der Variablen hat, die am Timer zu stehen hat.
    Dann kannst du beim jeweiligen Aufruf des FB an diesen Eingang den Entsprechenden Zeitwert ertragen. Im FB schreibst du die Eingangsvariable an den Input PT des Timers.
    Gleiches machst du mit boolschen Variablen oder Integer etc. Außen an den FB dann die Wert oder auch die exteren Variable, z.Bsp. einen Wert aus dem HMI-DB, falls du da variable Werte übergeben willst, im FB mit der Input-Variablen arbeiten.
    Dies hab ich bereits mit Multiinstanzen wunderbar hinbekommen. Mit etwas googlen und deinen Tipps im Hintergedanken hab ich es problemlos geschafft.
    Wäre da nur noch die Frage ob das mit dem Fehlerfall so ok ist oder ob es eine bessere Möglichkeit gibt.

    lg

  11. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Siehe nochmal oben, hatte gerade nacheditiert.

    Geht schon so, wird aber immer schwieriger zu überblicken, falls dein Programm viel größer wird.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  12. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    ex0dus (31.12.2015)

  13. #9
    ex0dus ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.12.2015
    Beiträge
    11
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Siehe nochmal oben, hatte gerade nacheditiert.

    Geht schon so, wird aber immer schwieriger zu überblicken, falls dein Programm viel größer wird.
    Ja hab ich gesehen.
    Was wäre den die elegantere und übersichtlichere Variante?

    Und bei einem Fehlerfall bin ich mir noch nicht 100%ig sicher wie ich auf einen Fehlerfall reagiere. Falls man es noch nicht aus meinem Posts rausfinden konnte, folgende Station wird derzeit programmiert: http://www.ikhds.com/media/catalog/p...tstr_72dpi.jpg. Was wäre eure Empfehlung bei dieser Station auf Fehler zu reagieren. Alles abschalten bei einem Fehlerfall oder nur die Stationen davor?

    LG

    Edit: Noch eine Frage. Da ich erst durch Ralles Posts erfahren habe, dass man Timer und Flankenerkennungen auch im STAT-Bereich machen kann, sollte man dies immer tun, wenn sie nur in dem FB gebraucht wird? Habe nämlich zurzeit alle Timer und Flankenerkennungen in einem eigenen DB, obwohl die nur in einem FB gebraucht werden. Ich denke es ist besser wenn ich diese Timer und Flankenerkennungen im STAT bereich mache. Was ist eure Meinung dazu?
    Geändert von ex0dus (31.12.2015 um 17:23 Uhr)

  14. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mach es erstmal so, wie du es vorhattest.
    Das "Nacheinander Abschalten" würde ich mir aufheben, falls man noch etwas "schöner2 machen will.

    Variablen, die nur im FB benötigt werden (auch Timer und Flanken) immer im FB. Dessen IDB ist ja sozusagen, sein Gedächtnis und genau dafür da.
    Sollte man dann noch etwas in Richtung HMI und umgekehrt benötigen, dann über die INPUT/OUTPUT/IN_OUT gehen. Das kann man auch mit kompletten Strukturen machen, wenn nötig, aber nutze erst einmal die normalen vorhandene Datentypen für die Schnittstelle des FB zum übrigen Programm.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. Aufgabentrigger mehrfach verwenden
    Von Januar im Forum HMI
    Antworten: 2
    Letzter Beitrag: 14.08.2015, 10:51
  2. Sonstiges FUP-Ausgang mehrfach verwenden
    Von M_a-r_k-u_s im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 04.05.2015, 09:54
  3. FB mehrfach verwenden
    Von RH1950 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 16.01.2012, 13:37
  4. Baustein mehrfach verwenden (gleicher Zeitstempel)
    Von SPSstudent im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.02.2010, 12:57
  5. FB58 (Regler) mehrfach verwenden
    Von Lars Bizare im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 08.11.2005, 09:30

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •