Step 7 Schritt zu Schritt Programmieren

inancolak

Level-2
Beiträge
35
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich programmiere gerade ein Zylinderkontrollprogramm. Das Programm soll Schritt für Schritt arbeiten und insgesamt 7 Schritte haben. Wie die Zylinder behandelt werden, soll zunächst für jeden Schritt die Information über das HMI eingegeben werden. Ich habe alle Schrittinformationen durch ein Programm namens "SchrittZustand" gespeichert, also für jeden Schritt ein Array an Variablen, insgesamt also 7 unterschiedliche Array-Variablen. Allerdings habe ich einige Probleme bei der "SchrittAktion", wenn ich die Informationen abrufe.

Weil alle Schritte von oben nach unten geschrieben wurden, ruft die Funktion aufgrund des SPS-Arbeitsprinzips direkt die unterste Information ab. Ich weiß sogar, woran das Problem liegt, kann es aber leider nicht vermeiden. Könnten Sie mir helfen ?
 

Anhänge

  • SchrittZustand.PNG
    SchrittZustand.PNG
    32,1 KB · Aufrufe: 65
  • SchrittAktion.PNG
    SchrittAktion.PNG
    49,7 KB · Aufrufe: 50
  • Ventilaktion.PNG
    Ventilaktion.PNG
    44 KB · Aufrufe: 41
  • Ventilaktion_FB.PNG
    Ventilaktion_FB.PNG
    11,1 KB · Aufrufe: 58
  • HMI.PNG
    HMI.PNG
    326 KB · Aufrufe: 65
Zuviel Werbung?
-> Hier kostenlos registrieren
... also für jeden Schritt ein Array an Variablen, insgesamt also 7 unterschiedliche Array-Variablen. Allerdings habe ich einige Probleme bei der "SchrittAktion", wenn ich die Informationen abrufe.
:unsure: 7 unterschiedliche Arrays kann ich ja noch verstehen, aber ich hätte jetzt erwartet:
mehrere Arrays, z.B. für jeden SollZustand ein Array mit 7 Array-Elementen pro Array, wobei der Index dann die SchrittNummer wäre?
 
Ich hab es jetzt zwei mal gelesen und verstehe nicht was das Problem ist.

ich habe auch bemerkt, dass ich nicht so gut erklärt habe. Kannst du dir die neu hinzugefügten Bilder ansehen? Anstatt die Informationen Schritt für Schritt abzurufen, erhält die Funktion im zweiten Bild nur die Informationen aus dem letzten Schritt (erster Bild) .
 

Anhänge

  • Schritt7.PNG
    Schritt7.PNG
    14,3 KB · Aufrufe: 25
  • SchrittAktion.PNG
    SchrittAktion.PNG
    32,7 KB · Aufrufe: 25
:unsure: 7 unterschiedliche Arrays kann ich ja noch verstehen, aber ich hätte jetzt erwartet:
mehrere Arrays, z.B. für jeden SollZustand ein Array mit 7 Array-Elementen pro Array, wobei der Index dann die SchrittNummer wäre?

Genau, in den Arrays habe ich die Schrittnummer auch als Zählerzahl hinzugefügt. Also wenn die Zeit abgelaufen ist, muss Ausgang geschrieben werden und dann nächste Schritt gehen.
 

Anhänge

  • Arrays.PNG
    Arrays.PNG
    15,1 KB · Aufrufe: 12
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum machst du das nicht einfach in einer Schrittkette?

Deine Daten der Hmi Eingabe speicherst du in einer Udt, diese rufst du als Array in einem Datenbaustein auf und bastelst dir dann nur noch einen Graphen mit einem Jobhandler, der dann nach ausführen des Jobs eben einen Index weiterzählt bis die maximale Anzahl an Schritten abgearbeitet wurde. So musst du nur vor dem Jobhandler einmal die Daten des nächsten Schrittes in ein Arbeitsfach umladen und dann nur zwischen Zylinder 1 und Zylinder 2 differenzieren.
 
Kannst du vielleicht mal (am besten mit Screenshots der Onlinesicht) zeigen, was du siehst und was deiner Meinung nach nicht korrekt ist?

Und dann zustäzlich was du eigentlich sehen möchtest?
 
Kannst du vielleicht mal (am besten mit Screenshots der Onlinesicht) zeigen, was du siehst und was deiner Meinung nach nicht korrekt ist?

