TIA Anfänger: Probleme mit Zähler in verschiedenen FBs

theev

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

ich bin in dem Forum so neu, wie ich auch in der Automatisierungstechnik bin. Ich arbeite im Bereich des Maschinenbaus und habe durch einige Projekte immer wieder Schnittstellen mit der Automatisierungstechnik gehabt. Mit der Zeit hat sich mein Interesse in diesem Fachgebiet immer weiter ausgebaut, sodass ich nun selber angefangen habe mich ein bisschen in die Materie einzuarbeiten und das als kleines Hobby bzw. Lern-Projekt gerne fortführen würde.

Wie es mit dem Einstieg immer so ist, ich habe nach vielen Youtube-Videos und einigen Online-Lektüren nun versucht eine eigene Idee umzusetzen. Wie soll es aber anders sein, habe ich direkt ein Verständnisproblem, bei dem Ihr mir hoffentlich helfen könnt.

Ich möchte gerne eine Art-Zähler bauen. Als Veranschaulichung möchte ich dazu kurz folgendes Bild anführen:
- Es gibt 1...n Gefäße die befüllt werden sollen
- Auf einer Visualisierung möchte ich die Behälter aktivieren bzw. deaktivieren
- Ist ein Behälter aktiv, soll ein Ventil für x Sekunden öffnen, dann soll der nächste Behälter befüllt werden
- Ist ein Behälter nicht aktiv, dann soll direkt der nächste Behälter angefahren werden
- Ist der Behälter n erreicht, geht es von vorne los

Ich möchte dazu für jeden Behälter einen FB erstellen, den ich dann von Außen entsprechend beschalte:
Bild_1.png

I_Aktiv = Aktiv ja/nein?
I_Nummer = Nummer des Behälters
Max_Behälter = max. Behälter im System
IO_Counter = Zähler der alle ablaufen soll - entspricht der Zählerwert der Behälternummer, dann entweder befüllen, oder weiterlaufen

Der FB-Inhalt besteht aus 4 NW:

Netzwerk 1:
Wenn die aktuelle Nummer gleich dem Counter ist und der Behälter aktiv ist, dann wird das Ventil gesetzt und mit einer Durchschaltverzögerung eine 1 addiert, um den nächsten Behälter anzusprechen
Bild_2.png

Netzwerk 2+3:
Ist die aktuelle Nummer gleich dem Counter und der Behälter ist nicht aktiv, dann muss kein Timer laufen, sondern es soll direkt hochgezählt werden. Wenn die Nummer nicht dem Counter entspricht, kann das Ventil zudem geschlossen werden.

Bild_3.png

Netzwerk 4:
Auf die Max_Behälteranzahl 1 addieren und dann mit dem aktuellen Counter vergleichen. Ist der Counter größer oder gleich der (maximalen Anzahl+1) dann muss von vorne begonnen werden.
Bild_4.png


Das war es soweit - das funktioniert auch einwandfrei solange immer >= 2 Behälter aktiv sind. Welche sind dabei egal - es kann 1+3 aktiv sein, 1-4, 3+4, 2+3, etc. es funktioniert. Allerdings wenn nur 1 Behälter mit I_Aktiv = TRUE beschaltet ist, dann spinnt alles total rum und ich kann es mir nicht erklären. Es wird ja zyklisch abgearbeitet wird und durch die entsprechenden abfragen innerhalb des Bausteins mit I_Nummer = IO_Counter dürfte er nicht einfach irgendwelche Counter hochzählen, allerdings passiert genau das, wenn nur eine Messstelle aktiv ist.

Kann mir evtl. jemand einen Tipp geben, warum es bei einem aktiven Behälter nicht funktioniert und bei >=2 aktiven Behältern alles gut ist?

Für evtl. nicht eingehaltene Konventionen bei der Verschaltung entschuldige ich mich im Vorfeld :) Es ist mein erster kleiner Versuch (der mir bereits schon jetzt Probleme macht).

Vielen Dank!

Gruß!
 
