TIA AWL - 1 Zähler für 2 Behälter Füllmengen

Von zwingender Verwendung von S7-Zählern habe ich nichts gelesen, nur davon, dass nur ein Zähler verwendet werden soll. Da ist es einfacher (und übersichtlicher) unterschiedliche Werte aufzuaddieren, die sich nicht gegenseitig beeinflussen, als den Zählerwerte je nach Kistengröße und Auswerte hin und her zu kopieren. Die Auswertung ist auch kein Problem, konvertiere zu BCD oder zu ASCII und werte die entsprechen Stelle aus (ich würde BCD nehmen).
 
Zuletzt bearbeitet:
Die "Aufgabe" ist doch eigentlich nur, eine Zählfunktion (S7 oder eigene) bedingt aufzurufen, oder?
Da ja nicht gleichzeitig ein kleines und ein großes Paket kommen kann.
Vielleicht versteh ich aber auch die Aufgabe nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht ist damit gemeint, daß "ausdrücklich" keine S7-Zähler verwendet werden sollen? Sondern selber was gebastelt werden soll?
Meine Deutung ist:
NEIN, doch unbedingt einen (1) S7-Zähler verwenden und JA, etwas selber drumherum basteln, um mit dem 1 S7-Zähler die Aufgabenstellung trotz aller damit verbundenen Widrigkeiten zu erschlagen.
Sinn und Zweck einer solchen Aufgabe ist - wie bei manch anderen Aufgaben - irgendetwas bestimmtes (hier mehrfaches Ansprechen - d.h. RückSetzen, Setzen und Zählen - eines Zählers innerhalb eines einzigen Zyklus) einzuüben und das anhand eines wenig einleuchtenden (= ziemlich unpassenden) Beispiels.
Aber weiss man's, was wirklich die Motivation gewesen sein könnte, so eine Aufgabe zu erfinden? Vielleicht stammt die Aufgabe noch aus S5-Zeiten und wurde in die S7-Zeit migriert, warum auch immer?
 
Ich bin ganz Deiner Meinung, Michael.
MOVE in einem AWL-Programm. Das klingt aber nicht nach einer "Aufgabe". Das klingt nach einem Versuch, sich selbständig anhand einer Aufgabe einzuarbeiten. Die Bereitschaft des TE sehe ich als gegeben. Vielleicht übernimmt er sich einwenig mit der selbstgestellten Aufgabe?


(y) :love:
Das Aufgabenbuch, so nenne ich es mal, bezieht sich auf FUP. Da ich mir jedoch AWL aneignen muss, versuche ich diese so gut es geht in AWL umzusetzen. Das es in AWL keinen MOVE-Befehl gibt, sondern dies über Laden und Transferbefehl erfolgt, musste ich auf diese Art jetzt erfahren ^^
 
Warum eigentlich lautet der Titel des Threads "1 Zähler für 2 Behälter Füllmengen" und laut Beschreibung sollen dann verschieden große Pakete auf 2 Paletten verteilt werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich habe es so verstanden, dass auf einem Förderband große und kleine Kisten beliebig durcheinander transportiert werden. Deshalb auch 2 verschiedene Sensoren, sonst könnte man mit einem Sensor ja beide Kistengrößen zählen.
Weiterhin sollen beide Kistengrößen mit einem Zähler gezählt werden.
 
Warum eigentlich lautet der Titel des Threads "1 Zähler für 2 Behälter Füllmengen" und laut Beschreibung sollen dann verschieden große Pakete auf 2 Paletten verteilt werden?
Anschließend werden diese auf 2 verschiedenen Paletten, abhängig der Paketgröße, abgestellt. Auf der für kleine Pakete gedachten Palette passen 8, auf die für große Pakete 5 Pakete.
Das ist Taktik: weil wir alle wissen, dass z.Z. keine Paletten erhältlich sind (allenfalls als Bausätze ohne die zugehörigen Nägel?) und es sich deshalb nur um "gedachte Paletten" handeln kann. Der Begriff "Behälter" ist einfach nicht so negativ (vor-)belastet ... da wagt man es eher, einmal in den Thread hineinzuschauen. ;)
 
Ein ganz anderer Denkansatz :unsure: :

Da die 10er stufe nicht überschritten wird:
- bei einem Kleinen Päckchen +1
- bei einem großen Päckchen +10

und dann Vergleichen auf
- kleine Päckchen hinten eine 8
- Große Päckchen >= 50

> Bedingung erfüllt:
Zahl Minus 8 bzw. Minus 50

