Step 7 SCL Timer

BlueDogi

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

ich habe ein Proglem mit einer Einschaltverzögerung in SCL. Ich benutze dafür den Baustein SFB4. Das Programm ist für eine messe gedacht und soll eine Art Browsergame geben. Wo man über ein Panel eingaben geben kann. Die Einschaltverzögerung brauche ich um die Bauzeit eines Gebeudes nach zu stellen. Hier mein Code:
Code:
FUNCTION_BLOCK FB2
VAR_INPUT
    DBnr:Block_DB;
    Metalmiene_erweitern:BOOL;
    Kristalmine_erweitern:BOOL;
    Treibstoffmine_erweitern:BOOL;
END_VAR
VAR_TEMP

END_VAR
VAR
    m_bau_fertig:BOOL;
    m_Bauen:BOOL;
    k_bau_fertig:BOOL;
    k_Bauen:BOOL;   
    t_bau_fertig:BOOL;
    t_Bauen:BOOL; 
    zeit_fertig:BOOL;
    Timer1:SFB4;
    Timer2:SFB4;
    Timer3:SFB4;
    ZEIT:TIME;
END_VAR

IF Metalmiene_erweitern = 1 AND NOT k_Bauen AND NOT t_Bauen AND NOT m_Bauen AND
   DWORD_TO_DINT (DBnr.DD0) >= WORD_TO_DINT (DBnr.DW14) AND DWORD_TO_DINT (DBnr.DD4) >= WORD_TO_DINT (DBnr.DW16)  THEN
    DBnr.DD0:= DINT_TO_DWORD(DWORD_TO_DINT (DBnr.DD0) - WORD_TO_DINT (DBnr.DW14));
    DBnr.DD4:= DINT_TO_DWORD(DWORD_TO_DINT (DBnr.DD4) - WORD_TO_DINT (DBnr.DW16));
    m_bau_fertig:=0;
    ZEIT :=DINT_TO_TIME(DWORD_TO_DINT (DBnr.DD22));
    m_Bauen:=1;
END_IF;

IF Kristalmine_erweitern = 1 AND NOT m_Bauen AND NOT t_Bauen AND NOT k_Bauen AND
   DWORD_TO_DINT (DBnr.DD0) >= WORD_TO_DINT (DBnr.DW28) AND DWORD_TO_DINT (DBnr.DD4) >= WORD_TO_DINT (DBnr.DW30) THEN
    DBnr.DD0:= DINT_TO_DWORD(DWORD_TO_DINT (DBnr.DD0) - WORD_TO_DINT (DBnr.DW28));
    DBnr.DD4:= DINT_TO_DWORD(DWORD_TO_DINT (DBnr.DD4) - WORD_TO_DINT (DBnr.DW30));
    k_bau_fertig:=0;
    ZEIT :=DINT_TO_TIME(DWORD_TO_DINT (DBnr.DD36));
    k_Bauen:=1;
END_IF;

IF Treibstoffmine_erweitern = 1 AND NOT m_Bauen AND NOT k_Bauen AND NOT t_Bauen AND
   DWORD_TO_DINT (DBnr.DD0) >= WORD_TO_DINT (DBnr.DW42) AND DWORD_TO_DINT (DBnr.DD4) >= WORD_TO_DINT (DBnr.DW44) THEN
    DBnr.DD0:= DINT_TO_DWORD(DWORD_TO_DINT (DBnr.DD0) - WORD_TO_DINT (DBnr.DW42));
    DBnr.DD4:= DINT_TO_DWORD(DWORD_TO_DINT (DBnr.DD4) - WORD_TO_DINT (DBnr.DW44));
    t_bau_fertig:=0;
    ZEIT :=DINT_TO_TIME(DWORD_TO_DINT (DBnr.DD50));
    t_Bauen:=1;
END_IF;

Timer1(IN := m_Bauen ,PT := DINT_TO_TIME(DWORD_TO_DINT (DBnr.DD22))); 
m_bau_fertig := Timer1.Q;

Timer2(IN := k_Bauen ,PT := DINT_TO_TIME(DWORD_TO_DINT (DBnr.DD36))); 
k_bau_fertig := Timer2.Q;

Timer3(IN := t_Bauen ,PT := DINT_TO_TIME(DWORD_TO_DINT (DBnr.DD50))); 
t_bau_fertig := Timer3.Q;

IF m_bau_fertig =1 THEN
    DBnr.DW12:= INT_TO_WOrD(WORD_TO_INT(DBnr.DW12) + 1);
    DBnr.DW14:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW14))*2.3));
    DBnr.DW16:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW16))*2.3));
    DBnr.DW20:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW20))*1.75));
    DBnr.DD22:= REAL_TO_DWORD(DWORD_TO_REAL (DBnr.DD22)* 1.3);
    m_Bauen:= 0;
    m_bau_fertig :=0;
ELSIF k_bau_fertig =1 THEN
    DBnr.DW26:= INT_TO_WOrD(WORD_TO_INT(DBnr.DW26) + 1);
    DBnr.DW28:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW28))*2.4));
    DBnr.DW30:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW30))*2.2));
    DBnr.DW34:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW34))*1.75));
    DBnr.DD36:= REAL_TO_DWORD(DWORD_TO_REAL (DBnr.DD36)* 1.3);
    k_Bauen:= 0;
    k_bau_fertig:=0;
ELSIF t_bau_fertig =1 THEN
    DBnr.DW40:= INT_TO_WOrD(WORD_TO_INT(DBnr.DW40) + 1);
    DBnr.DW42:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW42))*2.2));
    DBnr.DW44:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW44))*2.3));
    DBnr.DW48:= INT_TO_WORD(REAL_TO_INT(INT_TO_REAL(WORD_TO_INT(DBnr.DW48))*1.7));
    DBnr.DD50:= REAL_TO_DWORD(DWORD_TO_REAL (DBnr.DD50)* 1.3);
    t_Bauen:= 0;
    t_bau_fertig:=0;
END_IF;

    

END_FUNCTION_BLOCK

Das Problem ist jetzt das der Timer sofort durchschaltet. Bei PT:= ... Frage ich in meinem DB ein Wert ab mit dem Format TIME.

Vielen Dank schonmal.:D
 
Bliebe jetzt natürlich noch die Frage zu klären was "sofort" ist, und womit du dieses "sofort" festgestellt hast.

Wenn ich jetzt mal unterstelle, das in DBnr.DD22 was "sinnvolles" steht,
desweiteren unterstelle, das du eine relativ alte Version von PLCSim verwendest,
dann wäre dieses Verhalten unter Umständen unbedenklich.

Die älteren PLCSim Versionen konnten Sachen wie den SFB4 nämlich nicht funktionieren, mit eben den von dir beschriebenen Ergebnis.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Ich habe PLCsim benutzt V5.3 SP1 wenn dir das was sagt. festgestellt habe ich das in dem keine Zeit abläuft. Genau gesagt wird in einem Zyklus z.B. Metalmiene_erweitern betätigt und m_Bauen an dem Timer1 aktiv. im nächsten Zyklus schaltet dan m_bau_fertig durch.
 
Zurück
Oben