Und dann zustäzlich was du eigentlich sehen möchtest?
Linke Seite im Schritt 2; obwohl schon Schritt2 aktiv ist und AGST-Signale True ist, rechte Seite ist die AGST-Signale ist False. Die funktionen von rechte Seite nehmen nur die Zustand von letzte Schritt.
 

Anhänge

  • beideFunktion.PNG
    beideFunktion.PNG
    121,5 KB · Aufrufe: 27
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wenn die Zeit abgelaufen ist, muss Ausgang geschrieben werden und dann nächste Schritt gehen.
:unsure: Also eine SchrittKette, in der zwar auf das Erreichen eines SollZustandes gewartet wird, aber bei Ablaufen eines TimeOut vor Erreichen des SollZustandes ganz radikal zum nächsten Schritt weitergeschaltet wird?

Mittlerweile vermute ich, dass es nicht um eine SchrittKette im üblichen Sinne geht. Es soll gar nicht auf das Erreichen eines SollZustandes gewartet, sondern ausschliesslich in einem ZeitTakt weitergeschaltet werden?
 
Zuletzt bearbeitet:
Du verwendest direkte Zuweisungen in deinem FB3 welchen du mit verschiedenen Instanzen aufrufst.
Das kann so nicht funktionieren.

Wenn dein Programm so bleiben soll, musst du den FB3 bedingt aufrufen. (mit der "Schritt aktiv"-Bedingung)
Ansonsten werden die Ausgänge von allen Instanzen des FB3 überschrieben und da gewinnt eben der letzte Aufruf.
 
:unsure: Also eine SchrittKette, in der zwar auf das Erreichen eines SollZustandes gewartet wird, aber bei Ablaufen eines TimeOut vor Erreichen des SollZustandes ganz radikal zum nächsten Schritt weitergeschaltet wird?

Mittlerweile vermute ich, dass es nicht um eine SchrittKette im üblichen Sinne geht. Es soll gar nicht auf das Erreichen eines SollZustandes gewartet, sondern ausschliesslich in einem ZeitTakt weitergeschaltet werden?
Also die Zeit ist nicht konstant und soll über dem HMI eingestellt wird. Nachdem die gewünschte Zeit abgelaufen ist, muss erst Zylinder Soll-Zustand zufahren. Und dann das Programm zu nächster Schritt gehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also die Zeit ist nicht konstant und soll über dem HMI eingestellt wird. Nachdem die gewünschte Zeit abgelaufen ist, muss erst Zylinder Soll-Zustand zufahren. Und dann das Programm zu nächster Schritt gehen.
Du hast im FB3 deine Ausgänge direkt zugewiesen und rufst diesen mehrfach auf, somit "gewinnt" die letzte aufgerufene Instanz vom FB3 den Kampf um die Signale.
 
Warum machst du das nicht einfach in einer Schrittkette?

Deine Daten der Hmi Eingabe speicherst du in einer Udt, diese rufst du als Array in einem Datenbaustein auf und bastelst dir dann nur noch einen Graphen mit einem Jobhandler, der dann nach ausführen des Jobs eben einen Index weiterzählt bis die maximale Anzahl an Schritten abgearbeitet wurde. So musst du nur vor dem Jobhandler einmal die Daten des nächsten Schrittes in ein Arbeitsfach umladen und dann nur zwischen Zylinder 1 und Zylinder 2 differenzieren.
Um das mal kurz zu visualisieren:

1721296257390.png1721296257390.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du verwendest direkte Zuweisungen in deinem FB3 welchen du mit verschiedenen Instanzen aufrufst.
Das kann so nicht funktionieren.

Wenn dein Programm so bleiben soll, musst du den FB3 bedingt aufrufen. (mit der "Schritt aktiv"-Bedingung)
Ansonsten werden die Ausgänge von allen Instanzen des FB3 überschrieben und da gewinnt eben der letzte Aufruf.

Das Programm soll eigentlich nicht so bleiben hast du bessere Idee ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das was @DCDCDC ja schon im beschrieben hat.
Trenne die Ansteuerung der Ventile von der Schrittkette.
Du gibst in der Schrittkette nur das Kommando an das Ventil (ein-/ausfahren) und wartest in der Schrittkette auf die Rueckmeldung (wie auch immer die aussieht) das das passiert ist
 
Zurück
Oben