Mfg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn, dann würde ich abhängig von den Lichtschranken das jeweilige Datenwort in eine #temp Variable laden, bearbeiten und wieder transferieren.
LS klein und nicht LS groß = DW_kleines Paket
LS klein und LS groß = DW_großes Paket.
Dann wären es 2 Datenwörter aber nur ein Zähler.
 
Ein ganz anderer Denkansatz :unsure: :

Da die 10er stufe nicht überschritten wird:
- bei einem Kleinen Päckchen +1
- bei einem großen Päckchen +10

und dann Vergleichen auf
- kleine Päckchen hinten eine 8
- Große Päckchen >= 50

> Bedingung erfüllt:
Zahl Minus 8 bzw. Minus 50

Mfg

genau so wie schon im Post #19 von mir vorgeschlagen
 
Ein ganz anderer Denkansatz :unsure: :
Diesen Denkansatz ganz anderer Art hatten wir doch schon in Peter Wahlens Beitrag #19.
...
- bei einem großen Päckchen +10
...
Zahl Minus 8 bzw. Minus 50
Wie willst Du mit einem S7-Zähler "+10" oder "-8" oder "-50" realisieren?
Ich will nicht behaupten, dass es nicht geht, aber schön und klar wäre das ja nicht mehr.

Vielleicht ist es an der Zeit, dass hier mal klar gesagt wird, was mit "Zähler" wirklich gemeint ist.
Muss es ein S7-Zähler sein oder sind selbstgestrickte Zähler auch zulässig?
 
LS klein und nicht LS groß = DW_kleines Paket
LS klein und LS groß = DW_großes Paket.
Das hatte ich mir inzwischen auch überlegt und mir jetzt hohe Pakete (statt grosser Pakete) und flache Pakete (statt kleiner Paket) ausgedacht sowie eine Anordnung von 3 LichtSchranken.
Die hohen Pakete und die flachen Pakete kann ich damit eindeutig mit der mittleren, höher angeordneten LS unterscheiden.
Warum jetzt 3 statt bisher 2 LS? Ganz einfach. Diese beiden seitlichen LS sprechen sowohl auf die flachen als auch auf die hohen Pakete an und bestimmen den ZeitPunkt, wann die mittlere, höher angeordnete LS abgefragt/ausgewertet werden muss. Der genaue ZeitPunkt ist aber nicht unkritisch.
Da pro "Abschattung" nur 1-mal gezählt werden soll, wurden Signal-Flanken ausgewertet.
Es kann aber nicht garantiert werden, dass die Flanken der LS im selben PLC-Zyklus erfasst werden.
Einfach wird es dadurch, dass jetzt die Überlappung (UND-Verknüpfung) der beiden seitlichen LS benutzt wird, um festzulegen, dass in diesem Bereich bzw. genauer am Anfang dieses Bereiches die mittlere LS ausgewertet wird.
Hintergedanke war dabei übrigens, dass die beiden seitlichen LS ein A-B-Signal ergeben ("90°-phasenverschoben), woraus - falls erwünscht - auch die Richtung der PaketBewegug abgeleitet werden kann.
Dann wären es 2 Datenwörter aber nur ein Zähler.
Dieses Prinzip habe ich auch beibehalten.

Gegenüber meinem Entwurf aus Beitrag #8 habe ich die LS-Signale "umgedreht" und gehe im folgenden davon aus, dass die LS ein Low- bzw. FALSE-Signal liefern wenn der Lichtstrahl unterbrochen ist.
Code:
     L    0
     U    M0.1     // BCD-ZählWert hohe Pakete rücksetzen <-
     SPBN SKRH
     T    DB1.DW1  // BCD-ZählWert hohe Pakete 
SKRH U    M0.2     // BCD-ZählWert flache Pakete rücksetzen <-
     SPBN SKRF
     T    DB1.DW2  // BCD-ZählWert flache Pakete
SKRF ON   E0.1     // LS1 unten <-
     ON   E0.3     // LS3 unten <-
     R    M0.0     // FlankenMerker
     SPB  END 
     U    M0.0     // FlankenMerker
     SPB  END 
     S    M0.0     // FlankenMerker
     UN   E0.2     // LS2 oben <-
     L    DB1.DW1  // BCD-ZählWert hohe Pakete lesen und ...
     SPB  CNT
     L    DB1.DW2  // BCD-ZählWert flache Pakete lesen und ...
CNT  CLR           
     S    Z1       // ... in "UniversalZähler" ... 
     ZV   Z1
     SET
     S    Z1       // ... vorbesetzen und ...
     ZV   Z1       // ... um 1 weiterzählen und ...
     LC   Z1       // ... im BCD-Code auslesen und ...
     U    E0.2     // LS2 oben <-
     SPB  STO2
     T    DB1.DW1  // ... unter BCD-ZählWert hohe Pakete abspeichern
     SPA  END
STO2 T    DB1.DW2  // ... unter BCD-ZählWert flache Pakete abspeichern
END  BE

Um flache und hohe Pakete unterscheiden zu können, werden drei
LichtSchranken folgendermassen angeordnet:

                               LS2
                               /
                              /
                     LS1     /           LS3
                     /      /            /
                    /      /            /
  Z   Y            /     LS2           /  
  |  /            /       .           /  
  | /            /        .          /    
  |/           LS1        .        LS3    
  o---X                                  
                |<---x--->|<---x--->|
 
LS2 ist horizontal (X) genau zwischen LS1 und LS3 angebracht, aber so
hoch (Z), dass sie nur durch hohe Pakete unterbrochen wird.

LS1 und LS3 sind tiefer angebracht und "sehen" sowohl flache als auch hohe Pakete.
Der horizontale Abstand x zwischen LS1 und LS2 bzw. zwischen LS2 und
LS3 wird möglichst gross 1) gewählt, aber maximal so gross 2), dass ein Drittel
der Länge des kürzesten Pakets in x-Richtung nicht überschritten wird.

