Step 7 Sequenziertes Analogsignal mit AWL auswerten

BS99

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

bitte die ganze Thematik AWL ignorieren. Habe leider das Programm nur übernommen.
Nutze STEP 7 Classic V. 9.03
CPU 414-5H

Aufgabe: ein Sequenziertes Analogsignal auslesen

Analogsignal von einem Sensor sendet für 2 Sekunden ein Startsignal von 20mA
danach 2 Sekunden Pause
Dann 2 Sekunden lang ein Erster Messwert zwischen 4-20 mA
danach 2 Sekunden Pause
Dann 2 Sekunden lang ein Zweiter Messwert zwischen 4-20 mA
danach 30 Sekunden Pause

Auslesen des Analogsignal funktioniert und die Umrechnung passiert in FC 0.
Ich kriege nur die Sequenzierung nicht vernünftig ausgewertet.
Erstens bleibt der Timer T1 nach 2S und 160 ms einfach stehen und zweitens wird die Funktion FC 1 für die Umrechnung dauerhaft aufgerufen und nicht erst, wenn der Timer abgelaufen ist.

Könnt Ihr mir vielleicht helfen meine Fehler auszumerzen? Bin noch blutiger Anfänger in AWL.


Code:
     CALL FC 0
          (Raw := DB1.DBW8,
          Current := DB2.DBD8);
 
    UN    M      2.1;        //Setzt die Merker zurück
    UN    M      2.0;     
    UN      M         2.2;
    L     DB2.DBD8;            // IF Stromwert größer gleich 20mA
    L     20.000000e+000;
    >=R    ;
    = M 2.1;                // setzt Merker 2.1

    U M 2.1;                // M2.1 gesetzt dann wird der Timer mit 4 Sekunden gestartet
    L S5T#4S;
    SE T 1;

    U T 1;
    = M 2.2;
    
    U M 2.2;            //Timer abgelaufen wird die Call FC1 funktion gestartet
    CALL FC 1 (Current := DB2.DBD8, ELabs := DB2.DBD12);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also die einzig markante Situation in der Sequenz ist die 30s Pause.
Das würde ich als Startbedingung verwenden
Step 0: z.B. <4.5mA für mehr als z.B. 25s dann Sequenz starten.
Step 1: Warten auf Signalsprung auf > z.B. 18mA
Step 2: Warten auf Messwertsprung z.B. <4.5mA
Step 3: Feste Zeit Warten 3s
Step 4: Messwert nehmen
Step 5: Feste Zeit Warten 4s
Step 6: Messwert nehmen und zurück zu Step 0
 
Also die einzig markante Situation in der Sequenz ist die 30s Pause.
Das würde ich als Startbedingung verwenden
Step 0: z.B. <4.5mA für mehr als z.B. 25s dann Sequenz starten.
Step 1: Warten auf Signalsprung auf > z.B. 18mA
Step 2: Warten auf Messwertsprung z.B. <4.5mA
Step 3: Feste Zeit Warten 3s
Step 4: Messwert nehmen
Step 5: Feste Zeit Warten 4s
Step 6: Messwert nehmen und zurück zu Step 0

Das ergibt ja auch alles Sinn. Im Endeffekt versuche ich ja soetwas in der Art zu programmieren aber was mache ich denn falsch in meinem bereitgestellten Code Abschnitt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@BS99 :
Was du falsch machst ist, dass du keine Schrittkette hast. Dabei hat @NBerger dir dafür eigentlich eine Steilvorlage geliefert.
Sequenz heißt ja, dass etwas nacheinander passiert. Du brauchst also nur, wie oben dargestellt auf die Startbedingung warten und dann deine Schrittkette einfach ablaufen lassen. Dann funktioniert es auch.

@Salli1991 : bei AWL ist das nicht case-sensitiv. Das große "S" würde genauso genommen wie ein Kleines ...
 
@BS99 :
Was du falsch machst ist, dass du keine Schrittkette hast. Dabei hat @NBerger dir dafür eigentlich eine Steilvorlage geliefert.
Sequenz heißt ja, dass etwas nacheinander passiert. Du brauchst also nur, wie oben dargestellt auf die Startbedingung warten und dann deine Schrittkette einfach ablaufen lassen. Dann funktioniert es auch.

@Salli1991 : bei AWL ist das nicht case-sensitiv. Das große "S" würde genauso genommen wie ein Kleines ...
Ich bin ja wirklich sehr dankbar für jede Hilfe hier im Forum. Aber wie ihr am Code seht scheitere ich gerade an der Umsetzung und nicht an der Theorie.

Im Code warte ich ja auf die Startbedingung und möchte dann nach 4 Sekunden den Wert einlesen und an meine Funktion FC1 übergeben. Mein Problem ist:
1. Mein Timer von 4 Sekunden funktioniert nicht. Irgendwie bleibt der Timer, wenn ich ihn in meiner Variablentabelle beobachte bei 2S und 120 ms hängen.
2. Warum auch immer ignoriert meine Call Funktion die Bedingung erst den analogen Wert abzurufen, wenn der Timer abgelaufen ist.

Danach ist das ja im Endeffekt copy, Paste wie das der @NBerger beschrieben hat. Also könnt ihr mir bitte konkret am Code helfen oder mir einen Beispielcode liefern 😅
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht googelst du einfach erstmal wie man eine Schrittkette erstellt - dafür gibt es auch hier im Forum unzählige Threads mit Beispielen.
Der Fehler deines Programms ist, dass du eben keine Sequenz drin hast sondern es auf Ereignisse aufzusetzen versuchst. So wirst du nicht weiter kommen.
Du musst ja keine Ratschläge annehmen - wenn du das nicht willst dann mach so weiter wie bisher mit demselben Erfolg ...
 
Dein Timer wirft sich übrigens selbst ab - schau einfach mal was du da programmiert hast ...
= M 2.1 heißt, dass der Merker nur genau solange TRUE ist wie die vorstehende Bedingung erfüllt ist. Ist sie nicht mehr erfüllt wird der Merker FALSE ...
 
Zurück
Oben