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

deltarrr

Level-1
Beiträge
24
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen,

dies ist mein erster Beitrag in diesem Forum. Ich bin neu auf diesem Gebiet und warne euch somit schonmal vor 👀.

Ich versuche anhand von recht simplen Übungen ein Gefühl für die SPS-Programmierung mir anzueignen. Dabei programmiere ich ausschließlich in AWL mit TIA v16.

Die aktuelle Übung sieht vor, dass ein Förderband 2 verschieden große Pakete anliefert. Über zwei Sensoren (einer für kleine, einer für große Pakete) sollen die Paketgrößen gezählt 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. Diese Übung soll lediglich mit 1 Zähler realisiert werden. Und genau hier liegt mein problem. Mit 2 Zählern ist die Übung für mich recht simpel. Ein Hinweis war die benutzung von MOVE-Anweisungen. Kann mir jemand weiterhelfen?

Ich muss demnach den aktuellen Zählwert, gegeben durch 1 Zähler, irgendwie parallel in 2 Parametern speichern und unabhängig voneinander abrufen und rücksetzen können.

Vielleicht kann mir jemand helfen
Lg
 
Du kannst Datenwörter verwenden. Wenn beide Lichtschranken unterbrochen werden, wertest Du die Flanken der LS aus, lädst Du das Datenwort für große Pakete, addierst 1 dazu und transferierst es wieder in das gleiche Datenwort. Wird nur die kleine LS unterbrochen, machst Du das gleiche mit dem Datenwort für kleine Pakete. Die Datenwörter vergleichst du mit 8 bzw. 5. Hast Du z.B. 8 erreicht setzt Du den Wert von Datenwort Palette auf 1 und lädst eine 0 in das Datenwort für große Pakete.
 
sprich nach dieser Lösung bräuchte ich keinen Zähler, da ich lediglich über Flanken die jeweiligen Datenwörter durch addition zähle? Wie lautet denn der Syntax für diese Anweisung? Ich finde leider nirgends Beispiele dazu
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      U     "db_palette".Band_läuft
      U     "db_palette".ls_klein
      FP    "db_palette".fm_lichtschranke_klein
      U     "db_palette".ls_groß
      FP    "db_palette".fm_lichtschranke_groß
      SPBN  _001
      L     "db_palette".großes_paket
      L     1
      +I
      T     "db_palette".großes_paket
      _001 : NOP0

Das wäre z.B. der Zähler für das große Paket. Da Du bloß bis 8 zählen musst, kannst Du INT nehmen. Deshalb +I.
 
Code:
      U     "db_palette".Band_läuft
      U     "db_palette".ls_klein
      FP    "db_palette".fm_lichtschranke_klein
      UN    "db_palette".ls_groß
      FP    "db_palette".fm_lichtschranke_groß
      SPBN  _001
      L     "db_palette".kleines_paket
      L     1
      +I
      T     "db_palette".kleines_paket
      L     "db_palette".kleines_paket
      L     4
      >I
      SPBN  _002
      L     "db_palette".palette_klein
      L     1
      +I
      T     "db_palette".palette_klein
      L     "db_palette".kleines_paket
      L     0
      T     "db_palette".kleines_paket
_001: NOP 0
_002: NOP 0

Das wäre dann der Zähler für das kleine Paket. Mahlzeit.
 
Diese Übung soll lediglich mit 1 Zähler realisiert werden. Und genau hier liegt mein problem. Mit 2 Zählern ist die Übung für mich recht simpel.
Das ist in der Tat eine recht mysteriöse Aufgabe. Vielleicht sogar ein Kandidat für unser "WeihnachtsRätsel"? ;)
Multiplexen von 2 Daten auf einen gemeinsamen Zähler und anschliessendes Demultiplexen auf die 2 Daten ist sicherlich machbar.
Aber der Aufwand dafür steht in keinem Verhältnis zur Einsparung eines von zwei Zählern.
Du kannst Datenwörter verwenden. ...
Klar kann man mit "selbstgemachten" Zählern arbeiten. Aber 2 Zähler sind es dennoch, nicht nur einer.
Die selbstgemachten Zähler sind viel einfacher zu handhaben als die "vorgefertigten" von S7 (oder S5).
Was könnte dafür sprechen, trotzdem einen vorgefertigten Zähler zu verwenden?
Da fällt mir nur ein, dass der vorgefertigte im BCD-Code arbeitet (und auf den ZahlenBereich 0..999 beschränkt ist) und der selbstgemachte im DUAL-Code rechnet.
Ein Hinweis war die benutzung von MOVE-Anweisungen.
MOVE ist die Bezeichnung für das Kopieren in FUP oder KOP. In AWL suchst Du das MOVE vergeblich. Dort musst Du das Kopieren auf zwei Schritte aufteilen und den "Umweg" über den Akku1 wählen (der Akku1 ist dann das "ZwischenLager" für den zu kopierenden Wert).
Ich muss demnach den aktuellen Zählwert, gegeben durch 1 Zähler, irgendwie parallel in 2 Parametern speichern und unabhängig voneinander abrufen und rücksetzen können.
Das kannst Du:
Code:
     L    0
     UN   M0.3     // "Zähler" 1 Rücksetzen
     SPB  SKP1
     T    DB1.DW1
