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

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
So hätte ich es gemacht, nur das nach dem SPBN das Datenwort db_palette.großes_paket in die #temp_variable transferiert wird. Wegen dem einen Zähler. Die Detektion kleines Paket ist dann U palette_lichtschranke_klein, UN palette_lichtschranke_groß. Natürlich mit Flankenauswertung.
 
Habe es heute mal am PC getestet. Läuft soweit. Die obere LS hätte ich 10 cm vor der unteren platziert (schräge Kanten). Aber vielleicht ist das ja zu einfach.
Code:
      U     "palette_1".Band_läuft
      UN    "palette_1".LS_2_oben_Signal
      U     "palette_1".LS_1_unten_Signal
      FP    "palette_1".FM_klein
      SPBN  _001
      L     "palette_1".Paket_klein
      T     "palette_1".Zähler_1
      L     1
      +I
      T     "palette_1".Zähler_1
      L     "palette_1".Zähler_1
      T     "palette_1".Paket_klein
_001: NOP 0
      U     "palette_1".Band_läuft
      U     "palette_1".LS_2_oben_Signal
      U     "palette_1".LS_1_unten_Signal
      FP    "palette_1".FM_groß
      SPBN  _002
      L     "palette_1".Paket_groß
      T     "palette_1".Zähler_1
      L     1
      +I
      T     "palette_1".Paket_groß
      UN    "palette_1".LS_2_oben_Signal
      UN    "palette_1".LS_1_unten_Signal
_002: NOP 0
      L     "palette_1".Paket_klein
      L     8
      ==I
      SPBN  _003
      S     "palette_1".Palette_klein_voll
_003: NOP 0
      L     "palette_1".Paket_groß
      L     5
      ==I
      SPBN  _004
      S     "palette_1".Palette_groß_voll
_004: NOP 0
      U     "palette_1".Palette_klein_reset
      SPBN  _005
      R     "palette_1".Palette_klein_voll
      L     0
      T     "palette_1".Paket_klein
_005: NOP 0
      U     "palette_1".Palette_groß_Reset

      SPBN  _006
      R     "palette_1".Palette_groß_voll
      L     0
      T     "palette_1".Paket_groß
_006: NOP 0
      BEA
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
_003: NOP 0
      L     "palette_1".Paket_groß
      L     5
      ==I
      SPBN  _004
      S     "palette_1".Palette_groß_voll
_004: NOP 0
      (...)
_005: NOP 0
      U     "palette_1".Palette_groß_Reset

      SPBN  _006
      R     "palette_1".Palette_groß_voll
      L     0
      T     "palette_1".Paket_groß
_006: NOP 0
Hmm, solchen Code würde ich anders formulieren:
Code:
_005: U     "palette_1".Palette_groß_Reset
      SPBN  _006
      L     0
      T     "palette_1".Paket_groß

_006: L     "palette_1".Paket_groß
      L     5
      >=I
      =     "palette_1".Palette_groß_voll

Harald
 
Code:
      UN    "palette_1".LS_2_oben_Signal
      UN    "palette_1".LS_1_unten_Signal
_002: NOP 0
Und das ist ein Programmierfehler. Da fehlt noch Code mit einem VKE-Abschluß. Was ist der Grund für die 2 Programmzeilen?

(Ob Dein Code insgesamt funktioniert, habe ich nicht geprüft. Mir sind nur sofort Unschönheiten und Fehler ins Auge gefallen.)

Harald
 
Sollte zur Sicherheit sein, falls das Paket zerknittert ist. Verhindert aber der Flankenmerker sowieso. Kann also raus. In der Simulation läuft es. Mich würde aber interressieren, wie erfahrene Programmierer das lösen. Den TE scheint das Thema eh nicht mehr zu tangieren.:)
 
Ich ahne, dass ich noch irgendeine einfache Lösung übersehen habe.
Ja, @dekuika, Deine Idee, trotz aller Widrigkeiten mit "nur" 2 Lichtschranken auszukommen, hat mich in der Tat gewurmt.
Habe noch ein wenig gegrübelt und jetzt hab' ich's endlich.