1) Um möglichst grosse ToleranzBereiche in x zu erhalten, so dass die mehr oder weniger senkrechten Kanten der Pakete einem keine Streiche spielen. Und auch nicht eine lange ZyklusZeit in Kombination mit einer schnellen Bewegunng der Pakete.

2) Dahinter steckt wieder die Idee von einem A-B-Signal, möglichst gleichmässige zeitliche Abstände zwischen den SignalFlanken anzustreben, damit auch bei höheren Geschwindigkeiten keine vermeidbaren Probleme durch zu lange ZyklusZeiten entstehen.
 
Zuletzt bearbeitet:
Mit einem selbstgebasteltem Zähler kommst Du mit 2 LS aus. Bei S7 Zähler brauchst Du 3 LS.
Edit: Die beiden Detektionslichtschranken hätte ich senkrecht übereinander angeordnet. Zusammen mit den Flankenmerkern bekommt man ein eindeutiges VKE. Allerdings sollten die Pakete gerade Kanten haben. Aber die Aufgabe ist ja theoretisch.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit einem selbstgebasteltem Zähler kommst Du mit 2 LS aus. Bei S7 Zähler brauchst Du 3 LS.
:unsure:
Das verstehe ich nicht. Was für einen Unterschied soll es machen, ob ein S7-Zähler verwendet wird oder etwas anderes, ggfs selbstgebasteltes?

Die 3. LS soll doch nur helfen, die Paket-Grösse bzw. -Höhe zu unterscheiden.
Bei nur 2 LS hätte ich ...
- bei einem flachen Paket einen Zähl-Impuls nur von er unteren LS - so weit, so klar und
- bei einem hohen Paket einen Zähl-Impuls von der unteren LS und zusätzlich einen Zähl-Impuls von der oberen LS.
D.h. bei einem hohen Paket erhalte ich einen "überflüssigen" Zähl-Impuls für flache Pakete, den ich ignorieren oder ggfs rückgängig machen müsste, sobald sich herausstellt, dass ein hohes Paket die Ursache war.

Dabei kann es sein ...
1.) dass der Impuls für flache Pakete kommt bevor der Impuls für hohe Pakete kommt (-> Impuls für flache Pakete rückgängig machen) oder
2.) dass der Impuls für hohe Pakete kommt bevor der Impuls für flache Pakete kommt (-> merken und den folgenden Impuls für flache Pakete ignorieren) oder
3.) dass beide Impulse im selben Zyklus kommen (-> den Impuls für flache Pakete ignorieren).

Simpel ist nur der Fall 3.)
Man könnte es auch so machen, ...
- dass alle Impulse für flache Pakete den Zähler für flache Pakete um 1 erhöhen und
- dass alle Impulse für hohe Pakete den Zähler für hohe Pakete um 1 erhöhen und zusätzlich den Zähler für flache Pakete um 1 vermindern.
Dann wird ggfs der Fall 3.) kritisch.
Ich möchte nun aber nicht in die Timer-TrickKiste greifen müssen, um "ToleranzBereiche" für das Auftreten der Zähl-Impulse zu schaffen.
Und zykluszeitabhängige ImpulsVerlängerungen mag ich in solchen Fällen noch weniger.
Ich bevorzuge allemal Lösungen, die sich aus einer passenden Logik ergeben und die Lösung mit 3 LS sehe ich als logisch sauber an.
Ist hier zwar irrelevant, aber ich sag's trotzdem: wenn es um Zähl-Impulse geht, die aus einer mechanischen Bewegung abgeleitet werden, bin ich grundsätzlich dabei, die tatsächliche Richtung der Mechanik über A-B-Signale zu verarbeiten und nicht die "theoretische" Richtung, die aus einer RichtungsVorgabe (z.B. Ansteuerung eines Motors) durch das Programm abgeleitet wird.
 