SKP1 UN   M0.4     // "Zähler" 2 Rücksetzen
     SPB  SKP
     T    DB1.DW2 
SKP  U    E0.1     // LichtSchranke 1
     UN   M0.1     // FlankenMerker für LS 1
     O
     U    E0.2     // LichtSchranke 2
     UN   M0.2     // FlankenMerker für LS 2
     SPBN END
     L    DB1.DW1  // BCD-ZählWert für "Zähler" 1
     U    E0.1
     SPB  MUX
     L    DB1.DW2  // BCD-ZählWert für "Zähler" 2
MUX  CLR
     S    Z1       // "UniversalZähler" vorbesetzen und um 1 weiterzählen
     ZV   Z1
     SET
     S    Z1
     ZV   Z1
     LC   Z1       // "UniversalZähler" im BCD-Code auslesen
     UN   E0.1
     SPB  DEM
     T    DB1.DW1  // bei "Zähler" 1 abspeichern
     SPA  END
DEM  T    DB1.DW2  // bei "Zähler" 2 abspeichern
END  U    E0.1     // FlankenMerker bilden
     =    M0.1
     U    E0.2
     =    M0.2
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Klar kann man mit "selbstgemachten" Zählern arbeiten. Aber 2 Zähler sind es dennoch, nicht nur einer.
Die selbstgemachten Zähler sind viel einfacher zu handhaben als die "vorgefertigten" von S7 (oder S5).
Was könnte dafür sprechen, trotzdem einen vorgefertigten Zähler zu verwenden?
Da fällt mir nur ein, dass der vorgefertigte im BCD-Code arbeitet (und auf den ZahlenBereich 0..999 beschränkt ist) und der selbstgemachte im DUAL-Code rechnet.
OK, Heinrich, deshalb sollte man das den Leuten überlassen, die sich damit auskennen. Also Dir z.B.

Was ich jetzt aber nicht ganz kapiere: wie erkennst du kleine Pakete?
 
OK, Heinrich, deshalb sollte man das den Leuten überlassen, die sich damit auskennen. Also Dir z.B.
Nennt mich ruhig einen Spießer aber eigentlich sollte man die Aufgabe dem TE überlassen, er soll ja was lernen und nicht fertige Bausteine gestellt bekommen. Fragen beantworten zu einzelnen Problemstellen => ja klar aber Fertiglösungen :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sollen mit dem "einen Zähler" die 5 bzw. 8 Pakete auf den beiden Paletten abgezählt werden oder soll damit die Unterscheidung "großes Paket"/"kleines Paket" gemacht werden?
Ist da ein Encoder oder ein Sensor auf einer Welle oder soll die Zeit gezählt werden, wie lange ein Sensor oder Lichtschranke belegt ist?

Kommen kleine und große Pakete gemischt? Der oder die Zähler, die 5 bzw. 8 Pakete abzählen, müssen sich beide Zählerstände merken - es macht eigentlich keinen Sinn, dafür nur 1 Zähler aufwendig gemultiplext zu verwenden, es sei denn man hat wirklich nur 1 Zähler.

Harald
 
Zuletzt bearbeitet:
Code:
      U     "db_palette".Band_läuft
      U     "db_palette".ls_klein
      FP    "db_palette".fm_lichtschranke_klein
      UN    "db_palette".ls_groß
      FP    "db_palette".fm_lichtschranke_groß
      SPBN  _001
      L     "db_palette".kleines_paket
      L     1
      +I
      T     "db_palette".kleines_paket
      L     "db_palette".kleines_paket
      L     4
      >I
      SPBN  _002
      L     "db_palette".palette_klein
      L     1
      +I
      T     "db_palette".palette_klein
      L     "db_palette".kleines_paket
      L     0
      T     "db_palette".kleines_paket
_001: NOP 0
_002: NOP 0