Deine Idee, ein Signal "Band läuft" zusätzlich zu verknüpfen, finde ich sehr gut, habe ich aber aus Bequemlichkeit trotzdem (noch) nicht übernommen.
Hier die gänzlich ungetestete "AbsichtsErklärung" (= PseudoCode, ich hoffe trotzdem lesbar/verständlich):
Code:
VAR_INPUT
    biLSoben        : BOOL ; // LichtSchranke "oben"  (Low-Signal, wenn unterbochen)
    biLSunten       : BOOL ; // LichtSchranke "unten" (Low-Signal, wenn unterbochen)
    biResetFlach    : BOOL ; // SchnittstellenBit zum Rücksezen des "Flach"ZählWertes
    biResetHoch     : BOOL ; // SchnittstellenBit zum Rücksezen des "Hoch"ZählWertes
END_VAR

VAR_OUTPUT
    boFehlerLSunten : BOOL ; // Fehler: LS "unten" hat nicht gemeldet (optional!)
END_VAR

VAR                          // statisch !!! Falls in FC, dann stattdessen VAR_IN_OUT !
    bsFehlerLSunten : BOOL ; // Fehler: LS "unten" hat nicht gemeldet
                             //   wird rückgesetzt, sobald Flanke an 'biLSunten' auftritt
    bsHochGesp      : BOOL ; // Speicher für Zustand "hoch"
                             //   wird rückgesetzt durch High-Signal an 'biLSunten'
    bsLSobenZuvor   : BOOL ; // FlankenMerker für LichtSchranke "oben"
    bsLSuntenZuvor  : BOOL ; // FlankenMerker für LichtSchranke "unten"
END_VAR

//  wsFlachZählBCD  : WORD ; // DatenWort für "Flach"ZählWert
//  wsHochZählBCD   : WORD ; // DatenWort für "Hoch"ZählWert
//  Z_univ          : WORD ; // S7-Zähler

      L    0
      U    biResetHoch       // BCD-ZählWert hohe Pakete rücksetzen
      SPBN SKRH
      T    wsHochZählBCD     // BCD-ZählWert hohe Pakete
SKRH: U    biResetFlach      // BCD-ZählWert flache Pakete rücksetzen
      SPBN SKRF
      T    wsFlachZählBCD    // BCD-ZählWert flache Pakete
SKRF: UN   biLSunten         // beide LS unterbrochen
      UN   biLSoben
      S    bsHochGesp
      X    biLSunten         // beliebige Flanke von biLSunten
      X    bsLSuntenZuvor
      R    bsFehlerLSunten
      L    wsHochZählBCD
      U    biLSoben          // neg Flanke biLSoben
      UN   bsLSobenZuvor
      UN   bsHochGesp
      S    bsFehlerLSunten
      SPB  CNT
      ON   biLSunten     
      O    bsLSuntenZuvor
      SPB  ALWY
      U    bsHochGesp        // neg Flanke biLSunten
      SPB  CNT
      L    wsFlachZählBCD
CNT:  CLR                    // S7-Zähler
      S    Z_univ
      ZV   Z_univ
      SET                    // pos Flanke bilden
      S    Z_univ
      ZV   Z_univ
      LC   Z_univ            // S7-Zähler in BCD auslesen
      O    bsHochGesp
      O    bsFehlerLSunten
      SPB  HIGH
      T    wsFlachZählBCD
      SPA  ALWY
HIGH: T    wsHochZählBCD
ALWY: U    biLSunten         // FlankenMerker bilden
      =    bsLSuntenZuvor
      U    biLSoben
      =    bsLSobenZuvor
      U    biLSunten         // Zustand hoch rücksetzen
      R    bsHochGesp
// optional:
      U    bsFehlerLSunten   // Fehler: LS "unten" hat nicht gemeldet
      =    boFehlerLSunten   // --> Ausgang
 
Zuletzt bearbeitet:
Das ist der Unterschied zwischen Dilettant und Meister. (y)(y)(y):)

Einen schönen Sonntag noch.
Dirk.
 
Zuletzt bearbeitet:
Zurück
Oben