TIA Rolladensteuerung - ein Taster

koisis

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

ich bin noch am Anfang meiner Karriere und habe bis jetzt auch nur einfache Programme im FUP erstellt.

Ich soll ein Programm für eine Rollosteuerung machen.
Die Funktion soll mit nur einem Taster realisiert werden.

1.Erster Tastendruck - Rollo fährt für 30s auf
2.Entweder die Zeit läuft ab und der Motor Stoppt oder der Taster wird betätigt und der Motor stoppt.
3.Bei erneutem Tastendruck fährt der Motor für 30s ab- es sei denn der Taster wird betätigt dann stoppt der Motor
4.Usw

Ich sitz hier seit 2 Tagen und kriegs nicht gebacken-

Ich habe schon alles mögliche probiert mit FLipflops und Zählern alles ohne Erfolg.
Drum hier die Anmeldung.

Hoffe jemand nimmt sich die Zeit mir zu helfen, so daß ich selber auf die Lösung komme.
oder einen Link wo ich mir die Lösung erarbeiten kann wär super

Gruß
k.
 
Benutz' doch mal die Forumssuche. Bin mir sicher, dass Du da fündig wirst.

Als Basis kann Dir eine Stromstoßschaltung dienen, dazu findest Du auf jeden Fall was in der Abteilung FAQ.
Das Ganze dann mit Timern und Flankenabfragen erweitern.

Wenn's dann hakt, wird Dir hier bestimmt auch weiter geholfen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke.
Ich habe so ähnliche Beispiele gefunden.

Die Tasterschaltung funktioniert.

Die Flankenauswertung kapier ich aber nicht, wie ich das machen soll. (p, p=, p_trig oder r_trig ???)
Wenn ich einen TOF oder TP angestossen habe kann ich die auch nicht mehr zurücksetzen und beide Ausgänge könnten dann gleichzeitig kommen.

Übe an einer S7-1200 mit TIA
Gruß
k.
 
Danke.
Beispiele habe ich gefunden.

Die Tasterschaltung funktioniert.

Die Flankenabfragen kapier ich aber nicht wie ich das machen soll. Was muss ich da nehmen ? p, p=, p_trig, r_trig ??
Wenn ich die Fahrzeit mit TOF oder TP angestossen habe kann ich auch nicht mehr zurücksetzen und somit könnten beide Ausgänge gleichzeitig kommen.
Die Verriegelung nutz mir da auch nichts.

Bitte noch einen Denkanstoss mehr

Übe an einer s7-1200 mit TIA.

Gruß
k.
 
Hast du dir die Hilfe von den Flanken schonmal angeschaut?
Die Hilfe ist nicht schlecht. Da steht genau drin wie die funktionieren und wie sie beschaltet werden!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Flankenabfragen kapier ich aber nicht wie ich das machen soll. Was muss ich da nehmen ? p, p=, p_trig, r_trig ?
Prinzipiell machen die von Dir aufgeführten Flankenerkennungen erst mal das Gleiche -> sie detektieren eine Signalquelle auf High, die im vorhergehenden Zyklus noch auf Low war -> eine sogenannte High-Low- bzw. positive Flanke.
Unterschiede gibts dann bei der Signalquelle, sowie der Weiterverarbeitung:
P-Trig -> prüft das Ergebnis der kompletten vorhergehenden Verknüpfungskette und das Ergebnis kann weiterverknüpft werden.

R-Trig -> im Prinzip das Gleiche, nur mit der zusätzlichen Möglichkeit, die Flankenprüfung über einen separaten Eingang frei zu geben bzw. zu sperren.

- (P) -˧ = P-Trig und Zuweisung (=) kombiniert

-| P | - = Flankenprüfung eines einzelnen Operanden und nicht der gesamten vorhergehenden Verknüpfungskette!
In Deinem Fall würde ich -(P) auswählen, da Du vermutlich das Ergebnis der Tasterflanke an mehreren unterschiedlichen Stellen (Netzwerken) benötigen wirst. Daher weist man das Ergebnis einer eigenen Variablen zu, mit der man dann arbeitet.
 
Bitte noch einen Denkanstoss mehr
Code:
Zuerst mußt Du mal mittels Flankenabfrage einen [U]neuen[/U] Tastendruck detektieren.

