TIA Abläufe speichern

Frank_the_Tank

Level-1
Beiträge
29
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,


ich habe folgendes Problem:

Es soll ein Teststand gebaut werden mit dem Zylinder verfahren werden können.
Die Zylinder sollen über Taster gesteuert werden.
Die Idee ist das gespeichert wird wielange ein Zylinder fährt, dies gespeichert wird und der Ablauf dann von der Steuerung wiederholt werden kann.
Habt Ihr hier vill eine Idee wie ich das angehen kann?

Software:
TIA V12

Hardware:
S7 1200

Vielen Dank für Eure Hilfe

Frank
 
Hi Frank

die 1200 hat neben TP, TON und TOF auch noch den nicht normgerechten TONR. Der kann ganz gut Zeit messen, muss aber explizit wieder zurückgesetzt werden.
Irgenwie muss dein System drei Zustände unterscheiden. 1. Initialisieren, 2. Lernphase, 3. Verwendung.

Also für jeden Zylinder gibt es einen Taster und eine Instanz eines TONR. Dann gibt es noch in einem Retain-Bereich einen Merker für den Zustand und für jeden Zylinder den gemerkten Zeitwert.
Du hast nicht verraten, wann der Zylinder weit genug gelaufen ist. Hoffentlich, gibt es einen Endschalter, der dann den Taster außer Funktion setzt. Augenschein wäre blöd, denn man kann den TONR nicht runterzählen lassen.

Schritt 1. Alles auf Null.

Schritt 2. Lernphase beginnen. Was immer das auslösen mag, ein Panel oder ein weiterer Taster, oder ein Steuern mittels Variablentabelle.
Wenn der Taster gedrückt wird, dann gibt damit damit den zugehörigen TONR frei. Wenn die Taste losgelassen, dann bleibt auch der TONR stehen.

Schritt 3. Lernphase beenden. Was immer das auslösen mag, ein Panel oder ein weiterer Taster, oder ein Steuern mittels Variablentabelle.
Die Werte aus den TONR in die retain Bereiche kopieren, damit sie nach dem nächsten Stromausfall noch da sind.

Schirtt 4. Auf zur Verwendung: Was immer das auslösen mag, ein Panel oder ein weiterer Taster, oder ein Steuern mittels Variablentabelle.
Was immer dein Auslöser sein mag, der für den Zylinder gemerkte Wert, kann nun für einen TON verwendet werden.

Und übrigens: in KOP/FUP, kann man dafür sogar die selbe Instanz für TONR und TP verwenden, denn dort hat die den Datentyp IEC_TIMER. Warum SCL hier zwischen TONR_TIMER und TP_TIMER unterscheiden muss ist mir schleierhaft.

'n schönen Tach auch
HB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würds etwas anders machen. Und zwar bei Aufzeichnung Start einen Timer auf 0 setzen, und dann die Signale die später abgespielt werden sollen auf Änderung überwachen. Ändert sich ein Signal, werden der Zeitpunkt (als Offset zum Startpunkt t=0) und die Signalzustände abgespeichert.
Bei Abspielen wird dann wieder eine Zeit gestartet und zu den gespeicherten Zeitpunkten die Signale ausgegeben.

Dann hat man einen Speicherbereich wie
Code:
Samples : ARRAY [0..511] OF  STRUCT // je nach Anzahl der aufzuzeichnender Signaländerungen
  TimeOffset : TIME;
  Signals : ARRAY[0..15] OF BOOL; // je nach gewünschter Anzahl an Signalen
END_STRUCT;
in dem man schon einiges unterbringen kann.
 
irgendwie muss man den ablauf abspeichern. z.b. in jedem taster-db jeweils die sequenz aus dauer + tasterzustand (an/aus) (--> UDT "TASTER") hinterlegen und später per Schleife abarbeiten (alle achsen parallel).

oder du lässt beim lernen einen globalen Zähler als Referenz laufen und speicherst dir für jeden Taster nur die an-Zustände+globalem Zählerstand in den jew. Taster-DB weg. Beim Abarbeiten vergleichst du für jeden Eintrag, ob der Zählstand erreicht oder überschritten wurde und aktivierst den jew. Ausgang für die gemerkte Dauer.


Kann man das System in unterschiedlichen Geschwindigkeiten verfahren?
 
Thomas' Idee ist auch nicht schecht: alle Taster-Eingänge in ein Bitmuster codieren und Änderungen protokollieren. Beim Abspulen einfach die Sequenz durchlaufen und das jeweilige Bitmuster zum ab jew. prot. Zählerstand demuxen und auf die Ausgänge jagen

