TIA TP Impuls in SCL

Neurorancer

Level-2
Beiträge
580
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

habe ein Problem mit dem Impuls.

Wenn ich als Signalquelle einen Taster (taster_1) nehme,
dann läuft alles. Wenn ich als Quelle jedoch einen Merker von Typ bool
nehme, dann wird der timer nicht aktiviert obwohl der Merker auf High ist.

Gibt es da eine Besonderheit was man beachten muss?


Code:
"tmr1".TP(IN:="taster_1",
              PT:=T#5S);
    
    IF "tmr1".Q = true THEN
        #u1_start_satz_1 := 1;
        #u2_start_satz_1 := 1;
    ELSE
        #u1_start_satz_1 := 0;
        #u2_start_satz_1 := 0;
    END_IF;


Hier der Quellcode mit dem Merker #start_tmr

Code:
#start_tmr := true;
    "tmr1".TP(IN:=#start_tmr,
              PT:=T#5S);
    
    IF "tmr1".Q = true THEN
        #u1_start_satz_1 := 1;
        #u2_start_satz_1 := 1;
    ELSE
        #u1_start_satz_1 := 0;
        #u2_start_satz_1 := 0;
    END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mein Ziel ist es einen Merker für eine kurze Zeit auf high zu setzen und dann wieder rücksetzen. Alse kurz einen high pegel erzeugen. Deswegen habe ich mir gedacht, dass man das mit TP lösen kann. Das heißt ich muss den Merker tmr1 einmal reseten damit TP aktiviert wird, ja?
 
Naja ... wenn "kurz" auch ein Zyklus sein kann dann gäbe es da auch noch andere Wege als einen TP zu nehmen.
Soll dein Impuls aber tatsächlich 5 s lang sein so würde ich einen TON nehmen und den "Merker" solange zuweisen wie myTON.Q nicht TRUE ist ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!

Einfach nach dem ersten Aufruf des TP die Startvariable wieder "false" setzen und den Aufruf des TP nochmal ausführen.

So wird der Timer gestartet und die Instanz erhält danach die Rückmeldung, dass der Starteingang wieder "false" ist.
Beim nächsten Aufruf wird der Startmerker dann wieder "true" gesetzt, die Instanz bekommt das mit, startet die Zeit und es geht wie oben beschrieben weiter.

Ich weiss aber nicht, was ein TP der ständig neu gestartet wird bringen soll.

Gruß,

Ottmar
 
Vielleicht habe ich mich falsch ausgedrückt. Ich möchte einen Kurzen Impuls High->Low erzeugen und das einmalig
um eine Hardware zu starten.

(Der Impuls soll einmalig erfolgen, das werde ich softwaremäßig lösen. )

Einfach mit Setzen und Rücksetzen des Ausganges klappt es nicht, da es dann viel zu kurz ist.
Wie kann man denn den High-Pegel über eine Bestimmte Zeit halten?

Ich programmiere in SCL. Gibt es da evtl eine Funktion?
 
... dann mach es doch so, wie von mir in Beitrag #4 beschrieben ... dann mußt du auch nichts um den Timer herum-programmieren ...
In SCL gibt es im Grunde die gleichen Functionen wie in AWL ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte einen Kurzen Impuls High->Low erzeugen und das einmalig
um eine Hardware zu starten.

(Der Impuls soll einmalig erfolgen, das werde ich softwaremäßig lösen. )
Klingt so nach Erzeugen des Impulses beim Programmstart.
Wenn ja, dann:
1. Im OB100 einen Merker setzen.
2. In einem Netzwerk des OB1 bzw. von dessen untergeordneten Bausteinen diesen Merker zum Starten eines Nachlauftimers TOF bzw. einer Auschaltverzögerung S_AVERZ benutzen.
3. In einem erst darauf folgendem Netzwerk den Merker rücksetzen.

So läuft der Timer nur einmal beim (Neu-) Start der SPS.
Bei neueren CPUen, wie S7-1200 oder S7-1500 gibt es für diesen Merker bereits ein Systemmerkerbit ("FirstScan"), welcher automatisch nur im 1. Zyklus HIGH ist. Dann kann man sich 1. und 3. sparen.


Wenn der Start des SPS-Programms zu früh für den Reset-Impuls für die andere Hardware ist, dann die Impulsausgabe verzögern. Der obige TOF stellt dabei die Verzögerung dar.
4. Mit der negativen Flanke des Ausgangs des ersten TOF einen 2. für die Impulsausgabe starten.



PS: Mit SCL fallen logischerweise die Netzwerke weg, aber sonst das gleiche Vorgehen:
Einmalig den Merker setzen, TOF starten, Merker rücksetzen.
 
Zuletzt bearbeitet:
Übrigens sollte Dein Merker-Code aus dem Eröffnungs-Post funktionieren, wenn Du den Merker erst nach dem Timer setzt.
Dann ist der Merker im ersten Zyklus noch LOW und der TP kann im nächsten Zyklus die LOW-HIGH-Flanke feststellen und den Impuls starten:

Code:
    "tmr1".TP(IN:=#start_tmr, PT:=T#5S);
    
    #u1_start_satz_1 := "tmr1".Q;                  // bei Bool oder
    #u2_start_satz_1 := Bool_to_Int( "tmr1".Q );   // z.B. bei INT-Zahlenwert

    #start_tmr := TRUE;
(Das IF-Gewurstel ist m.M.n. auch etwas umständlich, deshalb hab' ich's mal mit eingekürzt. ;))
 
Naja ... wenn "kurz" auch ein Zyklus sein kann dann gäbe es da auch noch andere Wege als einen TP zu nehmen.
Soll dein Impuls aber tatsächlich 5 s lang sein so würde ich einen TON nehmen und den "Merker" solange zuweisen wie myTON.Q nicht TRUE ist ...

Gruß
Larry


ich möchte nochmal nachfragen was die anderen Wege sind (oder ist es der beschriebene?). Ich hab ein ähnliches Problem. Ich möchte nach dem Vergleich einer Rückmeldung (String) einen Bausteinausgang für 250ms high setzen. Ich bekomm das mit dem TP im TIA (SCL) einfach nicht hin.
Vielleicht kann mir wer weiterhelfen.

Hab das in etwa so gedacht:
Code:
If x = 'xyz' then
m100.0 := true
   "IEC_Timer_0_DB".TP(IN:=_m100.0,
                            PT:=T#250ms,
                            Q=>#O_Ok);                           );
EndIf;

Kann mir hier jemand mit dem imaginären Prügel ein wenig Wissen in meinen Kopf prügeln?
Immer das gleiche mit den Anfängern - Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Merke 1: Timer niemals bedingt (IF) aufrufen, sondern immer. Weil sie sonst die Flanke an IN nicht mitkriegen und die Zuweisung Q=> nicht mehr ausgeführt wird.
Merke 2: Wertzuweisungen möglichst nicht in If-Konstrukten (entspricht "S" oder "R") sondern in immer berechneten Ausdrücken (entspricht "=")
Code:
If x = 'xyz' then
  m100.0 := true; [COLOR="#0000FF"]//der muß auch irgendwo wieder auf false rückgesetzt werden![/COLOR]
EndIf;

"IEC_Timer_0_DB".TP(IN:=m100.0, PT:=T#250ms, Q=>#O_Ok);
oder
Code:
m100.0 := (x = 'xyz');

"IEC_Timer_0_DB".TP(IN:=m100.0, PT:=T#250ms, Q=>#O_Ok);

Harald
 
Probiere mal:

Code:
If x = 'xyz' Then
   M100.0 := True;
Else
   M100.0 := False;
End_if;

"IEC_Timer_0_DB".TP(IN := M100.0, PT := T#250ms, Q => #O_Ok);

Auf jeden Fall den Timer außerhalb der If-Anweisung schreiben, denn der Timer sollte sinnvoller Weise immer von der SPS bearbeitet werden.
 
Zurück
Oben