Bei neuem Tastendruck muss man die Startfunktion aktivieren, wenn der Timer noch nicht läuft.

Läuft er dagegen bei neuem Tastendruck, muss die Stopfunktion durchlaufen werden.

Soll gestartet werden, wird ein Timerimpuls der gewünschten Länge ausgelöst.

Soll gestoppt werden, wird dieser Timer mit der Funktion "Rücksetzen Timer" manuell zurück gesetzt.

Mit jeder Abschaltung des Timers (= negative Flanke), wird ein Richtungszeiger invertiert (= Stromstossschaltung).

Läuft der Timer und der Richtungszeiger sagt "Auf" wird dieser Ausgang eingeschaltet.

Läuft der Timer und der Richtungszeiger sagt "Ab" wird jener Ausgang eingeschaltet.

Jetzt kannst Du überlegen, welche IN-, OUT-, STAT- und TEMP-Variablen Du brauchst und warum. Leg' das hier ruhig dar, dann können wir besser beurteilen, was verstanden wurde und wo's noch hapert.
Anschließend kannst Du die einzelnen Netzwerke durchgehen.
Notfalls auch beides gemeinsam Schritt für Schritt.
 
Zuletzt bearbeitet:
Die Beschreibung ist super. Danke dafür. Ich war mir sicher daß ich das so hinbekomme, es geht aber nicht.

Ich versuche den FC hochzuladen, vielleicht geht das wenigstens.

Danke für die Beschreibung
 
Beim drucken als pdf und konvert. in jpg sind wohl paar Buchstaben verschütt gegangen.
Hoffe man kanns trotzdem lesen
 
Also ganz prinzipiell, ohne mir das näher angesehen zu haben:

Du hast Daten in Deinem Baustein, die nur diesen betreffen, aber im nächsten Zyklus wieder benötigt werden. Sowas speichert man üblicherweise in Instanzdatenbausteinen.

Fällt Dir dazu was ein?
;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und das Arbeiten mit Merkern in Bausteinen würde ich mir gar nicht erst angewöhnen.

Du solltest im Baustein nur lokale Variablen verwenden. Schon deshalb, damit man den Baustein für mehrere Rollläden verwenden kann und nicht für jeden einen separaten schreiben muss.
 
Wenn du Probleme mit der Flankenauswertung hast, dann bastel dir doch selber einen... bin mal so frei gewesen und habe das eben mal runter geschrieben..
Solltest du kein AWL haben, dann ist ja kein Ding den Code in FUP zu machen... Und unten siehst du auch eine Möglichkeit, wie man eine Flanke sich selber basteln kann.
Code eben noch schnell getestet... erfüllt deine Beschreibung... würde es dennoch noch "erweitern"... z.B. ist das Rollo immer unten, wenn ich die SPS startet??? aber das musst du selber machen

Code:
// OB 100
// Initialisierung
//      L     0
//      T     "MB0"
//      SET
//      =     "M0.0"
//OB 100
//
//
// OB 1 bzw. FC
//
// Flankenauswertung
      U     "Taster"             //E0.0
      U     "Hilfsmeker"             // M60.0
      =     "Taster_pos_Flanke"             // M10.0
      UN    "Taster"
      =     "Hilfsmeker"
// T1
      U     "M0.4"
      UN    "M0.0"
      S     "M0.0"
      R     "M0.4"
// T2
      U     "M0.3"
      U     "Taster_pos_Flanke"
      S     "M0.4"
      R     "M0.3"
// T3
      U     "Timer_2"    // U T2        // Timer T2 abgelaufen
      S     "M0.4"
      R     "M0.3"
//------
      U     "M0.3"
      UN    "M0.4"
      L     S5T#30s
      SE    "Timer_2"
// T4
      U     "M0.2"
      UN    "M0.3"
      U     "Taster_pos_Flanke"
      S     "M0.3"
      R     "M0.2"
// T5
      U     "M0.1"
      UN    "M0.2"
      U     "Taster_pos_Flanke"
      S     "M0.2"
      R     "M0.1"
// T6
      U     "Timer_1"         //U T1   // Timer 1 abgelaufen
      S     "M0.2"
      R     "M0.1"
//------------------
      U     "M0.1"
      UN    "M0.2"
      L     S5T#30s
      SE    "Timer_1"