Ich hätte die beiden vorderen Lichtschranken zum detektieren genommen, welches Datenwort ich in den Zähler lade. Beim selbstgebastelten genügt eine #temp-variable da detektieren, lade DW in temp_Variable addiere 1 dazu und speichere in DW ein Durchlauf sind. Beim S7 Zähler lade ich das DW und die 3 Lichtschranke gibt den Zählimpuls. Hier komme ich aber nicht mehr mit einer #temp_Variable aus, da es mehrere Durchläufe sind. Also Statisch oder Global. Denke ich jedenfalls.
 
Ich hätte die beiden vorderen Lichtschranken zum detektieren genommen, welches Datenwort ich in den Zähler lade.
Ich ahne, dass ich noch irgendeine einfache Lösung übersehen habe. Aber Deine Lösung habe ich nicht wirklich verstanden.

Andererseits, warum zerbrechen wir uns überkopf das Haupt, neee, überhaupt den Kopf darüber?
Der TE hat uns doch versichert, dass entweder der eine Sensor meldet, wenn sich ein kleines Paket vorbeischleicht oder der andere, wenn es ein grosses Paket ist? Möge @deltarrr uns noch darüber aufklären, wie seine gross/klein-Unterscheidung funktioniert ... schliesslich wollen wir auch noch etwas dazulernen. ;)
Nur, weil ich von dieser klaren Trennung der SignalBedeutungen nicht wirklich überzeugt war, habe ich mir meine flach/hoch-Variante mit 3 LS ausgedacht.
Und meine Variante finde ich software-seitig verblüffend "unaufwändig" im Vergleich zum hardware-seitigen Mehraufwand.
Die Reduzierung auf die Auswertung nur noch einer Flanke und durch möglichst frühzeitiges Springen zum Ende, wenn keine Flanke auszuwerten ist, konnte der Aufwand klein gehalten werden.
Beim selbstgebastelten genügt eine #temp-variable da detektieren, lade DW in temp_Variable addiere 1 dazu und speichere in DW ein Durchlauf sind.
Zweifellos.
Beim S7 Zähler ... Hier komme ich aber nicht mehr mit einer #temp_Variable aus, da es mehrere Durchläufe sind. Also Statisch oder Global.
Hmmm, wer braucht "mehrere Durchläufe" (= Zyklen?), um einen S7-Zähler ...
1. zu laden und anschliessend
2. um 1 hochzuzählen und dann noch
3. auszulesen?
Code:
     ...
     CLR           // VKE = 0
     S    Z1       // ... in "UniversalZähler" ...     <===<<< "Vorbereitung" der pos. Flanke für's Setzen
     ZV   Z1       //                                  <===<<< "Vorbereitung" der pos. Flanke für's VorwärtsZählen
     SET           // VKE = 1
     S    Z1       // ... vorbesetzen und ...          <===<<< hier die pos. Flanke für's Setzen und danach erst
     ZV   Z1       // ... um 1 weiterzählen und ...    <===<<< hier die pos. Flanke für's VorwärtsZählen
     LC   Z1       // ... im BCD-Code auslesen und ... <===<<< das Auslesen des BCD-Code
     ...
Habe ich zwar nicht getestet, vertaue aber blind darauf, dass es so in 1 Zyklus funktoniert.
Schliesslich ist ja wichtig, dass die Flanken kommen (in der richtigen Reihenfolge) und nicht, in welchen zeitlichen Abständen.
Dem Zähler sollte egal sein, ob in einem einzigen Zyklus oder auf mehrere verteilt.
Zugegeben, für einen solchen Missbrauch bzw. eine solch "unkonventionelle" Nutzung wurden die Zähler nicht erfunden ... aber, was soll's?
Ich stelle mir vor, dass genau dies der eigentliche "KnackPunkt" der Aufgabe ist, der anhand dieses Beispiels "eingetrichtert" werden soll.
 
Zurück
Oben