Hat den Vorteil, man braucht theoretisch nur 1 Timer, den "Zeitstrahl" eben
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würds etwas anders machen. Und zwar bei Aufzeichnung Start einen Timer auf 0 setzen, und dann die Signale die später abgespielt werden sollen auf Änderung überwachen. Ändert sich ein Signal, werden der Zeitpunkt (als Offset zum Startpunkt t=0) und die Signalzustände abgespeichert.
Bei Abspielen wird dann wieder eine Zeit gestartet und zu den gespeicherten Zeitpunkten die Signale ausgegeben.

Dann hat man einen Speicherbereich wie
Code:
Samples : ARRAY [0..511] OF  STRUCT // je nach Anzahl der aufzuzeichnender Signaländerungen
  TimeOffset : TIME;
  Signals : ARRAY[0..15] OF BOOL; // je nach gewünschter Anzahl an Signalen
END_STRUCT;
in dem man schon einiges unterbringen kann.

Dann hat man nachher das ganze Getaste wieder -- glaube nicht, dass das die Aufgabenstellung ist. Meine Lösung ermittelt die Summe der gedrückten Zeit für jeden der Zylinder.
 
Dann hat man nachher das ganze Getaste wieder -- glaube nicht, dass das die Aufgabenstellung ist. Meine Lösung ermittelt die Summe der gedrückten Zeit für jeden der Zylinder.
Die Funktion ist aber gegeben, und so lassen sich auch lange Abläufe und gleichzeitg betätigte Taster aufzeichnen.
Zum Abspielen startet man einen einzigen Timer mit der Laufzeit der Zeit beim letzten Sample.
Bei Start setzt man den Array-Index auf Null, und erhöht den Index jeweils wenn die Timer-Ablaufzeit >= der Zeit an der Array-Position ist.
Die Ausgänge bekommen dann das Signal an der aktuellen Array-Position. Das lässt sich auch in FUP in ein paar Netzwerken programmieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Funktionsweise habe ich verstanden, ich weiss nur nicht wie ich das in Fup machen soll. Das Problem ist das ja nicht bekannt ist in welcher Reienfolge die Taster gedrückt werden und ich nicht weiss wie ich die Zeit und den Ausgang unter einer Variablen speichern kann die dann beim zweiten Taster einfach hochzählt?

MfG Rene
 
Eine Zeit direkt als Versatz zu einem Startzeitpunkt bekommst du beispielsweise, wenn du einen TON-Timer mit der maximalen Dauer von 24 Tagen bei Aufzeichnung startest, und dann den Ausgang ET bei Änderung eines Signals zusammen mit deinen Signalzuständen wegspeicherst. Bei Aufzeichnung und Wiedergabe benötigst du somit nur jeweils einen Timer, oder lässt beide Funktionen in einem Zeitinterrupt laufen, dann gehts auch ganz ohne Timer.
Wenn du bei Änderung eines Signals immer alle Signalzustände mitspeicherst, ist es egal in welcher Reihenfolge die Taster gedrückt werden. Bei der Wiedergabe der Sequenz werden dann alle Signalzustände 1:1 so ausgegeben wie sie aufgezeichnet wurden. Das wäre zumindest mein Vorschlag. Das ist auch in FUP nur etwas mehr als eine Hand voll Netzwerke (je nach Anzahl der Signale).

Hellebarde hatte da aber einen anderen Ansatz. Bei ihm kommt letztenendes (wenn ich das richtig verstanden habe) ein mehr oder weniger lesbares Programm heraus. Bei mir ist das nur eine Aufzeichnungs- und Wiedergabefunktion.
Du hast noch nicht geschrieben für welche Variante du dich entschieden hast.
 
Hallo Frank,