Zuletzt bearbeitet:
Was jetzt genau dein Problem betrifft, kann ich dir auf Anhieb nicht sagen. Es ist jedoch unüblich das man das Abfragen der "Gesamtbehälter" und Rücksetzen des Zählers in jedem FB macht. Das machst du normal dort, wo du die FBs alles aufrufst.

Du willst x Behälter immer nacheinander abarbeiten. Das ganze quasi dynamisch an die Anzahl der Behälter im System. Musst aber doch irgendwie deine "Max_Behälter" Variable erstellen.
Da wäre es sinnvoller, wenn du in jedem FB einfach einen 2ten Zähler packst, der ganz am Anfang einmal auf 0 gesetzt wird, und jeder FB einfach eine 1 addiert. Dann erhältst du am Bausteinende automatisch die maximale Anzahl der Behälter die du dann mit dem Zähler für "abgearbeitete Behälter" vergleichen kannst und diesen dann zurücksetzt.

Das Problem bei zyklischer Abarbeitung ist, das wenn schon der erste FB-Aufruf den Zähler zurücksetzt, werden die restlichen FB trotzdem abgearbeitet und zählen hoch.

Merke: Abfragen, die für jede Untereinheit unterschiedlich sein können, gehören in den FB-Aufruf. Abfragen die für Alle Untereinheiten Immer gleich sind, macht man 1 mal an der aufrufenden Stelle.
(verbraucht auch weniger Rechenleistung, weil du das nur 1 mal abarbeiten musst)

MfG Fabsi
 
Allerdings wenn nur 1 Behälter mit I_Aktiv = TRUE beschaltet ist, dann spinnt alles total rum und ich kann es mir nicht erklären. Es wird ja zyklisch abgearbeitet wird und durch die entsprechenden abfragen innerhalb des Bausteins mit I_Nummer = IO_Counter dürfte er nicht einfach irgendwelche Counter hochzählen, allerdings passiert genau das, wenn nur eine Messstelle aktiv ist.
Folgende Vermutung ohne Test

Deine Aufrufreihenfolge der FBs ist 1, 2, 3 ...

Wenn nur ein FB aktiv gesetzt ist, erfolgt nach dem 1. Ablauf des Timers innerhalb eines Zyklus folgendes:
Der aktivierte FB schaltet auf den nächsten um, der nächste direkt auf den darauffolgenden usw.
Dadurch kommt bereits im nächsten Zyklus der Counter wieder mit dem gleichen Wert beim aktiven FB an. Der Timer bekommt also das Weiterzählen gar nicht mit, wird daher nicht zurück gesetzt und der FB schaltet wieder direkt den Counter weiter.
(Ähnliches "Durchrattern" passiert gern auch mal bei Schrittketten.)

Mögliche Lösungen:
1. Die Aufrufreihenfolge der FBs tauschen, also rückwärts ... 3, 2, 1. Dadurch kann je Zyklus maximal ein FB aktiv sein und der Timer bemerkt die Weiterschaltung.
2. Statt vorwärts rückwärts zählen. Gleiche Auswirkung wie bei 1.
(1. und 2. darf natürlich nicht gleichzeitig umgesetzt werden.)
3. Wenn weiter gezählt wird, gleichzeitig mit (RT) auch den Timer rücksetzen. Also Neustart des Timers.



Ich persönlich würde noch statt des Setzen des Ausgangs im NW1 eine Zuweisung verwenden und das NW3 daraufhin weglassen.
(Wenn möglich sollte man eine Zuweisung dem Setzen/Rücksetzen vorziehen.)
 
Hallo,

vielen Dank für deine Antwort!
Ich habe alle 3 Varianten ausprobiert und es funktionieren alle 3 Lösungsansätze hervorragend.

Wenn man sich die Lösungsansätze anschaut, dann verschaffen quasi Ansatz 1 und 2 dem Timer mehr Zeit sich zurückzusetzen (wobei 3 und 1 trotzdem im selben Zyklus aktiv sein können,oder?), während der Ansatz 3 aktiv den Timer zwingt und somit im Zyklus mit abgearbeitet wird, korrekt?

Warum sollte man Zuweisungen dem Setzen/Rücksetzen vorziehen? Ist die Aktion schneller bzw. ressourcensparender, oder hat dies andere Gründe?