// T7
      U     "M0.0"
      UN    "M0.1"
      U     "Taster_pos_Flanke"
      S     "M0.1"
      R     "M0.0"
//Ausgänge
      U     "M0.1"  
      =     "Rollo_hoch"             //A0.0
      U     "M0.3"
      =     "Rollo_runter"             //A0.1

Nachtrag: Und hier der Plan für den Code

Roll.jpg
 
Zuletzt bearbeitet:
Ich glaub' nicht, dass ihm das beim Lernen wirklich weiter hilft.
Er ist kein Häuslebauer!
;)

Mal davon abgesehen, das ein Rollladenbaustein mit Merkern immer ein schlechtes Beispiel ist.
Und auch die Siemenstimer sind m.M.n. da eher eine schlechte Wahl.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was meinste mit Häuslebauer? :shock:
Ich finds immer gut, wenn man auch eine fertige Lösung hat. Noch besser sind verschiedene Lösungsmöglichkeiten für eine Aufgabenbeschreibung... dann kann man selber etwas tüffteln in Bezug auf eine andere Aufgabe und selber die unterschiedlichen Möglichkeiten probiert :) Und dann entwickelt man mit der Zeit ein Gespür, wie s am besten ist. Aber jeder lernt ja anders :)
 
Hi Leute,

super daß ihr Anfänger wie mich nicht gleich zum Teufel jagt. Bin noch in einem Sportlerforum-da sind paar Nasen unterwegs kann ich euch sagen.

Ok, bin im Moment noch auf Arbeit. Ich schau mir heut abend den Code von shutdown an. Ich hoffe ich kann dann die Logik die dahinter steht nachvollziehen.


Ich bin natürlich dankbar für alle Tips wie man "richtiges" schreiben von Code von Anfang an angehen sollte.
Will mir auch keinen Stil- wenns komplizierter wird wieder abgewöhnen müssen.

Also nochmals danke an euch!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was meinste mit Häuslebauer? :shock:
Ich finds immer gut, wenn man auch eine fertige Lösung hat.
Hier im Forum wird immer wieder betont, das man sich in der Ausbildung Befindlichen Hilfe zur Selbsthilfe und keine fertigen Lösungen (noch dazu ohne weitere Erklärungen) gibt. Das musste ich mir sogar schon trotz vorhergehenden wochenlangen Erklärungen meinerseits anhören.
Bei (vermeintlichen) Errichtern eines Eigenheims, die ihre Automatisierung selbst erstellen, liegen die Prioritäten dagegen ganz klar auf schneller Problemlösung.


Aber wenn's denn so sein soll:
Ich bin natürlich dankbar für alle Tips wie man "richtiges" schreiben von Code von Anfang an angehen sollte.
Will mir auch keinen Stil- wenns komplizierter wird wieder abgewöhnen müssen.
Mal davon abgesehen, das ein Rollladenbaustein mit Merkern immer ein schlechtes Beispiel ist.
Und auch die Siemenstimer sind m.M.n. da eher eine schlechte Wahl.
Für gewöhnlich hast Du im Haus ja nicht nur einen Rollladen sondern mehrere. Wenn Du im Rollladen-Baustein Merker verwendest, sind diese feste globale Adressen, so dass Du diesen Baustein auch nur für einen einzigen Rolladen verwenden kannst.
Verwendest Du dagegen im Baustein nur lokale Variablen, kannst Du den Inhalt der globalen Adressen, wie Ein-/Ausgänge beim Bausteinaufruf über die Schnittstelle an die lokalen Variablen übergeben und so ein und den gleichen Baustein für alle Rollläden verwenden.
Auch bei eventuellen Änderungen mußt Du dadurch nur einen Baustein bearbeiten, anstatt sie bei jedem Rollladen durch zu führen.

In diesem Rollladen-Baustein hast Du Daten, die Du vom aktuellen Zyklus zum nächsten speichern mußt und auch nur für diesen brauchst. Dazu gehören z.B. Flankenmerker und Multiinstanzen von IEC-Timern. Immer wenn Du solche Daten hast, solltest du einen FB verwenden. Dann legt jeder Aufruf des FBs seine Daten in seinem eigenen Instanzdatenbaustein ab. Bist Du Dir nicht sicher, ob Du einen FB brauchst oder auch ein FC reicht, bist Du mit dem FB auf der sicheren Seite.

