Beurteilung AWL Programm

elsteiner13

Level-1
Beiträge
20
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe vor kurzem begonnen mich mit der Steuerungstechnik (hauptsächlich Siemens) auseinander zu setzen.
Habe mich jetzt in AWL eingelesen und mein erstes Programm geschrieben.
Simple Einschaltverzögerung mit RESET Eingang und Ausgabe der verstrichenen Zeit. Diese startet wenn eine positive Flankenänderung am Eingang detektiert wird.
Wollte nachfragen ob sich jemand den Code anschauen könnte und mir mitteilen könnte ob dieser soweit o.k. ist (Code funktioniert ansich) und wie ich diesen bzw. meine allgemeine Programmierweise noch verbessern könnte.

Code:
FUNCTION_BLOCK "TON_AWL"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      IN : Bool;   // Sobald HIGH anliegt, wird Baustein ausgeführt
      TS : Time;   // Zeit für Abfallverzögerung
      RESET : Bool;   // Sobald HIGH anliegt, wird Ausgang resettet
   END_VAR

   VAR_OUTPUT 
      OUT : Bool;   // Ausgang
      Time_UP : Time;   // Vergange Zeit des Timers hinaufzählend
   END_VAR

   VAR 
      Timer1 : Time;   // Wert des 1ten Timers
      Timer2 : Time;   // Wert des 2ten Timers
      LastIN : Bool;   // Zustand von IN im letzten Zyklus
      TimeSET : Bool;   // Überprüfung ob erster Zeitwert gespeichert wurde
   END_VAR


BEGIN
NETWORK
TITLE = Ausgang
      U #RESET;//liegt Reset an
      R #OUT;//Ausgang sofort resetten
      R #TimeSET;//muss neue positive Flanke auftreten damit Programmablauf wieder von vorne beginnt
      SPB Reset;

//positive Flankenänderung erkannt - Zeitwert zu diesem Zeitpunkt speichern
      U #IN;
      UN #LastIN;
      SPB Timer1_Calc;

//Merken des letzten Zustands des Eingangs - für Flankenerkennung
Continue1:      U #IN;
      S #LastIN;

      UN #IN;
      R #LastIN;

//erster Zeitwert noch nicht gesetzt
      ON #TimeSET;
      ON #IN;
      R #OUT;
      BEB;

//akutellen Zeitwert berechnen
      CALL TIME_TCK
      (  RET_VAL                     := #Timer2
      );

//verstrichene Zeit berechnen wenn Ausgang noch nicht gesetzt
      UN #OUT;
      SPB Calc_TimeDiff;


//sobald verstrichene Zeit größer als angelegte Zeit ist -> Ausgang setzen
Continue2:      L #Time_UP;
      L #Time;
      >D;
      = #OUT;

//Bausteinende
      BEA;

Timer1_Calc:      CALL TIME_TCK
      (  RET_VAL                     := #Timer1
      );
      S #TimeSET;
      SPB Continue1;

Calc_TimeDiff:      L #Timer2;
      L #Timer1;
      -D;
      T #Time_UP;
      SPB Continue2;

Reset:      L 0;
      T #Time_UP;//damit verstrichene Zeit wert bei Visualisierung bei Reset auf 0 zurückgesetzt wird
      BEB;//Bausteinausfürhung beenden -> Einsparung Zykluszeit
END_FUNCTION_BLOCK


Danke für Antworten!
LG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort.

Gut dann werde ich mich garnicht mehr weiter mit AWL beschäftigen.
Hab halt desöfteren hier im Forum noch Lösungen gesehen welche auf AWL basierend waren und dachte mir das setzt man noch ein.

LG
 
Totgesagte leben länger ;) . Ach wenn man bei neuen Programmen heute mehr und mehr auf AWL verzichtet, oder verzichten muss, so wird uns AWL noch sehr lange in vorhandenen Steuerungen begegnen. Sich ein wenig damit zu beschäftigen, kann nicht falsch sein.

Bei Verwendung von TIME_TCK sollte man bei Siemens den Überlauf beachten! Suche im Forum, schon tausendfach behandelt.
 
Jap, weiß bereits das dieser überlaufen kann, hab zur Vereinfachung des AWL Programms diesen Fall außenvorgelassen.
Aber Danke!

LG
 
Zurück
Oben