Timer Problem in State Maschine (AWL)

debauer

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab mir jetzt innerhalb von wenigen Wochen komplett AWL beigebracht und programmier grade eine doch sehr komplexe Steuerung mit mehreren State Maschines und vielen Timer abläufen.
Ich muss sagen das ich anfangs etwas Assembler geschädigt war und manche abläufe in der SPS fehl interpretiert habe. Inzwischen läuft das wie am schnürchen nur mit den Timern habe ich immer wieder probleme.

Eine Statemaschine wertet z.B. den Öldruck Sensor eines Verdichters aus. Wenn der Verdichter gestartet ist dauert es ca 5s (soviel Zeit geben wir ihm derzeit) bis der Öldruck da sein MUSS.
Hier wird GAS Verdichtet kein ÖL. Wenn der Öldruck nicht da ist hat der Verdichter wohl ein defekt.

State 0
= Idle - warten auf Verdichter start, bei verdichter start zu state 1 und timer laden
State 1 = wait - warten bis timer abgelaufen dann zu State 2, zurück springen bei "verdichter aus" zu State 0.
State 2 = check - Verdichter läuft nun und der Öldruck muss da sein. Ist er ist nicht sprung zu State 3. Ansonsten Idlen und beim Verdichter stopp wieder in State 0 Springen.
State 3 = FehlerMeldung liegt an und bei Service Bestätigung wieder in State 0 Springen

Funktioniert Prima, bis auf den Timer. Der funktioniert beim ersten starten, aber beim 2ten mal bleib ich im state 1 hängen da der Timer nicht abläuft.

nochma zum ablauf des timers:
Wenn Verdichter gestartet wird lade ich schon im State 0 den Timer, im state 1 wird auf das ablaufen gewartet und im 2 und 3 ist er nicht mehr relevant.
Spring ich das 2te mal in State 0 und löse Verdichter start aus läd der Timer aus irgendeinem grund nicht.
Soll ich im State 0 vllt abfragen ob der Timer schonmal geladen wurde und ihn nur resetten?!
Also ganz schlau werd ich daraus nicht.

Was bewirkt den R T 1 und FR T 1 genau?
Ist bei FR der Timer dann wie beim ersten starten und beim R einfach "zwangs-abgelaufen"??

wär über eure hilfe sehr dankbar.


achso ich poste mal den State 0 dazu.
Code:
       L    #STATE_OIL                   // sprungerverteiler anfang
       SPL  err                          // error unterprogramm aufrufen
       SPA  OIL0                         // IDLE
       SPA  OIL1                         // WAIT
       SPA  OIL2                         // CHECK
       SPA  OIL3                         // FAIL
err   :NOP  1                            // sprungverteiler ende
       SPA  OILE

OIL0  :NOP  1                            // STATE 0 IDLE
       UN   E       124.0                // Abfrage ob Verdichter gestartet ist
       SPB  OILE                         // wenn nicht zum Ende der FSM springen und alles belassen
       SET
       L    1                            // Nächsten Starte Laden
       T    #STATE_OIL                   // In State Variable Laden
       SET
       R    T         1
       FR   T         1
       L    S5T#5S
       SS   T         1                  // wenn zeit abgelaufen geht Timer auf 1
       NOP  1
       NOP  1
       NOP  1
       SPA  OILE                         // Rausspringen
Hatte da schon einiges Probiert. Deshalb steht da jetzt auch R und FR drin und 2x SET
 
Hallo,
das Problem bei einem Timer (ganz generell) ist, dass er immer eine Ausschalt-Flanke mitbekommen möchte. Das kann er bei dir nicht, da er nach (ersten) Ablauf ja übersprungen wird. Du mußt den Timer außerhalb der bedingten Bearbeitung programmieren sodaß er immer mitläuft - dann gehts.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du mal auf KOP/FUP umstellst und dann links in der Liste den S_SEVERZ wählst und dann F1 drückst, dann bekommst Du eine Erklärung für die Parameter. Ich denke das Hauptproblem ist, dass in Deinem Gesamtprogramm (leider nicht erkennbar) der Timer nicht die ganze Zeit bearbeitet wird, deshalb fehlen ihm wahrscheinlich die nötigen Flanken.
Mit dem FR kenne ich mich nicht so gut aus (ich verwende den nie), aber ich schätze, dass die Flanke vom FR ausgwertet wird und er, wenn man ihn - so wie Du - auf Dauer-1 setzt, unwirksam wird.
 
Hallo,

Code:
       L    #STATE_OIL                   // sprungerverteiler anfang
       SPL  err                          // error unterprogramm aufrufen
       SPA  OIL0                         // IDLE
       SPA  OIL1                         // WAIT
       SPA  OIL2                         // CHECK
       SPA  OIL3                         // FAIL
err   :NOP  1                            // sprungverteiler ende
       SPA  OILE

OIL0  :NOP  1                            // STATE 0 IDLE
       UN   E       124.0                // Abfrage ob Verdichter gestartet ist
       SPB  OILE                         // wenn nicht zum Ende der FSM springen und alles belassen
       SET
 [COLOR="#ff0000"]S M_TimerSteuern[/COLOR]
       L    1                            // Nächsten Starte Laden
       T    #STATE_OIL                   // In State Variable Laden
       
       SPA  OILE                         // Rausspringen
.
.
[COLOR="#ff0000"]U M_TimerSteuern[/COLOR] [COLOR="Red"][/COLOR] //Außerhalb des Verteilers (SPL) Zeit ansteuern
[COLOR="#ff0000"]L S5T#5s
SE T1
U T1
= blabla
R  M_TimerSteuern
[/COLOR]


Zeiten in Sprungverteilern ist nicht das Wahre. Du bist genau einen Zyklus im State 0. Da ja sofort State 1 eingetragen wird ( L 1 T #STATE_OIL )

So ähnlich würd ichs machen.

PS: im Anhang der FR-Beitrag
 

Anhänge

  • fr.jpg
    fr.jpg
    275,1 KB · Aufrufe: 25
okey danke :)
Habt mir schon weiter geholfen. Zumindest fürs Verständniss.
Werde es morgen Mittag an der Hardware Testen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es hat funktioniert :)
warn klares verständniss Problem.
Meine jetzige Lösung:

Code:
    [COLOR=RoyalBlue] [/COLOR][COLOR=RoyalBlue] U    #timerstart
       L    S5T#5S
       SS   T         1
       NOP  1
       NOP  1
       NOP  1
       SET
       R    #timerstart[/COLOR]

       L    #STATE_OIL                   // sprungerverteiler anfang
       SPL  err                          // error unterprogramm aufrufen
       SPA  OIL0                         // IDLE
       SPA  OIL1                         // WAIT
       SPA  OIL2                         // CHECK
       SPA  OIL3                         // FAIL
err   :NOP  1                            // sprungverteiler ende
       SPA  OILE

OIL0  :NOP  1                            // STATE 0 IDLE
[COLOR=SeaGreen] [COLOR=RoyalBlue]      SET
       R    T         1[/COLOR][/COLOR]
       UN   E       124.0                // Abfrage ob Verdichter gestartet ist
       SPB  OILE                         // wenn nicht zum Ende der FSM springen und alles belassen
       L    1                            // Nächsten Starte Laden
       T    #STATE_OIL                   // In State Variable Laden
[COLOR=Lime] [COLOR=Blue]      SET
       S    #timerstart[/COLOR][/COLOR]
       SET
       SPA  OILE                         // Rausspringen

So Funktioniert die Test FSM nun, jetzt kann ichs in die Hauptsteuerung einpflegen :)
 
Zurück
Oben