Somit hast Du für jeden Rollladen zwar immer den gleichen FB, aber jeder hat seine eigenen Ein-/Ausgänge an der Schnittstelle beim Aufruf und seine eigenen zu merkenden Daten, wie Flanken und Laufzeiten, in seinem IDB.

Und deshalb ist hier ein IEC-Timer auch die bessere Wahl (mal davon abgesehen, dass die S7-1200 die S7-Timer auch gar nicht hat!), da diese als Multiinstanz angelegt ihre Daten ebenfalls im IDB des Rollladen-FBs speichern. Somit hat jeder Aufruf des FBs auch automatisch seinen eigenen Timer. Bei den S7-Timern müsste man einen Eingang an der Baustein-Schnittstelle anlegen und bei jedem Aufruf des Bausteins eine andere Timernummer übergeben. Geht zwar auch, ist aber hier umständlicher, da Du eh' noch andere Daten hast, die im IDB gespeichert werden sollten. Die Übergabe der Timernummer ist vor allem eine Möglichkeit für mehrfach nutzbare FCs mit Timern.


Dann hatte ich geschrieben, dass man überlegen muss, welche Variablen man benötigt:
1. reine Eingänge: Als Erstes steht hier natürlich der Taster zu Buche. Dessen Zustand muss man in den Baustein hinein bringen. Ausgeben muss man an den Taster nichts, daher nur IN.
Dann ist es ratsam, auch die gewünschte Laufzeit variabel in den Baustein zu geben, denn die Rollläden können ja unterschiedlich groß sein und damit verschieden lange laufen. Dabei kann man am Besten eine Standardzeit vorgeben, dann muss man dies nicht bei jedem Aufruf wiederholen, sonder nur wenn die gewünschte Laufzeit davon abweicht.

2. reine Ausgänge: Die Motorausgänge "Auf" und "Ab" sollen nur von diesem Baustein beeinflusst werden und das auch in jedem Zyklus von neuem. Daher kannst Du reine Ausgänge benutzen. Würdest Du dagegen z.B. den bisherigen Zustand in die Entscheidung für den neuen Zustand einfliessen lassen oder auch außerhalb des Bausteins auf diese Einfluss nehmen, dann sollte ein IN/OUT die Wahl sein. Das Gleiche gilt im Normalfall auch bei Verändern mit Setzen und Rücksetzen (vor allem in FCs!), da dies für gewöhnlich nicht in jedem Zyklus passiert!

3. Schließlich die Variablen, die nur innerhalb des Bausteins benötigt werden und keinen "Kontakt" zu den restlichen Bausteinen haben:
Da wären zuerst die Typen, die erst im Baustein zugewiesen/beschrieben und dann in weiteren Netzwerken lesend benutzt werden. Diese kann man temporär anlegen - das heißt, sie werden mit Beendigung des Bausteins zum Überschreiben freigegeben (das bedeutet nicht immer, das dies auch tatsächlich passiert, aber man sollte erst mal davon ausgehen!).
Zum anderen hat man Variablen, die man in einem Zyklus beschreibt und im nächsten erst wieder liest. Diese muss man als statisch anlegen.
Ein ganz typisches Beispiel dazu ist die Flankenerkennung:

Der Taster ist ein Signal von außerhalb des Bausteins, dass im Baustein verarbeitet wird, aber an das nichts außgegeben wird -> Eingang
Der Flankenmerker FM_Taster speichert den Zustand von Taster aus dem vorigen Zyklus (im ersten Zyklus schreiben, im 2. lesen) - daher unbedingt statisch!
Der Melder "Flanke" wird nur im aktuellen Zyklus benötigt (im nächsten wird ja wieder neu entschieden) - daher reicht temporär.
Wenn Du Dir nicht sicher bist - lieber auf Nummer sicher gehen und statisch speichern.