..Das Problem ist das ja nicht bekannt ist in welcher Reienfolge die Taster gedrückt..
Du speicherst bei Änderung eines Eingangs immer ALLE benötigten Eingänge. So wie von Thomas beschrieben habe ich es auch schon einmal umgesetzt, jedoch unter Step7 Classic und in AWL oder/und in SCL. Im Prinzip schreibst du alle zum Teachen benötigten Eingänge in ein Doppelwort. Beim Teachen überwachst du dieses Doppelwort auf Veränderungen und ermittelst die Zeit zwischen den Veränderungen. Beides (Doppelwort mit den Eingangssignalen und die jeweilige Zeitdauer) speicherst du bei jeder Änderung in einem Register (DB - ARRAY OF UDT (DW, TIME). Beim Teachen gibst du das Doppelword mit den Eingangssignalen direkt auf ein weiteres Doppelwort aus. In diesem Doppelwort steht jetzt (beim Teachen) ein Abbild deiner Eingänge. Die Bits dieses DWs verwendest du in deinem Programm genau so, wie du ansonsten die Eingänge verwenden würdest. In der Automatikfunktion gibst du nach Ablauf der jeweils abgespeicherten Zeit das jeweils abgespeicherte DW auf das "Ausgangs-DW". Im Prinzip einfach, aber eventuell schwierig zu verstehen oder zu erklären.

Wenn du das ganze im Weckalarm machst, kannst du die Zeiten sehr genau und vor allem exakt reproduzierbar aus dem Aufrufintervall des OB3* ermitteln. In meinem Fall generiere ich aus den Eingangssignalen Rampen für Sollpositionen von hydraulischen Achsen. Ein möglichst genauer Zeittakt (Weckalarm) ist für die Reproduzierbarkeit sehr zu empfehlen.

Wie werden denn deine Zylinder angesteuert? Fahren sie nur in eine Endlage oder werden sie irgendwie positioniert?


Gruß, Onkel
 
Hi

ich habe
Es soll ein Teststand gebaut werden mit dem Zylinder verfahren werden können.
Die Zylinder sollen über Taster gesteuert werden.
so verstanden, dass es für jeden Zylinder je einen Taster gibt, und solange man den Taster drückt, fährt der entsprechende Zylinder. Lässt man los, dann stoppt der Zylinder und drückt man wieder, fährt er wieder. Und durch etwas was uns Frank nicht verriet, meint derjenige welche da die Taster drückt, dass der eine Zylinder weit genug gefahren ist.

Dann las ich
Die Idee ist das gespeichert wird wielange ein Zylinder fährt,
Ich interpretiere das so, dass es für den einen Zylinder egal ist wie oft man auf den einen Taster gedrückt hat. Letztendlich zählt die Zeit die dieser Zylinder gefahren wurde.

Aus
dies gespeichert wird und der Ablauf dann von der Steuerung wiederholt werden kann
folgere ich: man hat im Programm zwei "Betriebszustände": Lernen, Fahren

Aus
Es können auch Taster gleichzeitig gedrückt werden
folgerte ich, man braucht hier unabhängige "Systeme".

Zum "Lernen" kann man einen TONR pro Zylinder verwenden. Solange dessen Eingang true ist, zählt der TONR die Zeit. Ist der Eingang false, bleibt er stehen, wird aber eben nicht zurückgesetzt. Dazu gibt es einen RESET Eingang an der Box. Drückt man wieder auf den Taster läuft die Zeit weiter.

if "Lernen" then
"Zylinder1_tonr"( IN := "Taster1" );
"Zylinder2_tonr"( IN := "Taster2" );
"Zylinder3_tonr"( IN := "Taster3" );
end_if

if "gelernt" then
"Zylinder1_Zeit" := "Zylinder1_tonr".ET
...
end_if

if "Ablauf_wiederholen" then
"Zylinder1_tp"( IN := "start", PT := "Zylinder1_Zeit", Q => "Zylinder1_Run" )




Aber vielleicht habe ich da alles ganz falsch verstanden, dann entschuldigt dass ich auf die falsche Fährte gelockt habe.

'n schönen Tach auch
HB
 
Hi Flux
Wenn ich nen Zähler im OB3x starte, läuft der dann immer nur während der Bearbeitung des OB3x oder unabh. (also mitm OB1) ?
Zähler zählen wenn sie Flanken sehen. Das hat mit Ablaufebenen gor nix zu tun das.

Bei Zeiten ist das was ganz anderes und hängt davon ab welche AS du hast.

Bei AS300/400 werden die IEC Timer durch SFB realisiert. Die zucken nur, wenn du sie auch aufrufst. Also im OB37 starten (CALL TON, Timer1) und im OB31 auf Timer1.ET zugreifen funktioniert nicht. ET ändert sich nur durch den CALL.
Bei AS1200/1500 werden die IEC Timer durch keine Ahnung was realisiert. Die zucken immer. Also im OB37 starten (CALL TON, Timer1) und im OB31 auf Timer1.ET zugreifen funktioniert. Auch die Abfrage auf Timer1.Q aktualisiert die Instanz!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe heute mal den Vorschlag von Onkel Dagobert in einem PAP zusammengefasst. Die Idee schaut überschaubar und lösbar aus.
Habe dann auch gleich angefangen das in SCL zu schreiben, nur zu vielen Bausteinen gibt es keine Beispiele für die Beschaltung, gibt es da eine Seite oder so wo es mehr Beispiele gibt als bei der Hilfe vom TIA Portal?


Vielen Dank für Eure Hilfe
 
Zuletzt bearbeitet:
Zurück
Oben