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.
Danke für Antworten!
LG
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