Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 49377

Beurteilung AWL Programm

$
0
0
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

Viewing all articles
Browse latest Browse all 49377


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>