Das wäre dann der Zähler für das kleine Paket. Mahlzeit.
Vielen Dank für Deinen Code.
Ich habe noch ein paar Probelem damit. Die Flankenmerker geben mir den Output nur über einen Zyklus. Da ich die Schaltung zu Simulieren versuche, schaffe ich es nicht diese innerhalb des Zykluses einzufangen. Wenn ich stattdessen Versuche die Flanke länger zu halten, zählt mir mein Wert im DB zu weit bzw er rattert mir logischwerweise zwangsläufig den Zyklus weiter. Ist dies demnach eher ein Gedankenversuch und so in der Realität nicht wirklich Umsetzbar?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... aber eigentlich sollte man die Aufgabe dem TE überlassen, er soll ja was lernen und nicht fertige Bausteine gestellt bekommen. Fragen beantworten zu einzelnen Problemstellen => ja klar aber Fertiglösungen :rolleyes:
Das ging gegen mich, @dekuika. :( Du brauchst Dich für nichts zu entschuldigen!

Die Aufgabenstellung ist auch mir nicht so wirklich klar. Je 1 Sensor für gross und klein?
Aber das war ja nicht Gegenstand der Aufgabe ...
Ich habe noch ein paar Probelem damit. Die Flankenmerker geben mir den Output nur über einen Zyklus. Da ich die Schaltung zu Simulieren versuche, schaffe ich es nicht diese innerhalb des Zykluses einzufangen.
Du brauchst sie doch gar nicht "einzufangen", jedenfalls nicht in dem Sinne, dass Du am Bildschirm Impulse von wenigen ms Länge sehen kannst! Es genügt völlig, ihre länger anhaltende Wirkung beobachten zu können.
Wenn ich stattdessen Versuche die Flanke länger zu halten, zählt mir mein Wert im DB zu weit bzw er rattert mir logischwerweise zwangsläufig den Zyklus weiter.
Genau das soll durch den 1-Zyklus langen Impuls verhindert werden - also schnellstens zurückändern!
Ist dies demnach eher ein Gedankenversuch und so in der Realität nicht wirklich Umsetzbar?
Die Funktion des Programms ist sowohl als GedankenVersuch als auch als reale Umsetzung zu gebrauchen.
Was Du Dir dringend "abschminken" musst, ist, so schnell gucken zu wollen, wie die SPS arbeitet!
Das kannst Du nicht schaffen und auch die Darstellung auf dem Bildschirm gibt das leider nicht her.

Abhilfe: "Fangschaltung" programmieren, so dass Du ein kurzes Ereignis sichtbar machen kannst.
Im hier gegeben Fall brauchst Du Dir dafür aber nichts spezielles einfallen zu lassen. Die Zähler lassen doch erkennen, dass Zähl-Impulse da gewesen sind oder auch nicht. ;)
 
Das ging gegen mich,
Das ging gegen keinen von euch beiden. Ich finde es einfach nicht so förderlich, wenn man lernenden zu viel fertigen Code zur Verfügung stellt. Sie sollen doch lernen, selber Lösungen zu erarbeiten. Dabei kann man ja natürlich helfen. Stell dir mal bei uns hätte man es so in der Lehre gemacht.
 
Mit den Codeschnipseln kann man nur den Zusammenhang sehen. Daraus einen fertigen Baustein zu machen, ist noch eine Menge Arbeit. Außerdem lerne ich ja selbst noch. Bin, dank fleißigem Mitlesen im Forum, gerade aus der Baumschule raus.:)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sie sollen doch lernen, selber Lösungen zu erarbeiten. Dabei kann man ja natürlich helfen. Stell dir mal bei uns hätte man es so in der Lehre gemacht.
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?

Mit den Codeschnipseln kann man nur den Zusammenhang sehen. Daraus einen fertigen Baustein zu machen, ist noch eine Menge Arbeit. Außerdem lerne ich ja selbst noch. Bin, dank fleißigem Mitlesen im Forum, gerade aus der Baumschule raus.:)
(y) :love:
 
mal ein Gedankenanstoß um das wie gewünscht mit einem Zähler zu lösen:

Sensor kleine Kisten 0-8 ---> Einer-Stelle 1 aufaddieren
Sensor große Kisten 0-5 ---> Zehner-Stelle 10 aufaddieren

du kannst also mit einem Zähler beide Kistengrößen zählen
addiere 1, wenn pos Flanke (Sensor_klein UND NICHT Senor_groß)
addiere 10, wenn pos Flanke (Sensor_klein UND Senor_groß)

Zähler Einerstelle >=8 ==> kleine Palette voll, anschließend Einer auf "0" setzen
Zähler Zehnerstelle >=5 ==> große Palette voll, anschließend Zehner auf "0" setzen
 
Zurück
Oben