Vielen Dank für die tolle Erklärung und die Hilfestellung!

Gruß!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe alle 3 Varianten ausprobiert und es funktionieren alle 3 Lösungsansätze hervorragend.

Wenn man sich die Lösungsansätze anschaut, dann verschaffen quasi Ansatz 1 und 2 dem Timer mehr Zeit sich zurückzusetzen (wobei 3 und 1 trotzdem im selben Zyklus aktiv sein können,oder?), während der Ansatz 3 aktiv den Timer zwingt und somit im Zyklus mit abgearbeitet wird, korrekt?
Der Timer braucht unbedingt eine 0-1 Flanke, um neu zu starten.
Die ersten 2 Varianten erzeugen diesen mindesten einen Zyklus 0, der dafür notwendig ist.

Die letzte Variante zwingt den Timer auch ohne diese Flanke zum Neustarten.


Nur der erste und letzte aufgerufene FB können durch das Rücksetzen des Zählers in einem Zyklus gleichzeitig aktiv sein.
Das ist aber kein Problem, weil dann 2 verschiedene Timer laufen. Das Problem besteht ja nur beim gleichen Timer.




Warum sollte man Zuweisungen dem Setzen/Rücksetzen vorziehen? Ist die Aktion schneller bzw. ressourcensparender, oder hat dies andere Gründe?!
Der Hauptgrund ist die Lesbarkeit des Programmes.

Mit der Zuweisung wird der Ausgang nur an einer Stelle verändert.
Mit Setzen/Rücksetzen an mindestens 2, die auch mal mehr als nur ein NW auseinanderliegen können.

Außerdem "zwingt" es den Programmierer meistens zu einer "sauberen" Programmierweise.
Beim Rücksetzen werden oft unnötige Angstverknüpfungen an verschiedensten Stellen programmiert.
 
Hallo,

vielen Dank für die tolle Erläuterung und die gute Hilfestellung. Ich konnte schon einiges mitnehmen.

Vielen Dank!

Gruß!
 
Zunächst ein grosses Lob, lieber theev! Du hast Deine Aufgabenstellung so schön klar dargestellt, wie man es hier im Forum leider nicht so oft findet.
Der Vergleich des Textes mit den Bildern ergibt keinerlei Unstimmigkeiten. Sauber! Ich bescheinige Dir hiermit, dass Du ein grosses Potenzial mitbringst, Dich in Deinem neuen Hobby gut zurecht zu finden.
Aber dann . . .
. . . dann spinnt alles total rum und . . . dürfte er nicht einfach irgendwelche Counter hochzählen . . .
Kann mir evtl. jemand einen Tipp geben . . .
Man hat den Eindruck, dass Du Dich schon durch Kleinigkeiten in Panik versetzen lässt und den sonst durchaus klaren Kopf verlierst.
Mein Tipp lautet deshalb:
Abstand gewinnen, Pause einlegen oder "eine Nacht drüber schlafen"!
Überlegen, was habe ich mir denn für diesen Fall (nur 1 Behälter aktiv) vorgestellt, was passieren soll?
Habe ich diesen Fall überhaupt schon durchdacht oder einfach übersehen, dass es ein problematischer SonderFall sein könnte?
Was soll denn überhaupt passieren, wenn ein Behälter aufgefüllt werden soll, der gerade erst aufgefüllt wurde und deshalb noch bzw. schon voll ist?

Enttäuscht bin ich von Dir nur, insofern Du den Fehler nicht selbst gefunden bzw. eingegrenzt hast. Du warst doch schon sooo knapp davor!
Hättest Du Dir Deine Aufgabenstellung nochmal in Ruhe durchgelesen, so wärst Du bestimmt über den wunden Punkt gestolpert.
Du hättest Dich darauf konzentrieren können, was in dieser einzig "aktiven" Instanz des FB abläuft und hättest gesehen, dass der Timer keine Veranlassung hatte, sich neu starten zu lassen. Auch dem Timer hättest Du die kleine Pause gönnen müssen. ;)

Lass die Ohren nicht hängen und lass Dich nicht so leicht entmutigen!

Gruss, Heinileini
 
Zurück
Oben