Dann wollen wir mal überlegen, was Du unbedingt von einem Zyklus zum nächsten speichern mußt:
den Zustand des Tasters (FM_Taster), den Zustand des Timerausgangs (FM_Timer) und die letzte Richtung des Rollladens.
Außerdem wird der IEC-Timer beim Anlegen als Multiinstanz automatisch ebenfalls im STAT-Bereich gespeichert. Das kann man zwar auch selbst machen, aber zu Beginn ist es besser/sicherer, das von TIA beim Ziehen des Timers ins Netzwerk automatisch übernehmen zu lassen.
Variablen, die im aktuellen Zyklus erst festgelegt und dann verwendet werden:
wurde eine Flanke des Tasters detektiert (Flanke_Taster) und soll damit der Timer gestartet (Start) oder gestoppt (Stop) werden.
Man könnte noch die detektierte negative Flanke des Timers in einer temporären Variablen speichern, doch da diese nur an einer Stelle benötigt wird, kann man das Ergebnis auch direkt weiter verarbeiten.

Somit würde ich z.B. folgende lokale Variablen (=Bausteinschnittstelle) anlegen:


Dann die einzelnen Netzwerke, wie oben beschrieben:
Da der Zustand des Timers entscheidend für die auszuführende Aktion ist, muss diese unbedingt vor dem Starten oder Stoppen des Timers festgelegt werden!
Beim Verarbeiten des Timerausgangs im Netzwerk 2 und 3 wird TIA meckern, da es den Timer vor Erstellen des Netzwerks 4 noch gar nicht gibt. Deshalb sollte man vorher den Timer erst mal im NW4 als Multiinstanz anlegen und dann erst die beiden vorigen Netzwerke fertig stellen (oder das Meckern von TIA einfach ignorieren).



So, das soll nun wahrlich erst mal genug Erklärung sein. Den Aufruf des FBs mit dem Anlegen des IDBs solltest Du allein hinbekommen.
Im nächsten Schritt kannst Du dann den FB ein weiters mal mit einem anderen Taster und anderen Ausgängen aufrufen.




PS: Die Verwendung von lokalen Variablen in FCs und FBs würde ich an Deiner Stelle von Anfang an generell praktizieren. Ich persönlich hab' ziemlich lange gebraucht, ehe ich den "Murks" mit den Merkern wieder raus hatte.
Und was ich jetzt hier schlechterweise nicht gemacht habe, Du Dir aber ebenfalls von Anfang an angewöhnen solltest - kommentieren, kommentieren und noch mal kommentieren. Wenn Du das nicht machst, wirst Du sehr oft bemerken, dass Du schon teilweise kurze Zeit später nicht mehr weißt, was Du Dir beim Coden da so gedacht hast.
;)
 
Zuletzt bearbeitet:
Hier im Forum wird immer wieder betont, das man sich in der Ausbildung Befindlichen Hilfe zur Selbsthilfe und keine fertigen Lösungen (noch dazu ohne weitere Erklärungen) gibt. Das musste ich mir sogar schon trotz vorhergehenden wochenlangen Erklärungen meinerseits anhören.

Alles klar... war mir nicht bewußt..:eek: werd mich dran halten beim nächsten mal...

Wenn es nach meinem ehemaligen Prof. gehen würde, dann ist das Bild Dokumentation genug und selbst erklärend. Die Umsetzung des Bildes in Code ist nur noch eine Fingerübung (gibt auch Tools, die das für einen übernehmen). Deswegen auch keine weitere Erkärung. Gibt genug Fachbücher dazu. Das "Verfahren" welches ich genutzt habe schimpft sich SIPN (steuerungstechnisch interpretierbare Petrinetze). Ich finde die Nutzung von Merkern auch nicht optimal... Gründe hat hucki ja schon genannt.. Aber die SIPN werden mit Merkern umgesetzt... :roll: sicherlich kann man den Entwurf des SIPN auch in einer gekapselten Funktion unterbringen. Das wäre dann schon mal besser.

Jetzt haben wir hier zwei Lösungen... einmal eine ablauforientierte und eine verknüpfungsorientierte Methode... ist doch auch was...

mir war gar nicht bewußt, dass es auf der 1200er keine S7-Timer existieren. Aber hast recht... am besten ist es immer, wenn man sich an die IEC-Norm hält... und am besten hardwareunabhängig programmiert... Also auch die Taktmerkerbits der CPU nicht aktivieren!!

Achja, ... ist die Flankenerkennung auch IEC-Norm ? :confused:
 
Zurück
Oben